Compare commits

...

256 Commits

Author SHA1 Message Date
Ashcon Partovi
147826d93c Add todoIf, fixme, and fixmeIf to bun:test 2024-02-21 17:16:04 -08:00
Ashcon Partovi
c0a2073dd5 Read .env file in .vscode/launch.json 2024-02-21 16:17:48 -08:00
Jarred Sumner
a0be3cb2ff Slightly reduce code duplication in expect (#9018)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-20 18:58:33 -08:00
dave caruso
5c6b9ea9b6 change how bunx caches things (#8921)
* some things

* yeah

* ok

* fix compilation error

* fix on windows

* ok

* username
2024-02-20 18:58:12 -08:00
Eemeli Palotie
48e7c0fb8e fix: install vendored node_modules when using hardlinks (#9007)
* fix: install vendored node_modules when using hardlinks

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-02-19 22:50:24 -08:00
Zack Radisic
2656418e50 Don't immediately delimit command substitution result (#9005) 2024-02-19 21:26:50 -08:00
Zack Radisic
7056384702 Fix file redirect stdin not working (#9000)
* 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>
2024-02-19 14:56:32 -08:00
Meghan Denny
5712ba8b3b debug: introduce bun.callmod_inline (#9001) 2024-02-19 14:43:42 -08:00
dave caruso
6f1939621c fix astro (#8999)
* fix astro

* set undefined

* [autofix.ci] apply automated fixes

* Fix astro

* Fix test

* Remove bad assertion

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-19 13:48:08 -08:00
Yannik Schröder
182d052d4b events.on: Add compatibility with readline module (#8885)
* fix: make event.on work with for...await of readline module

* fix: queueing events before next() call and multiple event vals

* test: add tests for events.on and readline for await...of

* style, docs

* [autofix.ci] apply automated fixes

* refactor: use removeListeners instead of check for done

* test: merge test files

* test: remove todo comment

* [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>
2024-02-19 11:44:09 -08:00
Jarred Sumner
42d15ea853 Fixes #8964 (#8978)
* Fixes #8964

* Fix test.each when used with test.only

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-19 10:36:08 -08:00
Jarred Sumner
7407080628 Bump 2024-02-19 10:28:05 -08:00
Jarred Sumner
7ec9ad5cb7 Add test for #7864 (#8997)
* Add test for #7864

* Add napi-rs/canvas

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-19 10:27:12 -08:00
Meghan Denny
141140ef7c windows: pass more tests (#8938)
* 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>
2024-02-19 10:23:31 -08:00
Cameron Haley
8c7972fdc8 Don't rely on stored napiRef; Always create a new one in napi_create_reference (#8995) 2024-02-19 09:07:15 -08:00
Jarred Sumner
80e4712662 Skip sqlite math fns test on macOS 2024-02-18 12:08:17 -08:00
3λiȯ+
3221bfeeb7 docs: Fix unclosed code block in the example for WebSocketHandler (#8971) 2024-02-17 18:11:22 -08:00
Dale Seo
89641f2e4a chore: add types for date mocking api of jest (#8387) 2024-02-17 08:05:16 -08:00
Risu
bc74154536 docs: use consistent tsconfig for both in docs and bun init (#8953) 2024-02-17 08:04:03 -08:00
Jarred Sumner
a6acb257c1 Fixes #8940 (#8957)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-17 05:48:36 -08:00
Risu
c34bbb2e3f fix: organize tsconfig (#8654)
* fix: organize tsconfig

* fix: remove unnecessary comments in tsconfig

* docs: revert changes on comments and md text

* docs: fix case
2024-02-16 22:19:31 -08:00
Jarred Sumner
f9b12300d4 Make shell errors slightly better (#8945)
* Make shell errors slightly better

* Update shell.ts

* Fix the failing tests

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-16 20:43:42 -08:00
Jarred Sumner
abf1239976 feat: Support async generator functions in Response and Request for bodies (#8941) 2024-02-16 20:02:22 -08:00
argosphil
e2c92c69b5 fix: make sure Bun.sleep(Date) doesn't resolve prematurely (#8950)
* 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>
2024-02-16 18:32:37 -08:00
Tony Zhang
135de4dff7 fix(sqlite): enable math functions (#8944)
* fix(sqlite): enable math functions

* fix(sqlite): enable math function flag in CMakeLists

* test: add math function tests

---------

Co-authored-by: Georgijs <48869301+gvilums@users.noreply.github.com>
Co-authored-by: John-David Dalton <john.david.dalton@gmail.com>
2024-02-16 18:24:55 -08:00
Dmitri
fe8ec29f1f Add fs.exists[util.promisify.custom] (#8936)
* 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>
2024-02-16 18:24:04 -08:00
Ashcon Partovi
27eed543ef Add .env to .gitignore 2024-02-16 14:13:19 -08:00
John-David Dalton
17e01a284b Add url unit tests with failing tests TODO commented-out (#8933)
Co-authored-by: Georgijs <48869301+gvilums@users.noreply.github.com>
2024-02-16 11:32:08 -08:00
Zack Radisic
2b56451a11 Shell changes/fixes (#8846)
* 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>
2024-02-16 05:01:55 -08:00
Zack Radisic
0e2a3a0197 fix(glob): fix patterns starting with * #8817 (#8847)
* Fix #8817

* [autofix.ci] apply automated fixes

* yoops

* fix broken stuff from merge

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-02-16 04:12:12 -08:00
Zack Radisic
ebaeafbc89 feat: More robust and faster shell escaping (#8904)
* wip

* Proper escaping algorithm

* Don't use `$` for js obj/string referencs

* [autofix.ci] apply automated fixes

* Changes

* Changes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-02-16 04:09:34 -08:00
Meghan Denny
2b335d72e7 windows: make websocket-client.test.ts pass (#8935) 2024-02-16 04:07:06 -08:00
guest271314
dcda49a271 Missing toWeb (#8937)
https://github.com/oven-sh/bun/issues/3927
2024-02-15 21:41:46 -08:00
John-David Dalton
d49cb0b98e chore: Add PrivateRecursive type annotations (#8291) 2024-02-15 17:35:08 -08:00
dave caruso
bb31e768de docs: update windows build instructions
this removes the WSL codegen step as it is no longer supported, and some other notes i am aware of now
2024-02-15 16:54:03 -08:00
Jake Gordon
099825e5ac Common HTTP server usage guide (#8732)
Co-authored-by: Georgijs <48869301+gvilums@users.noreply.github.com>
2024-02-15 16:30:59 -08:00
Henrikh Kantuni
fc05cbfedc Fix typo (#8930)
"Buns supports" → "Bun supports"

Co-authored-by: John-David Dalton <john.david.dalton@gmail.com>
2024-02-15 16:20:55 -08:00
argosphil
c920919c42 fix: distinguish getters and setters in Bun.inspect() (#8858)
* 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>
2024-02-15 13:09:13 -08:00
Georgijs
da78103b1c fix typo (#8929) 2024-02-15 13:07:07 -08:00
dave caruso
a2ae984c3e disable some tests that are failing in ci (#8922)
* 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>
2024-02-15 07:09:44 -08:00
Jarred Sumner
151512dcc9 Release weak refs before responding to websocket messages (#8898)
* Release weak refs before responding to websocket messages

* Yes

* Wrap the methods instead of the callers

* oops

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-15 07:09:10 -08:00
Toby Cm
1b945ba2ef fix: Update URL in non-avx warning message (#8435)
`https://github.com/oven-sh/bun/release/bun-v1.0.25/bun-linux-x64-baseline.zip`

->

`https://github.com/oven-sh/bun/releases/download/bun-v1.0.25/bun-linux-x64-baseline.zip`
2024-02-15 03:57:22 -08:00
dave caruso
e8dff7b029 chore: random acts of cleanup to tests (#8915)
* 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>
2024-02-14 22:40:50 -08:00
Jarred Sumner
d936f365c8 Fixes #8909 (#8911)
* Fixes #8909

* Add it

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-14 18:57:20 -08:00
Jarred Sumner
48c0d7aadc Fix incorrect type definition in usockets loop (#8912)
* Fix incorrect type definition

* Remove dead code

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-14 18:57:07 -08:00
dave caruso
cf054456ce fix build on all platforms 2024-02-14 18:38:20 -08:00
Jarred Sumner
57b1e545f8 This debug code should not have been committed 2024-02-14 18:36:24 -08:00
Meghan Denny
12f83cf48b make V8StackTraceIterator frame parser more robust (#8814)
* make V8StackTraceIterator frame parser more robust

* remove StringView_count and only call StringView::find as many times as we need
2024-02-14 18:25:30 -08:00
Lei
b0f9e03230 Fix coverage.md (#8864)
See lines 264/271 of bunfig.zig
2024-02-14 18:20:37 -08:00
argosphil
7481a29f4e fix: brotli decompression's multi-packet case (#8881)
* fix: reset buffer pointer (misleadingly named total_in) for brotly

Fixes #8017

* fix: panic if brotli decompressor misbehaves
2024-02-14 18:19:46 -08:00
argosphil
0714b3a06b fix: throw on gunzipSync/inflateSync error (#8901)
* 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
2024-02-14 18:01:05 -08:00
Dylan Conway
08c2148000 fix(windows): console-iterator.test.ts fix (#8879)
* fix console iterator tests on windows

* rename and size only when bytes is active

* assert size > 0
2024-02-14 17:59:19 -08:00
James Anderson
00cc2eae67 Fix tsconfig path longest prefix matching (#8892) 2024-02-14 08:23:45 -08:00
Dylan Conway
82a07430ed fix(windows): use allocated memory for \\\\.\\NUL replacement on windows (#8889)
* use allocated memory for /dev/null

* deinit
2024-02-13 22:23:54 -08:00
Georgijs
636a8f1f0a Prevent open but inactive http connections from keeping alive http server (#8829)
* unref uv handle after creating uws socket

* unref sockets between http requests to allow the event loop to exit

* remove stale comment
2024-02-13 22:22:44 -08:00
7f8ddd
05d33c39cd fix: Add charset to text/css mime type (#8825)
* Add charset to text/css mime type

Standard: https://www.iana.org/assignments/media-types/text/css

More info: https://stackoverflow.com/questions/70643383/which-mime-types-contain-charset-utf-8-directive

Fixes the warning in Edge that says to include utf-8 when Bun returns a stylesheet.

* Add test

* Change "content type" to "mime-type"
2024-02-13 20:47:02 -08:00
dave caruso
aba37525a6 windows: fix bundler reliability and nuke WSL-based codegen scripts (#8890)
* bruh

* yeaaahhhhhhhhhhhhhhhhhhhhhhhhhhh

* revisions

* yeah

* fix

* make no codegen do less things
2024-02-13 20:33:24 -08:00
dave caruso
04a6ebaa17 fix: allow opening win32 device files in node:fs and bun.file (#8801)
* support opening device files in node:fs and bun.file

* tidy tests

---------

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-02-13 18:24:14 -08:00
Augie
7405c5a615 feat: make curl install script run the windows installer (if run through cygwin) (#8875)
This updates the *nix install script to run the Windows Powershell install script if it detects it's on Windows.
2024-02-13 11:35:17 -08:00
Jarred Sumner
d0903f6b71 Cherry-pick 570fe762c8 (#8830)
This cherry-picks 570fe762c8

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: dave caruso <me@paperdave.net>
2024-02-13 10:58:27 -08:00
Ciro Spaciari
d0b6218bdf fix(fetch) redirects bodies should be handled (#8874)
* redirects bodies should be handled

* [autofix.ci] apply automated fixes

* Update src/http.zig

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: Jarred Sumner <jarred@jarredsumner.com>
2024-02-12 21:14:00 -08:00
Meghan Denny
8afcb39055 windows: more tests are passing (#8873) 2024-02-12 17:52:14 -08:00
Meghan Denny
b2a697f264 scripts/codegen.ps1: update wsl call (#8871) 2024-02-12 16:46:26 -08:00
Zack Radisic
aca936515a Make glob work for windows (#8382)
* Fix some related to paths and string encoding

* Fix relative paths with glob

* Fix scan tests

* Fix glob scan test

* [autofix.ci] apply automated fixes

* Fix leak test

* clean up post merge

* [autofix.ci] apply automated fixes

* clean up glob getcwd

* remove old struct

* fix open on posix

* feat: Add win32 path.toNamespacedPath and align rest of node:path with Node (#8469)

* restore zls file change

* [autofix.ci] apply automated fixes

* switch to using fs.top_level_dir in glob

---------

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: Georgijs Vilums <georgijs.vilums@gmail.com>
Co-authored-by: Georgijs Vilums <georgijs@bun.sh>
Co-authored-by: John-David Dalton <john.david.dalton@gmail.com>
Co-authored-by: Georgijs <48869301+gvilums@users.noreply.github.com>
2024-02-12 16:30:58 -08:00
Zack Radisic
6ba146c3e0 Run zig fmt 2024-02-12 17:40:36 -06:00
Georgijs
a80b3569b4 disable quiet logs when BUN_DEBUG_LOG is set to 0 (#8866) 2024-02-12 15:20:38 -08:00
argosphil
8b5cac1ea1 chore: use shell-independent globbing in bun run fmt:zig (#8861)
* fix: use shell-independent globbing in bun run fmt:zig

* Erase experimental creature escaped from @paperdave's lab.

See https://github.com/oven-sh/bun/pull/8861#discussion_r1485747297
2024-02-12 14:51:39 -08:00
John-David Dalton
96e7227087 feat: Add win32 path.toNamespacedPath and align rest of node:path with Node (#8469) 2024-02-12 14:27:26 -08:00
Dale Seo
f88855da4f docs: non-null assertion is needed on document.getElementById (#8540) 2024-02-11 20:10:17 -08:00
Ujjwal gupta
19cb3ab6ff fix: ws.publish() not working (#8855)
* fix: ws.publish() not working

* fixes
2024-02-11 13:56:06 -08:00
argosphil
862d35d832 fix: bun test -t (#8845) 2024-02-11 08:39:27 -08:00
argosphil
a0bcd0f946 Fix expect().toBeGreaterThan() not throwing when ANSI is disabled (#8838) 2024-02-10 14:00:16 -08:00
guest271314
2264bb3d04 Substitute js/ for test/js/ (404) (#8808) 2024-02-10 10:44:22 -08:00
Ciro Spaciari
3e1231deb4 fix(crypto) fix KeyObjectkey handling (#8824)
* ref/deref buffer

* Clean up this code

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-09 21:14:35 -08:00
dave caruso
dfcac563bc fix error message in bun.serve (#8828)
* fix error message in bun.serve

* ok
2024-02-09 17:24:46 -08:00
Ciro Spaciari
90fd322b5c fix timer tests (#8804) 2024-02-09 14:00:47 -08:00
Zack Radisic
f77b217abf Correct shell docs for $.escape() 2024-02-09 11:41:59 -06:00
Risu
7c2be6a877 Fix bun-types/index.d.ts (#8802) 2024-02-09 08:46:42 -08:00
Dylan Conway
a3c3dad351 wrap (#8812) 2024-02-09 03:42:03 -08:00
Travis Cooper
98b438d0a4 Update bunfig.md (#8807) 2024-02-09 01:54:00 -08:00
cirospaciari
58d22b063c Unmark tests that are now passing on Windows 2024-02-08 23:02:32 -03:00
Ciro Spaciari
8cd1db9cda [windows] fix crypto (#8797)
* fix password

* refactor

---------

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-02-08 18:00:22 -08:00
dave caruso
2d7df726fd fix: get bun build working on window (#8712)
* 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>
2024-02-08 17:56:26 -08:00
Ashcon Partovi
1ccf0c2e9c Fix some errors not showing up in GitHub annotations (#8799)
* 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>
2024-02-08 17:52:58 -08:00
cirospaciari
db85e04ade Unmark tests that are now passing on Windows 2024-02-08 22:19:31 -03:00
Ciro Spaciari
c2936b205d [windows] fix(fetch) file:///, keepalive and tests on Windows (#8784)
* fix file:/// on windows

* skip fifo test

* fix keepalive

* fixes

* avoid std.os.getcwd on POSIX
2024-02-08 17:11:06 -08:00
dave caruso
8680641c23 make process.test.js pass (#8798) 2024-02-08 16:54:09 -08:00
Ciro Spaciari
e77db8ebac [windows] fix which (#8791)
* fix which

* [autofix.ci] apply automated fixes

* refactor

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-02-08 15:44:56 -08:00
Steven Roussey
dfbedd6a10 fix: flaky test (#8796)
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.
2024-02-08 15:17:14 -08:00
Ashcon Partovi
8624a86eba Unmark tests that are now passing on Windows 2024-02-08 13:42:13 -08:00
Georgijs
bfc6091faf correctly unblock all signals (#8792) 2024-02-08 12:09:33 -08:00
Joe
9d0a88ab82 docs: quick note on dependencies for C++ (#8772)
* quick note on dependencies for C++

* note Ubuntu C++ standard lib issue and anchor link to troubleshooting

* clarify ubuntu distros
2024-02-08 11:18:37 -08:00
Jarred Sumner
2f8f77eeb7 Ignore panic in reload (#8778)
* Ignore panic in reload

* Use

* Update c-bindings.cpp

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-08 00:29:08 -08:00
Steven Roussey
7b6e0f7164 fix: Increase max depth of expect diffs (#8771)
Fix Issue #6519
2024-02-07 16:07:20 -08:00
Ciro Spaciari
5df59cb02b [windows] fix(fs.watch) (#8746)
* clean fixes

* [autofix.ci] apply automated fixes

* more tests passing

* EPERM instead of AccessDenied

* [autofix.ci] apply automated fixes

* fix test on windows

* cleanup

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-02-07 15:44:07 -08:00
Jarred Sumner
b61282e290 Fix async module mocking (#8769)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-07 15:40:10 -08:00
Dylan Conway
dd3227c436 fix: crash in release builds (#8773)
* zig

* unreachable

* more comment
2024-02-07 15:38:14 -08:00
Georgijs
a9a4bbcd24 remap 0.0.0.0 to localhost on windows (#8770) 2024-02-07 15:17:24 -08:00
Georgijs
55aa35ee35 Fix watch attempting to reuse ports that are not yet released by the old process (#8764)
* windows watcher start new process only after previous terminated

* simplify env setup in spawnWatcherChild
2024-02-07 15:11:28 -08:00
dave caruso
a99459ffdc fix: symlinked files as entry points do not show Bun.main (#8762) 2024-02-07 13:06:11 -08:00
Jake Gordon
08f957d33b fix glob example to be recursive as stated (#8755) 2024-02-07 12:53:28 -08:00
Georgijs
2bd4fe578e Make HTTP shutdowns more robust, speed up connection to localhost (#8730)
* 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>
2024-02-07 12:19:41 -08:00
Georgijs
d672309547 c-ares dns on windows (#8737)
* c_ares dns on windows works

* handle errors

* fix invalid hostnames test
2024-02-07 16:26:53 -03:00
argosphil
e171f04ce6 Fix ref-counting of Bun.file(0) etc. (#8687) (#8741)
* Test for #8687

* Fix reference counting of Bun.file(0) etc. (#8687)

Fixes #8687.
2024-02-06 18:11:25 -08:00
Ciro Spaciari
651d5699a0 [windows] fix(fs.watchFile) (#8735)
* fix fs.watchFile

* oopsie

* fix bigint and persistent

* use repeat to make watchFile tests more reliable

* [autofix.ci] apply automated fixes

* follow the pattern

* add increment

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-02-06 18:10:28 -08:00
Meghan Denny
d0d4d8bf85 windows: enable more passing tests (#8711)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-02-06 16:08:49 -08:00
Ciro Spaciari
53814dda00 [windows] fix(http2) (#8734)
* fix win http2

* add includes

* cleanup

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-02-06 15:37:39 -08:00
Meghan Denny
d3d5c7a1d6 tidy: access env map through getter rather than direct field (#8716) 2024-02-06 11:25:45 -08:00
Jarred Sumner
972a7b7080 skip some tests 2024-02-05 19:51:08 -08:00
Jarred Sumner
e3759bbbfe Update bun-windows.yml 2024-02-05 18:46:18 -08:00
Jarred Sumner
f722236978 [windows] Make child_process.spawn not say "TODO: IPC" when IPC isn't used 2024-02-05 17:39:47 -08:00
dave caruso
e366921e90 fix(windows): make fs.symlink normalize forward slashes to backslashes (#8710)
* fix fs.symlink()

* update comment

* .

* add todo
2024-02-05 16:09:50 -08:00
Georgijs
bd2779b029 Fix --hot with empty file, make --hot faster on windows (#8708)
* reduce watcher timeout in windows, fix hot reload with empty files

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-02-05 14:40:18 -08:00
Ashcon Partovi
a05ef0aeb1 Remove unintentional commit
This reverts commit 23b292ac21.
2024-02-05 12:50:09 -08:00
Ashcon Partovi
264142e756 Add isWindows and related helpers to test harness 2024-02-05 12:47:52 -08:00
Ashcon Partovi
51def5f5d6 Use biome in bun-types 2024-02-05 12:22:39 -08:00
Ashcon Partovi
23b292ac21 T 2024-02-05 12:22:39 -08:00
dave caruso
48ed1dfb65 less (#8651)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-02-05 10:06:23 -08:00
Drake Semchyshyn
bd4d0d15db Update plugins.md (#8674)
Updated Custom Plugins section (Svelte) so that the import name, and the name that was used, matches each other.
2024-02-04 01:19:00 -08:00
Jarred Sumner
1f0c1c81e9 Fix test 2024-02-04 00:42:40 -08:00
Jarred Sumner
e93eb6c1ab Add event loop debug assertion for Promise.resolve() and Promise.reject() 2024-02-04 00:03:45 -08:00
Jarred Sumner
1009b07807 Implement server.unref() and server.ref() (#8675)
* Implement server.ref() and server.unref()

* Update dns_resolver.zig

* Update server.zig

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-03 23:57:34 -08:00
Georgijs
1a695f13bf Async file copying on windows (#8649)
* rework and simplify file opening in windows

* fix tests

* symlink tests pass

* update error handling

* remove outdated normalization check

* fix mac build

* apply suggested fixes

* fix path tests

* remove debug print

* fix windows compile
2024-02-03 22:33:35 -08:00
Jarred Sumner
c75e768a6c Assert we drained the microtask queue since the last time we called into JavaScript (#8646)
* 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>
2024-02-03 07:40:15 -08:00
Dylan Conway
7d86f9e590 fix(test): strict equals and deleted properties (#8663)
* deleted properties size

* dont need count if structure id is eql

* more test

* fix slow path

* oops forgot this
2024-02-03 06:35:13 -08:00
Dylan Conway
a8600b0878 upgrade 2024-02-03 06:20:24 -08:00
Dylan Conway
5b228256f9 method and comment 2024-02-03 04:24:20 -08:00
Dylan Conway
ba4daee7e5 fix: statement joining and tmpdir on windows (#8659)
* drive letter

* joinwithcomma bundle

* tmpdir update

* same order as os.tmpdir
2024-02-03 04:17:12 -08:00
Jarred Sumner
2c0c562d1d Fixes #4746 (#8661)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-02-03 03:38:59 -08:00
Jarred Sumner
683a03d8c7 Set a default value for Error.prepareStackTrace to align with Node (#8657)
* Set a default value for `Error.prepareStackTrace` to align with Node

* Ensure we never set negative line/column numbers in error.stack (#8656)

* fix(windows): fix macros (#8653)

* fix macro tests

* path format options

* remove failing comment

* fix buffer toString memcpy length

* Ensure we never set negative line/column numbers in error.stack

---------

Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
2024-02-03 02:04:58 -08:00
Dylan Conway
e0c0fe235a fix(windows): fix macros (#8653)
* fix macro tests

* path format options

* remove failing comment

* fix buffer toString memcpy length
2024-02-03 00:35:25 -08:00
Jarred Sumner
d16ac87347 Export compile_commands.json 2024-02-02 23:25:07 -08:00
Dylan Conway
5934b17f00 fix(windows): fix a few more tests (#8644)
* fix regression tests

* fix fs.test.ts bigintstats

* enable transpiler cache lol

* remove failing

* fix filesystem router

* update

* fix run-unicode test

* update comment

* add updated snapshot

* fix remaining node-module-module tests

* fixup

* [autofix.ci] apply automated fixes

* fix tty tests

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-02-02 18:58:16 -08:00
Ashcon Partovi
eedf008c80 Fix formatting not always working 2024-02-02 14:25:53 -08:00
Meghan Denny
3a6318b67c windows: fix module.paths getter causing a crash (#8633)
* windows: fix module.paths getter causing a crash

* use the buffer that was there before
2024-02-02 01:29:50 -08:00
dave caruso
647b15e4f3 fix(windows): initialize uv allocators earlier (#8631)
* 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>
2024-02-02 00:18:28 -08:00
ふかねこ
625b172a71 docs: Update binary-data.md (#8635)
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).
2024-02-02 00:16:14 -08:00
Meghan Denny
4959c7d363 remove ZigString.Slice.from .init is the exact same thing (#8632)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-02-01 20:35:47 -08:00
Meghan Denny
8808437a02 meta: remove remaining references to prettierrc.cjs (#8634) 2024-02-01 19:24:17 -08:00
Tiramify (A.K. Daniel)
330a4744de chore: fix compiling fd.zig on linux (#8630) 2024-02-01 17:31:54 -08:00
Ashcon Partovi
3a1229d03d Add mysql2 integration test (#8075) 2024-02-01 15:04:49 -08:00
Ashcon Partovi
63a9a8b015 Improve .vscode extensions, tasks, and configuration (#8511) 2024-02-01 14:55:35 -08:00
dave caruso
f73bde79c7 fix(debug): get the result for fd debug message before we close it (#8626) 2024-02-01 14:26:20 -08:00
Meghan Denny
3a7df3f6c7 windows: add more passing test (#8615) 2024-02-01 13:45:47 -08:00
dave caruso
0037dc2537 chore: update webkit 2024-02-01 13:38:09 -08:00
ふかねこ
c0fe042102 Update binary-data.md (#8619)
Binary notation ("0b") is appropriate instead of hexadecimal notation ("0x").
2024-02-01 12:38:54 -08:00
Andres Guarneros
ce1eba1954 Update quickstart.md (#8622)
Update index.ts code snippet for consistency in quickstart.md.
2024-02-01 12:38:21 -08:00
Dylan Conway
8191fbd970 fix: id instead of path (#8617)
* use id

* another path
2024-02-01 02:19:18 -08:00
Dylan Conway
2af7cdedc2 path should be dirname 2024-02-01 00:34:34 -08:00
Dylan Conway
4f98336f86 fix(windows): fix installing non-ascii paths and make normalizeBuf generic (#8608)
* comptime type normalizeStringBuf

* delete

* revert

* revert revert

* revert

* remove unused

* remove unnecessary assert

* add comment

* remove normalize, need ../

* use Output.err

* update error message

* generic T suffix

* fix windows build

* more fix build

* more fix build

* mkdiratZ

* update test

* [autofix.ci] apply automated fixes

* update snapshot again

* fix merge

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-01-31 22:44:23 -08:00
dave caruso
91cfd614ca fix(window): some more bin things (#8612)
* allow linking bins that do not exist.

* fix some things
2024-01-31 22:37:03 -08:00
Meghan Denny
42e4cd8408 get more bundler tests passing on windows (#8560)
* 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>
2024-01-31 22:29:33 -08:00
dave caruso
dbe0a4a978 do more assertions (#8610) 2024-01-31 22:14:03 -08:00
Georgijs
350cc1178a --watch and --hot on windows (#8607)
* 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>
2024-01-31 22:06:33 -08:00
Jarred Sumner
dccabd9423 Make test work better on windows 2024-01-31 22:03:52 -08:00
dave caruso
345a061d3b fix(windows): make process.env case-insensitive (#8578)
* 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>
2024-01-31 21:52:50 -08:00
3λiȯ+
690346b30b docs: Fix typo in code example for Transpiler.transformSync (#8553)
* 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>
2024-01-31 21:18:57 -08:00
huseeiin
16b7b94aea Update bun.d.ts (#8595)
Add `string | ArrayBuffer` to compressing/uncompression functions
2024-01-31 21:13:12 -08:00
Meghan Denny
fcf0047763 windows: pass ws.test.ts (#8611) 2024-01-31 21:08:19 -08:00
dave caruso
af1a124831 allow linking bins that do not exist. (#8605) 2024-01-31 19:08:50 -08:00
dave caruso
f5754e3c19 add baseline in crash report (#8606) 2024-01-31 18:13:39 -08:00
Joe
4e09f8ef8f Issue-6526 - clarify web docs for the use of .only() (#8600)
* Update writing.md

clarify the use of `.only()`

* Update test.d.ts

Small clarification in JSDoc
2024-01-31 14:12:26 -08:00
Luke Ingalls
1969204fa5 docs: remove outdated callout (#8584)
seems like this is already patched https://github.com/oven-sh/bun/issues/5394
2024-01-31 00:08:26 -08:00
dave caruso
2d9db9b28f fix napi-rs libraries on windows (#8583)
* yay

* a

* ok

* typo

* un-CRLFify these files
2024-01-30 20:21:52 -08:00
dave caruso
0333c7b0bf Fix "__dirname" on windows (#8579) 2024-01-30 16:17:32 -08:00
Dylan Conway
82829c5925 fix crash 2024-01-30 13:44:00 -08:00
dave caruso
8fdb46cb91 ok 2024-01-30 10:04:06 -08:00
vinnichase
0aba51230c dx: create symlink on every execution (#8568)
Symlink is not created on first setup.
2024-01-30 09:41:18 -08:00
Dylan Conway
ca801a35fe fix(windows): fix win32 errors (#8569)
* translate eexist

* use SystemErrno translation

* update
2024-01-30 06:49:59 -08:00
vinnichase
692fb220a4 Update launch.json to use ${workspaceFolder}/build/bun-debug (#8570) 2024-01-29 22:38:43 -08:00
dave caruso
cf1c849e4a fix(windows): more reliable extracting (#8567)
* finally

* a

* Update src/install/extract_tarball.zig

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>

* fix compilation

---------

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-01-29 20:03:02 -08:00
Jarred Sumner
2eede4f435 Fixes #8555 (#8566)
* Fixes #8555

* Make this closer to what npm does

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-01-29 17:52:08 -08:00
dave caruso
4989ef88b8 docs: mark PerformanceEntry and friends as implemented (#8466)
* docs: mark PerformanceEntry and friends as implemented

* Update docs/runtime/nodejs-apis.md

---------

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-01-29 15:49:06 -08:00
Jarred Sumner
9fa26e6a09 Close more file descriptors in bun --watch (#8533)
* Close more file descriptors in `bun --watch`

* Reset signals

* Add comment

* Update bun.zig

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-01-29 15:48:26 -08:00
Jarred Sumner
413aaaff33 [bun:sqlite] Support multiple statements in db.run() (#8541)
* [bun:sqlite] Support multiple statements in db.run()

* Update sqlite.test.js

* Update JSSQLStatement.cpp

* Another test

---------

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-01-29 15:17:51 -08:00
Dylan Conway
c538bf87d1 fix(windows): transpiler cache and other test fixes (#8471)
* umask

* process args

* update reportError.test.ts

* file exists

* transpiler cache

* back to const

* remove failing comments

* [autofix.ci] apply automated fixes

* update comment

* debug assert and remmove branch

* oops

* escape

* path sep

* seekTo

* disable

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-01-29 15:17:23 -08:00
dave caruso
1e9b44adda internal: report all failing tests to our internal feed (#8563)
* yeah

* oop

* yeahh
2024-01-29 15:17:14 -08:00
dave caruso
3046b0ee39 feat(windows): allow open and Bun.file() with /dev/null (#8499)
* DEV NULL

* oops

* ok
2024-01-29 11:08:09 -08:00
dave caruso
01d41838c5 fix(builtin-bundler): do not replace globals when extending classes (#8557)
* fix(builtin-bundler): do not replace globals when extending classes

* format
2024-01-29 11:07:39 -08:00
dave caruso
bc7e7027e4 windows: some random things (#8521)
* swaggin

* fix(bun_shim_impl): support exe names that are shorter than four characters

* hi

* a
2024-01-29 10:50:24 -08:00
João V. Farias
eaea6dea54 chore(build): adjust arch/manjaro linux auto detect to include artix (#8510) 2024-01-29 09:41:58 -08:00
Jarred Sumner
d0b759f784 Remove references to bun-types 2024-01-29 08:10:14 -08:00
Dale Seo
dbfc62e288 docs: include .jsx (#8542) 2024-01-28 10:00:54 -08:00
Yahya Jirari
34ae040d95 docs: remove unnecessary await in lines() example (#8537) 2024-01-28 06:36:29 -08:00
Ben Limmer
3caa846988 docs: expect.extend is implemented (#8525) 2024-01-27 20:39:46 -08:00
Dylan Conway
5a0ae3c256 not on windows 2024-01-27 07:32:06 -08:00
Dylan Conway
568f87eb8f fix(windows): bun link, unlink, and fix tests in test/cli/install (#8517)
* 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>
2024-01-27 04:22:04 -08:00
dave caruso
968c21d80a feat(windows): support bun build --compile (#8503)
* alright

* were winning

* WAOOOOOO
2024-01-26 20:56:08 -08:00
dave caruso
6faeef6dc2 Workaround https://github.com/microsoft/terminal/issues/16606 (#8506)
Fixes #8504
2024-01-26 20:55:48 -08:00
Georgijs
08c9511acc [windows] nodefs (#8509)
* 100 passing fs tests

* 111 fs tests passing

* 114 passing fs tests

* 115 passing (TODO: fix path normalization for windows ntCreateFile

* all fs tests passing

* [autofix.ci] apply automated fixes

* make windows path norm smarter, fix tests

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-01-26 20:07:33 -08:00
Meghan Denny
1644f341f9 windows: setInterval.test.js is passing now (#8508) 2024-01-26 14:11:03 -08:00
nullun
17fc1e7be1 chore: Remove trailing whitespace (#8502) 2024-01-26 07:25:45 -08:00
Jarred Sumner
7492b3a203 [windows] Remove no longer failing tests from being marked as failing 2024-01-25 21:59:11 -08:00
Jarred Sumner
681baedab2 Track hasInstallScript and libc in NPM registry api (#8495)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-01-25 20:38:20 -08:00
Jarred Sumner
c7c3ae381b Make this test less flaky on Windows 2024-01-25 20:37:41 -08:00
Jarred Sumner
7543da0bb3 Always normalize the carriage returns in the bundler tests 2024-01-25 20:27:58 -08:00
dave caruso
83ac4f0c33 windows: fix bun plugin (#8485)
* plugins work now

* real

* Update src/js/builtins/BundlerPlugin.ts

* [autofix.ci] apply automated fixes

---------

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-01-25 19:34:51 -08:00
Jarred Sumner
3c42dfd42b [internal] Tweak jsonc formatting 2024-01-25 19:19:32 -08:00
Jarred Sumner
e3188c918a use Biome to format Bun's codebase instead of Prettier (#8494)
* Ignore

* Create biome.json

* Ignore

* biome

* [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>
2024-01-25 19:15:26 -08:00
Jarred Sumner
045672cf67 Force \n instead of \r\n on Windows CI 2024-01-25 19:05:47 -08:00
Dale Seo
345ed18454 fix: mock() should work with no arguments (#8492) 2024-01-25 17:06:36 -08:00
Jarred Sumner
5462ca01fd Typo 2024-01-25 16:33:07 -08:00
Jarred Sumner
4bfd8a8cef Make this test less flaky on Windows 2024-01-25 16:30:25 -08:00
Jarred Sumner
a2a12b5802 Make this test less flaky on Windows 2024-01-25 15:09:32 -08:00
Jarred Sumner
b6c1dc1fa8 Use native AbortController & AbortSignal when abort-controller is loaded (#8489)
* Nationalize `abort-controller`

* [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>
2024-01-25 15:01:29 -08:00
Jarred Sumner
f4f8bb377a Make this test less flaky on Windows 2024-01-25 14:53:20 -08:00
Jarred Sumner
5c21695db6 Bump + ci autofix (#8490)
* Bump

* [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>
2024-01-25 13:58:59 -08:00
Adam Dimitry Enzo Ambrosino
2c16b204ff Fix type definition for Array.fromAsync (#8486) 2024-01-25 10:32:47 -07:00
dave caruso
20f7fd5b08 fix(windows): do not use GetTempPath2W (#8477) 2024-01-25 08:13:36 -08:00
dave caruso
c9a7d24538 windows(install): add bun_shim (support bin linking, bin shebangs, etc) (#8265)
* 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>
2024-01-25 07:38:55 -08:00
Jarred Sumner
108cae5189 Disable dead code elimination when code coverage is enabled (#8473)
This should hopefully make source mappings more accurate

Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-01-25 05:31:44 -08:00
dave caruso
358be9e727 docs: update the windows build documentation and list it on the docs site 2024-01-25 04:15:41 -08:00
Jarred Sumner
2a6388d50b Silence log when ENOTCONN
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.
2024-01-25 01:03:29 -08:00
Jarred Sumner
aa901a22c2 Update types.zig 2024-01-24 23:11:58 -08:00
Jarred Sumner
562495b878 [windows] Mark as known failing 2024-01-24 23:11:55 -08:00
Jarred Sumner
875728da83 [windows] Make more things panic 2024-01-24 22:47:40 -08:00
Jarred Sumner
47e7e004b1 Remove @known-failing-on-windows for tests which are no longer failing on windows 2024-01-24 21:03:32 -08:00
Georgijs
80bd3254cc fix argv parsing on windows (#8458)
* 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>
2024-01-24 20:54:01 -08:00
Jonathan Deiss
0bf8a25d50 Clarifies bun shebang in bunx documentation (#8437)
* Update bunx.md

* better phrasing of shebang
2024-01-24 19:59:56 -08:00
Meghan Denny
effb8f189b windows: fix some websocket tests (#8433)
* 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>
2024-01-24 19:40:59 -08:00
Johann
7eeefc1497 chore(password): fix sha256 typo (#8461) 2024-01-24 19:27:29 -08:00
Georgijs
025a5ba140 fix sys.dup on windows and make console-iterator work (#8463)
* 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>
2024-01-24 19:25:45 -08:00
Ashcon Partovi
885d705d55 Fix bun-types version being incorrect 2024-01-24 15:21:10 -07:00
dave caruso
3447bc2ed3 fixy 2024-01-24 03:16:23 -08:00
Jarred Sumner
f1f861fd74 [windows] Fix panic in server 2024-01-24 02:20:29 -08:00
dave caruso
58ba802ca6 ci(windows): install the profile build 2024-01-24 02:12:16 -08:00
Zachary Huang
73f3b92dc9 fix(ci): fix MacOS build when OpenSSL is also installed (#7759)
Co-authored-by: dave caruso <me@paperdave.net>
2024-01-24 01:44:04 -08:00
dave caruso
eeb10f3f7d fix(windows): fix node:url pathFromFileURL and fileURLFromPath and file url tests (#8442)
* yay for file urls

* swag

* oops

* merge conf

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-01-24 01:19:47 -08:00
dave caruso
8544f8ae68 ci(windows): debug info in the binaries + ship a version on github (#8443)
* debug info yaaaaaaaaaaaaaaaaaay

* fix the build
2024-01-24 01:16:17 -08:00
Jarred Sumner
9f5ce53544 Normalize another newline 2024-01-23 23:44:38 -08:00
Jarred Sumner
82b6a42a3c Normalize more paths 2024-01-23 20:48:48 -08:00
Jarred Sumner
0974479655 Normalize slashes 2024-01-23 20:47:37 -08:00
Jarred Sumner
918e1878a5 Normalize newlines 2024-01-23 20:45:37 -08:00
Jarred Sumner
17deafd05f Add TypeScript issue template 2024-01-23 20:39:08 -08:00
Dylan Conway
b7ae984ca1 fix(windows): update some bundler tests (#8440)
* replace invalid path character

* windows paths
2024-01-23 20:23:01 -08:00
Jarred Sumner
e848c3f226 Get Bun.write tests to pass on Windows and bun:sqlite tests to pass (#8393)
* 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>
2024-01-23 20:03:56 -08:00
Dylan Conway
cd3de9c788 fix(windows): fix text-decoder.test.js (#8436)
* use with_errors

* remove comment

* use correct index
2024-01-23 19:28:54 -08:00
dave caruso
945ad77bce window: fix runtime.js build process (#8438)
Co-authored-by: Georgijs Vilums <georgijs.vilums@gmail.com>
2024-01-23 19:27:57 -08:00
Chen Yufei
04a99deb0e copy_file: ioctl_ficlone EACCES, EPERM as not supported. (#8425)
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
2024-01-23 18:24:54 -08:00
Ciro Spaciari
cff5dc0ee8 fix close on spawn and watch (#8426)
* fix close on spawn and watch

* add check closed, and fixes

* fix subprocess close
2024-01-23 18:09:13 -08:00
Dylan Conway
77ccf77e35 Revert "Revert "fix(windows): a bunch of install test fixes"" (#8431)
* 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>
2024-01-23 18:00:18 -08:00
DidaS
864a726249 Improve bun-types (#8195) 2024-01-23 13:51:45 -07:00
Jarred Sumner
1407683f95 Revert "fix(windows): a bunch of install test fixes" (#8408) 2024-01-23 06:38:13 -08:00
dave caruso
1f928e9b6e goddamn (#8405) 2024-01-23 06:37:14 -08:00
Dylan Conway
e0cf77c660 fix(windows): a bunch of install test fixes (#8402)
* 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>
2024-01-23 06:36:53 -08:00
dave caruso
07a685bd3d feat(windows): implement the rest of node:os (#8399)
* feat(windows): implement os.networkInterfaces

* we are cooking (os tests almost pass)

* os

* fix version struct

* oops

* [autofix.ci] apply automated fixes

* fix the submodules

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2024-01-23 05:06:51 -08:00
dave caruso
80ad8d57f2 windows: fix a path resolution case (#8392)
* fix resolving certain filepaths

* extra

* swag

---------

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-01-22 21:53:34 -08:00
Jarred Sumner
41b45599c6 Delete some dead code (#8391)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2024-01-22 21:06:13 -08:00
Ciro Spaciari
416e896c63 [windows] Implement fs.watch on Windows (#8379)
* implement fs watch

* fix unref

* fixes

* actually use bun.New

* fix destroy, use another buffer for joinPath, remove Win prefix

* oopsie
2024-01-22 20:29:46 -08:00
Dylan Conway
2d1e0dc240 trim correctly (#8388)
Co-authored-by: dave caruso <me@paperdave.net>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-01-22 19:57:20 -08:00
Meghan Denny
c52e7c57d2 add another launch config for windows bun test (#8389) 2024-01-22 19:45:39 -08:00
Georgijs
c4a60f9059 fix to enqueue bundler tasks in correct event loop (#8386)
* fix to enqueue bundler tasks in correct event loop

* fix posix build

---------

Co-authored-by: Georgijs Vilums <georgijs@bun.sh>
2024-01-22 19:45:24 -08:00
Dale Seo
15fe30ac41 docs: remove unncessary use of async in bun test examples (#8341) 2024-01-22 17:57:02 -08:00
Dale Seo
a014f1c566 docs: correct imports (#8380) 2024-01-22 17:14:55 -08:00
Jarred Sumner
73b0b35a42 Make the dev-server test more reliable 2024-01-22 17:09:47 -08:00
Georgijs
75524d0ae3 Fix eqlComptimeCheckLenWithKnownType (#8377)
* fix some env tests

* fix and simplify comptime string equality

* [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>
2024-01-22 16:41:30 -08:00
662 changed files with 32171 additions and 17705 deletions

View File

@@ -0,0 +1,45 @@
name: 🇹 TypeScript Type Bug Report
description: Report an issue with TypeScript types
labels: [bug, typescript]
body:
- type: markdown
attributes:
value: |
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?

View File

@@ -111,9 +111,15 @@ jobs:
with:
node-version: latest
- name: Setup Bun
if: ${{ env.BUN_VERSION != 'canary' }}
uses: oven-sh/setup-bun@v1
with:
bun-version: "1.0.21"
- name: Setup Bun
if: ${{ env.BUN_VERSION == 'canary' }}
uses: oven-sh/setup-bun@v1
with:
bun-version: "canary" # Must be 'canary' so tag is correct
- name: Install Dependencies
run: bun install
- name: Setup Tag
@@ -131,14 +137,14 @@ jobs:
if: ${{ env.BUN_VERSION == 'canary' }}
uses: JS-DevTools/npm-publish@v1
with:
package: packages/bun-types/dist/package.json
package: packages/bun-types/package.json
token: ${{ secrets.NPM_TOKEN }}
tag: canary
- name: Release (latest)
if: ${{ env.BUN_LATEST == 'true' }}
uses: JS-DevTools/npm-publish@v1
with:
package: packages/bun-types/dist/package.json
package: packages/bun-types/package.json
token: ${{ secrets.NPM_TOKEN }}
docker:
name: Release to Dockerhub

View File

@@ -57,6 +57,7 @@ jobs:
timeout-minutes: 60
if: github.repository_owner == 'oven-sh'
steps:
- run: git config --global core.autocrlf false && git config --global core.eol lf
- uses: actions/checkout@v4
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v2
@@ -116,6 +117,7 @@ jobs:
cpu: [haswell, nehalem]
arch: [x86_64]
steps:
- run: git config --global core.autocrlf false && git config --global core.eol lf
- name: Checkout
uses: actions/checkout@v4
- name: Clone Submodules
@@ -176,6 +178,11 @@ jobs:
path: bun-deps
key: ${{ steps.cache-deps-restore.outputs.cache-primary-key }}
# TODO(@paperdave): stop relying on this and use bun.exe to build itself.
# we cant do that now because there isn't a tagged release to use.
#
# and at the time of writing, the minimum canary required to work is not
# yet released as it is the one *this* commit.
windows-codegen:
name: Codegen
runs-on: ubuntu-latest
@@ -214,6 +221,7 @@ jobs:
cpu: [haswell, nehalem]
arch: [x86_64]
steps:
- run: git config --global core.autocrlf false && git config --global core.eol lf
- uses: actions/checkout@v4
- uses: KyleMayes/install-llvm-action@1a3da29f56261a1e1f937ec88f0856a9b8321d7e
with:
@@ -268,11 +276,12 @@ jobs:
arch: [x86_64]
name: Link
needs: [windows-dependencies, windows-codegen, windows-cpp, windows-zig]
runs-on: windows-latest
runs-on: windows-small
if: github.repository_owner == 'oven-sh'
timeout-minutes: 30
permissions: write-all
steps:
- run: git config --global core.autocrlf false && git config --global core.eol lf
- uses: actions/checkout@v4
- uses: KyleMayes/install-llvm-action@1a3da29f56261a1e1f937ec88f0856a9b8321d7e
with:
@@ -320,11 +329,21 @@ jobs:
run: |
$Dist = mkdir -Force "${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}"
cp -r build\bun.exe "$Dist\bun.exe"
Compress-Archive $Dist ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}.zip
Compress-Archive "$Dist" "${Dist}.zip"
$Dist = "$Dist-profile"
MkDir -Force "$Dist"
cp -r build\bun.exe "$Dist\bun.exe"
cp -r build\bun.pdb "$Dist\bun.pdb"
Compress-Archive "$Dist" "$Dist.zip"
- uses: actions/upload-artifact@v3
with:
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
path: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}.zip
- uses: actions/upload-artifact@v3
with:
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile
path: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile.zip
- name: Release
id: release
uses: ncipollo/release-action@v1
@@ -341,7 +360,7 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }}
name: "Canary (${{github.sha}})"
tag: "canary"
artifacts: "${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}.zip"
artifacts: "${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}.zip,${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile.zip"
- uses: sarisia/actions-status-discord@v1
if: failure() && github.repository_owner == 'oven-sh' && github.event_name == 'pull_request'
with:
@@ -360,7 +379,7 @@ jobs:
**[Build Output](https://github.com/oven-sh/bun/actions/runs/${{github.run_id}})** | [Commit](https://github.com/oven-sh/bun/commits/${{github.sha}})
windows-test:
name: Test
runs-on: windows-latest
runs-on: windows-small
needs: [windows-link]
if: github.event_name == 'pull_request' && github.repository_owner == 'oven-sh'
permissions:
@@ -376,6 +395,7 @@ jobs:
cpu: [haswell]
arch: [x86_64]
steps:
- run: git config --global core.autocrlf false && git config --global core.eol lf
- id: checkout
name: Checkout
uses: actions/checkout@v3
@@ -385,13 +405,13 @@ jobs:
name: Download Release
uses: actions/download-artifact@v3
with:
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile
path: ${{runner.temp}}/release
- name: Install Bun
run: |
cd ${{runner.temp}}/release
unzip ${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}.zip
cd ${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
unzip ${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile.zip
cd ${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile
pwd >> $env:GITHUB_PATH
- name: Install Node
uses: actions/setup-node@v4
@@ -416,9 +436,25 @@ jobs:
run: |
try {
$ErrorActionPreference = "SilentlyContinue"
$null = node packages/bun-internal-test/src/runner.node.mjs ${{runner.temp}}/release/${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}/bun.exe || $true
$null = node packages/bun-internal-test/src/runner.node.mjs ${{runner.temp}}/release/${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile/bun.exe || $true
} catch {}
$ErrorActionPreference = "Stop"
- uses: sarisia/actions-status-discord@v1
if: always() && steps.test.outputs.failing_tests != '' && github.event_name == 'pull_request'
with:
title: ""
webhook: ${{ secrets.DISCORD_WEBHOOK_WINTEST }}
status: "failure"
noprefix: true
nocontext: true
description: |
### ❌🪟 [${{github.event.pull_request.title}}](https://github.com/oven-sh/bun/pull/${{github.event.number}})
@${{ github.actor }}, there are **${{ steps.test.outputs.failing_test_count }} failing tests** on Windows ${{ matrix.arch }}${{ matrix.cpu == 'nehalem' && ' Baseline' || '' }}
${{ steps.test.outputs.failing_tests }}
[Full Test Output](https://github.com/oven-sh/bun/actions/runs/${{github.run_id}})
- uses: sarisia/actions-status-discord@v1
if: always() && steps.test.outputs.regressing_tests != '' && github.event_name == 'pull_request'
with:

332
.gitignore vendored
View File

@@ -1,166 +1,168 @@
.DS_Store
zig-cache
packages/*/*.wasm
*.o
*.a
profile.json
node_modules
.envrc
.swcrc
yarn.lock
dist
*.tmp
*.log
*.out.js
*.out.refresh.js
**/package-lock.json
build
*.wat
zig-out
pnpm-lock.yaml
README.md.template
src/deps/zig-clap/example
src/deps/zig-clap/README.md
src/deps/zig-clap/.github
src/deps/zig-clap/.gitattributes
out
outdir
.trace
cover
coverage
coverv
*.trace
github
out.*
out
.parcel-cache
esbuilddir
*.bun
parceldist
esbuilddir
outdir/
outcss
.next
txt.js
.idea
.vscode/cpp*
.vscode/clang*
node_modules_*
*.jsb
*.zip
bun-zigld
bun-singlehtreaded
bun-nomimalloc
bun-mimalloc
examples/lotta-modules/bun-yday
examples/lotta-modules/bun-old
examples/lotta-modules/bun-nofscache
src/node-fallbacks/out/*
src/node-fallbacks/node_modules
sign.json
release/
*.dmg
sign.*.json
packages/debug-*
packages/bun-cli/postinstall.js
packages/bun-*/bun
packages/bun-*/bun-profile
packages/bun-*/debug-bun
packages/bun-*/*.o
packages/bun-cli/postinstall.js
packages/bun-cli/bin/*
bun-test-scratch
misctools/fetch
src/deps/libiconv
src/deps/openssl
src/tests.zig
*.blob
src/deps/s2n-tls
.npm
.npm.gz
bun-binary
src/deps/PLCrashReporter/
*.dSYM
*.crash
misctools/sha
packages/bun-wasm/*.mjs
packages/bun-wasm/*.cjs
packages/bun-wasm/*.map
packages/bun-wasm/*.js
packages/bun-wasm/*.d.ts
packages/bun-wasm/*.d.cts
packages/bun-wasm/*.d.mts
*.bc
src/fallback.version
src/runtime.version
*.sqlite
*.database
*.db
misctools/machbench
*.big
.eslintcache
/bun-webkit
src/deps/c-ares/build
src/bun.js/bindings-obj
src/bun.js/debug-bindings-obj
failing-tests.txt
test.txt
myscript.sh
cold-jsc-start
cold-jsc-start.d
/test.ts
/test.js
src/js/out/modules*
src/js/out/functions*
src/js/out/tmp
src/js/out/DebugPath.h
make-dev-stats.csv
.uuid
tsconfig.tsbuildinfo
test/js/bun/glob/fixtures
*.lib
*.pdb
CMakeFiles
build.ninja
.ninja_deps
.ninja_log
CMakeCache.txt
cmake_install.cmake
compile_commands.json
*.lib
x64
**/*.vcxproj*
**/*.sln*
**/*.dir
**/*.pdb
/.webkit-cache
/.cache
/src/deps/libuv
/build-*/
.vs
**/.verdaccio-db.json
/test-report.md
.DS_Store
zig-cache
packages/*/*.wasm
*.o
*.a
profile.json
.env
node_modules
.envrc
.swcrc
yarn.lock
dist
*.tmp
*.log
*.out.js
*.out.refresh.js
**/package-lock.json
build
*.wat
zig-out
pnpm-lock.yaml
README.md.template
src/deps/zig-clap/example
src/deps/zig-clap/README.md
src/deps/zig-clap/.github
src/deps/zig-clap/.gitattributes
out
outdir
.trace
cover
coverage
coverv
*.trace
github
out.*
out
.parcel-cache
esbuilddir
*.bun
parceldist
esbuilddir
outdir/
outcss
.next
txt.js
.idea
.vscode/cpp*
.vscode/clang*
node_modules_*
*.jsb
*.zip
bun-zigld
bun-singlehtreaded
bun-nomimalloc
bun-mimalloc
examples/lotta-modules/bun-yday
examples/lotta-modules/bun-old
examples/lotta-modules/bun-nofscache
src/node-fallbacks/out/*
src/node-fallbacks/node_modules
sign.json
release/
*.dmg
sign.*.json
packages/debug-*
packages/bun-cli/postinstall.js
packages/bun-*/bun
packages/bun-*/bun-profile
packages/bun-*/debug-bun
packages/bun-*/*.o
packages/bun-cli/postinstall.js
packages/bun-cli/bin/*
bun-test-scratch
misctools/fetch
src/deps/libiconv
src/deps/openssl
src/tests.zig
*.blob
src/deps/s2n-tls
.npm
.npm.gz
bun-binary
src/deps/PLCrashReporter/
*.dSYM
*.crash
misctools/sha
packages/bun-wasm/*.mjs
packages/bun-wasm/*.cjs
packages/bun-wasm/*.map
packages/bun-wasm/*.js
packages/bun-wasm/*.d.ts
packages/bun-wasm/*.d.cts
packages/bun-wasm/*.d.mts
*.bc
src/fallback.version
src/runtime.version
*.sqlite
*.database
*.db
misctools/machbench
*.big
.eslintcache
/bun-webkit
src/deps/c-ares/build
src/bun.js/bindings-obj
src/bun.js/debug-bindings-obj
failing-tests.txt
test.txt
myscript.sh
cold-jsc-start
cold-jsc-start.d
/testdir
/test.ts
/test.js
src/js/out/modules*
src/js/out/functions*
src/js/out/tmp
src/js/out/DebugPath.h
make-dev-stats.csv
.uuid
tsconfig.tsbuildinfo
test/js/bun/glob/fixtures
*.lib
*.pdb
CMakeFiles
build.ninja
.ninja_deps
.ninja_log
CMakeCache.txt
cmake_install.cmake
compile_commands.json
*.lib
x64
**/*.vcxproj*
**/*.sln*
**/*.dir
**/*.pdb
/.webkit-cache
/.cache
/src/deps/libuv
/build-*/
.vs
**/.verdaccio-db.json
/test-report.md
/test-report.json

View File

@@ -1,14 +0,0 @@
src/fallback.html
src/bun.js/WebKit
src/js/out
src/*.out.js
src/*out.*.js
src/deps
src/test/fixtures
src/react-refresh.js
test/snapshots
test/snapshots-no-hmr
test/js/deno/*.test.ts
test/js/deno/**/*.test.ts
bench/react-hello-world/react-hello-world.node.js
test/cli/run/encoding-utf16-le-bom.ts

View File

@@ -1,15 +0,0 @@
module.exports = {
arrowParens: "avoid",
printWidth: 120,
trailingComma: "all",
useTabs: false,
quoteProps: "preserve",
overrides: [
{
files: ["*.md"],
options: {
printWidth: 80,
},
},
],
};

View File

@@ -3,6 +3,7 @@
{
"name": "Debug",
"forcedInclude": ["${workspaceFolder}/src/bun.js/bindings/root.h"],
"compileCommands": "${workspaceFolder}/build/compile_commands.json",
"includePath": [
"${workspaceFolder}/build/bun-webkit/include",
"${workspaceFolder}/build/codegen",

View File

@@ -1,10 +1,33 @@
{
"recommendations": [
// Zig
"ziglang.vscode-zig",
"esbenp.prettier-vscode",
// C/C++
"clang.clangd",
"ms-vscode.cmake-tools",
"xaver.clang-format",
"vadimcn.vscode-lldb",
// JavaScript
"oven.bun-vscode",
"biomejs.biome",
// TypeScript
"better-ts-errors.better-ts-errors",
"MylesMurphy.prettify-ts",
// Markdown
"bierner.markdown-preview-github-styles",
"bierner.markdown-emoji",
"bierner.emojisense",
"bierner.markdown-checkbox",
"bierner.jsdoc-markdown-highlighting",
// TOML
"tamasfe.even-better-toml",
// Other
"bierner.comment-tagged-templates",
"ms-vscode.cpptools"
]
}

1257
.vscode/launch.json generated vendored

File diff suppressed because it is too large Load Diff

229
.vscode/settings.json vendored
View File

@@ -1,48 +1,89 @@
{
"git.autoRepositoryDetection": "openEditors",
// Editor
"editor.tabSize": 2,
"editor.insertSpaces": true,
"editor.formatOnSave": true,
"editor.formatOnSaveMode": "file",
// Search
"search.quickOpen.includeSymbols": false,
"search.seedWithNearestWord": true,
"search.smartCase": true,
"search.exclude": {
"node_modules": true,
"src/bun.js/WebKit": true,
".git": true,
"src/bun.js/WebKit": true,
"src/deps/*/**": true
},
"search.followSymlinks": false,
"search.useIgnoreFiles": true,
// Git
"git.autoRepositoryDetection": "openEditors",
"git.ignoreSubmodules": true,
"git.ignoreLimitWarning": true,
// Zig
"zig.initialSetupDone": true,
"zig.buildOnSave": false,
"zig.formattingProvider": "zls",
"zig.buildOption": "build",
"zig.buildFilePath": "${workspaceFolder}/build.zig",
"zig.initialSetupDone": true,
"editor.formatOnSave": true,
"zig.path": "${workspaceFolder}/.cache/zig/zig.exe",
"zig.formattingProvider": "zls",
"zig.zls.enableInlayHints": false,
"[zig]": {
"editor.tabSize": 4,
"editor.useTabStops": false,
"editor.defaultFormatter": "ziglang.vscode-zig"
},
"[ts]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
// C++
"lldb.verboseLogging": false,
"cmake.configureOnOpen": false,
"C_Cpp.errorSquiggles": "enabled",
"[cpp]": {
"editor.defaultFormatter": "xaver.clang-format"
},
"[js]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
"[c]": {
"editor.defaultFormatter": "xaver.clang-format"
},
"zig.zls.enableInlayHints": false,
"zig.path": "${workspaceFolder}/.cache/zig/zig.exe",
"git.ignoreSubmodules": true,
"[jsx]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
"[h]": {
"editor.defaultFormatter": "xaver.clang-format"
},
"[tsx]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
// JavaScript
"prettier.enable": false,
"eslint.workingDirectories": ["${workspaceFolder}/packages/bun-types"],
"[javascript]": {
"editor.defaultFormatter": "biomejs.biome",
},
"[yaml]": {},
"[javascriptreact]": {
"editor.defaultFormatter": "biomejs.biome"
},
// TypeScript
"typescript.tsdk": "${workspaceFolder}/node_modules/typescript/lib",
"[typescript]": {
"editor.defaultFormatter": "biomejs.biome"
},
"[typescriptreact]": {
"editor.defaultFormatter": "biomejs.biome"
},
// JSON
"[json]": {
"editor.defaultFormatter": "biomejs.biome",
},
"[jsonc]": {
"editor.defaultFormatter": "biomejs.biome",
},
// Markdown
"[markdown]": {
"editor.defaultFormatter": "biomejs.biome",
"editor.unicodeHighlight.ambiguousCharacters": false,
"editor.unicodeHighlight.invisibleCharacters": false,
"diffEditor.ignoreTrimWhitespace": false,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.wordWrap": "on",
"editor.quickSuggestions": {
"comments": "off",
@@ -50,7 +91,18 @@
"other": "off"
}
},
"lldb.verboseLogging": false,
// TOML
"[toml]": {
"editor.defaultFormatter": "biomejs.biome",
},
// YAML
"[yaml]": {
"editor.defaultFormatter": "biomejs.biome",
},
// Files
"files.exclude": {
"**/.git": true,
"**/.svn": true,
@@ -60,7 +112,6 @@
"**/Thumbs.db": true,
"**/*.xcworkspacedata": true,
"**/*.xcscheme": true,
"**/*.pem": true,
"**/*.xcodeproj": true,
"src/bun.js/WebKit": true,
"src/deps/libarchive": true,
@@ -75,7 +126,10 @@
"src/deps/tinycc": true,
"src/deps/zstd": true,
"**/*.i": true,
"packages/bun-uws/fuzzing/seed-corpus/**/*": true
"packages/bun-uws/fuzzing/seed-corpus": true
},
"files.associations": {
"*.idl": "cpp"
},
"C_Cpp.files.exclude": {
"**/.vscode": true,
@@ -95,137 +149,4 @@
"WebKit/WebKitBuild": true,
"WebKit/WebInspectorUI": true
},
"[cpp]": {
"editor.defaultFormatter": "xaver.clang-format"
},
"[h]": {
"editor.defaultFormatter": "xaver.clang-format"
},
"[c]": {
"editor.defaultFormatter": "xaver.clang-format"
},
"files.associations": {
"*.lock": "yarnlock",
"*.idl": "cpp",
"memory": "cpp",
"iostream": "cpp",
"algorithm": "cpp",
"random": "cpp",
"ios": "cpp",
"filesystem": "cpp",
"__locale": "cpp",
"type_traits": "cpp",
"__mutex_base": "cpp",
"__string": "cpp",
"string": "cpp",
"string_view": "cpp",
"typeinfo": "cpp",
"__config": "cpp",
"__nullptr": "cpp",
"exception": "cpp",
"__bit_reference": "cpp",
"atomic": "cpp",
"utility": "cpp",
"sstream": "cpp",
"__functional_base": "cpp",
"new": "cpp",
"__debug": "cpp",
"__errc": "cpp",
"__hash_table": "cpp",
"__node_handle": "cpp",
"__split_buffer": "cpp",
"__threading_support": "cpp",
"__tuple": "cpp",
"array": "cpp",
"bit": "cpp",
"bitset": "cpp",
"cctype": "cpp",
"chrono": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"complex": "cpp",
"condition_variable": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"fstream": "cpp",
"functional": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"istream": "cpp",
"iterator": "cpp",
"limits": "cpp",
"locale": "cpp",
"mutex": "cpp",
"optional": "cpp",
"ostream": "cpp",
"ratio": "cpp",
"stack": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"system_error": "cpp",
"thread": "cpp",
"tuple": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"__bits": "cpp",
"__tree": "cpp",
"map": "cpp",
"numeric": "cpp",
"set": "cpp",
"__memory": "cpp",
"memory_resource": "cpp",
"*.tcc": "cpp",
"list": "cpp",
"shared_mutex": "cpp",
"cinttypes": "cpp",
"variant": "cpp",
"sysctl.h": "c",
"queue": "cpp",
"compare": "cpp",
"concepts": "cpp",
"typeindex": "cpp",
"__verbose_abort": "cpp",
"__std_stream": "cpp",
"any": "cpp",
"charconv": "cpp",
"csignal": "cpp",
"format": "cpp",
"forward_list": "cpp",
"future": "cpp",
"regex": "cpp",
"span": "cpp",
"valarray": "cpp",
"codecvt": "cpp",
"xtr1common": "cpp",
"stop_token": "cpp",
"xfacet": "cpp",
"xhash": "cpp",
"xiosbase": "cpp",
"xlocale": "cpp",
"xlocbuf": "cpp",
"xlocinfo": "cpp",
"xlocmes": "cpp",
"xlocmon": "cpp",
"xlocnum": "cpp",
"xloctime": "cpp",
"xmemory": "cpp",
"xstring": "cpp",
"xtree": "cpp",
"xutility": "cpp"
},
"C_Cpp.errorSquiggles": "enabled",
"eslint.workingDirectories": ["packages/bun-types"],
"typescript.tsdk": "node_modules/typescript/lib",
"cmake.configureOnOpen": false,
"git.ignoreLimitWarning": true
}

49
.vscode/tasks.json vendored
View File

@@ -2,10 +2,51 @@
"version": "2.0.0",
"tasks": [
{
"label": "Rebuild Debug",
"command": "ninja",
"args": ["-Cbuild"],
"type": "process",
}
"label": "Install Dependencies",
"command": "scripts/all-dependencies.sh",
"windows": {
"command": "scripts/all-dependencies.ps1"
},
"icon": {
"id": "arrow-down"
},
"options": {
"cwd": "${workspaceFolder}"
},
},
{
"type": "process",
"label": "Setup Environment",
"dependsOn": ["Install Dependencies"],
"command": "scripts/setup.sh",
"windows": {
"command": "scripts/setup.ps1"
},
"icon": {
"id": "check"
},
"options": {
"cwd": "${workspaceFolder}"
},
},
{
"type": "process",
"label": "Build Bun",
"dependsOn": ["Setup Environment"],
"command": "bun",
"args": ["run", "build"],
"icon": {
"id": "gear"
},
"options": {
"cwd": "${workspaceFolder}"
},
"isBuildCommand": true,
"runOptions": {
"instanceLimit": 1,
"reevaluateOnRerun": true,
},
},
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -290,7 +290,6 @@ ENV CCACHE_DIR=/ccache
COPY Makefile ${BUN_DIR}/Makefile
COPY src/deps/zstd ${BUN_DIR}/src/deps/zstd
COPY .prettierrc.cjs ${BUN_DIR}/.prettierrc.cjs
WORKDIR $BUN_DIR
@@ -378,7 +377,7 @@ RUN --mount=type=cache,target=/ccache mkdir ${BUN_DIR}/build \
FROM bun-base-with-zig as bun-codegen-for-zig
COPY package.json bun.lockb Makefile .gitmodules .prettierrc.cjs ${BUN_DIR}/
COPY package.json bun.lockb Makefile .gitmodules ${BUN_DIR}/
COPY src/runtime ${BUN_DIR}/src/runtime
COPY src/runtime.js src/runtime.bun.js ${BUN_DIR}/src/
COPY packages/bun-error ${BUN_DIR}/packages/bun-error

View File

@@ -823,7 +823,6 @@ fmt: fmt-cpp fmt-zig
api:
./node_modules/.bin/peechy --schema src/api/schema.peechy --esm src/api/schema.js --ts src/api/schema.d.ts --zig src/api/schema.zig
$(ZIG) fmt src/api/schema.zig
$(PRETTIER) --config=.prettierrc.cjs --write src/api/schema.js src/api/schema.d.ts
.PHONY: node-fallbacks
node-fallbacks:
@@ -1723,7 +1722,7 @@ sizegen:
# Linux uses bundled SQLite3
ifeq ($(OS_NAME),linux)
sqlite:
$(CC) $(EMIT_LLVM_FOR_RELEASE) $(CFLAGS) $(INCLUDE_DIRS) -DSQLITE_ENABLE_COLUMN_METADATA= -DSQLITE_MAX_VARIABLE_NUMBER=250000 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_JSON1=1 $(SRC_DIR)/sqlite/sqlite3.c -c -o $(SQLITE_OBJECT)
$(CC) $(EMIT_LLVM_FOR_RELEASE) $(CFLAGS) $(INCLUDE_DIRS) -DSQLITE_ENABLE_COLUMN_METADATA= -DSQLITE_MAX_VARIABLE_NUMBER=250000 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_MATH_FUNCTIONS=1 $(SRC_DIR)/sqlite/sqlite3.c -c -o $(SQLITE_OBJECT)
endif
picohttp:

View File

@@ -7,280 +7,166 @@
"version": "0.0.34"
},
"timestamps": [
16336202536562, 16336202536908, 16336202537294, 16336202537705,
16336202538114, 16336202538534, 16336202538941, 16336202539323,
16336202539742, 16336202540159, 16336202540877, 16336202541310,
16336202541749, 16336202542159, 16336202542565, 16336202542996,
16336202543333, 16336202543761, 16336202544159, 16336202544534,
16336202544944, 16336202545345, 16336202545744, 16336202546159,
16336202546573, 16336202546986, 16336202547399, 16336202547781,
16336202548202, 16336202548564, 16336202548949, 16336202549329,
16336202549762, 16336202550168, 16336202550534, 16336202550887,
16336202551305, 16336202551659, 16336202552060, 16336202552449,
16336202552854, 16336202553270, 16336202553609, 16336202554034,
16336202554437, 16336202554783, 16336202555191, 16336202555623,
16336202556034, 16336202556449, 16336202556890, 16336202557283,
16336202557669, 16336202558084, 16336202558496, 16336202558863,
16336202559271, 16336202559659, 16336202560051, 16336202560452,
16336202560873, 16336202561290, 16336202561659, 16336202562035,
16336202562440, 16336202562862, 16336202563284, 16336202563659,
16336202564034, 16336202564444, 16336202564853, 16336202565245,
16336202565659, 16336202566034, 16336202566455, 16336202566873,
16336202567284, 16336202567659, 16336202568034, 16336202568386,
16336202568790, 16336202569204, 16336202569620, 16336202570384,
16336202570768, 16336202571188, 16336202571551, 16336202572327,
16336202572717, 16336202573116, 16336202573541, 16336202573959,
16336202574319, 16336202574682, 16336202575040, 16336202575375,
16336202577001, 16336202577342, 16336202577680, 16336202578066,
16336202578451, 16336202579166, 16336202579534, 16336202579960,
16336202580370, 16336202580789, 16336202581159, 16336202581576,
16336202581949, 16336202582294, 16336202583087, 16336202583496,
16336202583858, 16336202584203, 16336202584606, 16336202585034,
16336202585386, 16336202585788, 16336202586211, 16336202586604,
16336202587034, 16336202587459, 16336202587869, 16336202588295,
16336202588668, 16336202589092, 16336202589452, 16336202589831,
16336202590197, 16336202590608, 16336202591034, 16336202591460,
16336202591880, 16336202592295, 16336202592727, 16336202593172,
16336202593567, 16336202593994, 16336202594397, 16336202594795,
16336202595224, 16336202595659, 16336202596058, 16336202596463,
16336202596890, 16336202597322, 16336202597732, 16336202598159,
16336202598534, 16336202598951, 16336202599365, 16336202599785,
16336202600159, 16336202600593, 16336202601005, 16336202601402,
16336202601807, 16336202602214, 16336202602556, 16336202602895,
16336202603307, 16336202603661, 16336202604075, 16336202604491,
16336202604853, 16336202605268, 16336202605670, 16336202606034,
16336202606393, 16336202606748, 16336202607170, 16336202607568,
16336202607982, 16336202608411, 16336202608836, 16336202609197,
16336202609596, 16336202609965, 16336202610333, 16336202610740,
16336202611159, 16336202611573, 16336202611975, 16336202612317,
16336202612691, 16336202613060, 16336202613474, 16336202613903,
16336202614341, 16336202614707, 16336202615094, 16336202615534,
16336202615883, 16336202616296, 16336202616671, 16336202617034,
16336202617391, 16336202617727, 16336202618159, 16336202618534,
16336202618937, 16336202619360, 16336202619770, 16336202620179,
16336202620716, 16336202621143, 16336202621534, 16336202622303,
16336202622659, 16336202623085, 16336202623498, 16336202623850,
16336202624220, 16336202624606, 16336202625034, 16336202625387,
16336202625805, 16336202626210, 16336202626599, 16336202627034,
16336202627386, 16336202627748, 16336202628159, 16336202628534,
16336202628954, 16336202629373, 16336202629809, 16336202630197,
16336202630535, 16336202630916, 16336202631290, 16336202631666,
16336202632034, 16336202632369, 16336202633152, 16336202633534,
16336202633883, 16336202634309, 16336202634717, 16336202635106,
16336202635871, 16336202636253, 16336202636671, 16336202637070,
16336202637434, 16336202637798, 16336202638184, 16336202638539,
16336202638938, 16336202639307, 16336202639666, 16336202640095,
16336202640534, 16336202640962, 16336202641307, 16336202641659,
16336202642087, 16336202642521, 16336202642886, 16336202643309,
16336202643662, 16336202644067, 16336202644491, 16336202644853,
16336202645226, 16336202645659, 16336202646074, 16336202646497,
16336202646890, 16336202647311, 16336202647749, 16336202648169,
16336202648976, 16336202649378, 16336202649810, 16336202650165,
16336202650534, 16336202650875, 16336202651250, 16336202651659,
16336202652093, 16336202652516, 16336202652921, 16336202653332,
16336202653722, 16336202654142, 16336202654534, 16336202654880,
16336202655221, 16336202655562, 16336202655997, 16336202656378,
16336202656811, 16336202657161, 16336202657588, 16336202657944,
16336202658360, 16336202658708, 16336202659089, 16336202659428,
16336202659849, 16336202660273, 16336202660685, 16336202661105,
16336202661534, 16336202661873, 16336202662228, 16336202662658,
16336202663438, 16336202663843, 16336202664219, 16336202664646,
16336202665050, 16336202665487, 16336202665838, 16336202666211,
16336202666573, 16336202666927, 16336202667334, 16336202667746,
16336202668158, 16336202668563, 16336202668980, 16336202669406,
16336202669753, 16336202670192, 16336202670554, 16336202670903,
16336202671324, 16336202671734, 16336202672159, 16336202672573,
16336202672982, 16336202673346, 16336202673680, 16336202674087,
16336202674499, 16336202674909, 16336202675260, 16336202676110,
16336202676535, 16336202676913, 16336202677312, 16336202677658,
16336202678044, 16336202678413, 16336202678793, 16336202679208,
16336202679604, 16336202680034, 16336202680385, 16336202680799,
16336202681213, 16336202681595, 16336202682004, 16336202682346,
16336202682726, 16336202683158, 16336202683586, 16336202683990,
16336202684323, 16336202684742, 16336202685175, 16336202685578,
16336202685979, 16336202686805, 16336202687206, 16336202687614,
16336202688038, 16336202688473, 16336202688848, 16336202689221,
16336202689559, 16336202689971, 16336202690368, 16336202690776,
16336202691159, 16336202691585, 16336202692010, 16336202692373,
16336202692780, 16336202693179, 16336202693580, 16336202693991,
16336202694324, 16336202694727, 16336202695159, 16336202695588,
16336202695991, 16336202696335, 16336202697160, 16336202697542,
16336202697929, 16336202698323, 16336202698674, 16336202699060,
16336202699492, 16336202699835, 16336202700238, 16336202700658,
16336202701059, 16336202701420, 16336202701815, 16336202702229,
16336202702659, 16336202703857, 16336202704256, 16336202704659,
16336202705497, 16336202706309, 16336202706660, 16336202707085,
16336202707511, 16336202707866, 16336202708210, 16336202708552,
16336202708925, 16336202709287, 16336202709670, 16336202710045,
16336202710402, 16336202710802, 16336202711167, 16336202711533,
16336202712249, 16336202712660, 16336202713088, 16336202713519,
16336202713936, 16336202714355, 16336202714740, 16336202715160,
16336202715533, 16336202715878, 16336202716290, 16336202716708,
16336202717102, 16336202718290, 16336202718699, 16336202719052,
16336202719388, 16336202719808, 16336202720225, 16336202720659,
16336202721052, 16336202721414, 16336202721828, 16336202722925,
16336202723664, 16336202724063, 16336202724405, 16336202726003,
16336202726736, 16336202727158, 16336202727543, 16336202727930,
16336202728336, 16336202728703, 16336202729061, 16336202729483,
16336202729832, 16336202730222, 16336202730659, 16336202731084,
16336202731500, 16336202731911, 16336202732326, 16336202733158,
16336202733585, 16336202734001, 16336202734691, 16336202735042,
16336202735442, 16336202735863, 16336202736255, 16336202736671,
16336202737043, 16336202737884, 16336202738671, 16336202739110,
16336202739533, 16336202739886, 16336202740283, 16336202740706,
16336202741143, 16336202741534, 16336202741942, 16336202742352,
16336202742697, 16336202743103, 16336202743940, 16336202745172,
16336202745542, 16336202745937, 16336202746339, 16336202746758,
16336202747531, 16336202747877, 16336202748232, 16336202748658,
16336202749055, 16336202749468, 16336202749859, 16336202750416,
16336202750839, 16336202751178, 16336202751572, 16336202752002,
16336202752419, 16336202753269, 16336202753678, 16336202754086,
16336202754432, 16336202754835, 16336202755260, 16336202755683,
16336202756059, 16336202756402, 16336202756837, 16336202758084,
16336202758507, 16336202758879, 16336202759270, 16336202759674,
16336202760044, 16336202760400, 16336202760801, 16336202761659,
16336202762053, 16336202762397, 16336202763199, 16336202763547,
16336202763948, 16336202764714, 16336202765113, 16336202765947,
16336202766329, 16336202766664, 16336202767085, 16336202768233,
16336202769056, 16336202769758, 16336202770178, 16336202770585,
16336202770929, 16336202771325, 16336202772158, 16336202772594,
16336202773033, 16336202773403, 16336202773801, 16336202774179,
16336202774555, 16336202774989, 16336202775393, 16336202775809,
16336202776209, 16336202776618, 16336202777033, 16336202777421,
16336202777845, 16336202778246, 16336202778658, 16336202779055,
16336202779411, 16336202779761, 16336202780175, 16336202780594,
16336202781002, 16336202781848, 16336202782658, 16336202783033,
16336202783857, 16336202784211, 16336202784557, 16336202784972,
16336202785377, 16336202785810, 16336202786172, 16336202786934,
16336202787343, 16336202787765, 16336202788201, 16336202788563,
16336202788970, 16336202789329, 16336202789672, 16336202790055,
16336202790456, 16336202790802, 16336202791580, 16336202791920,
16336202792326, 16336202793158, 16336202793953, 16336202794368,
16336202795187, 16336202795622, 16336202796033, 16336202796393,
16336202796777, 16336202797173, 16336202797540, 16336202797975,
16336202798317, 16336202798739, 16336202799158, 16336202799567,
16336202799966, 16336202800378, 16336202800803, 16336202801232,
16336202801658, 16336202802033, 16336202802374, 16336202802759,
16336202803158, 16336202803533, 16336202803947, 16336202804354,
16336202804729, 16336202805158, 16336202805534, 16336202805950,
16336202806390, 16336202806805, 16336202807219, 16336202807643,
16336202808033, 16336202808377, 16336202808790, 16336202809211,
16336202809560, 16336202809920, 16336202810355, 16336202810758,
16336202811187, 16336202811596, 16336202811943, 16336202812348,
16336202812710, 16336202813060, 16336202813398, 16336202813791,
16336202814158, 16336202814533, 16336202814878, 16336202815246,
16336202815658, 16336202816079, 16336202816851, 16336202817202,
16336202817540, 16336202817905, 16336202818244, 16336202818663,
16336202819068, 16336202819418, 16336202819777, 16336202820193,
16336202820599, 16336202821033, 16336202821395, 16336202821745,
16336202822158, 16336202822590, 16336202822996, 16336202823396,
16336202823804, 16336202824210, 16336202824581, 16336202824991,
16336202825406, 16336202825806, 16336202826210, 16336202826598,
16336202827033, 16336202827446, 16336202827839, 16336202828201,
16336202828577, 16336202828968, 16336202829362, 16336202829709,
16336202830096, 16336202830533, 16336202830917, 16336202831290,
16336202831699, 16336202832035, 16336202832406, 16336202832804,
16336202833200, 16336202833604, 16336202834033, 16336202834386,
16336202834759, 16336202835190, 16336202835621, 16336202836033,
16336202836405, 16336202837191, 16336202837613, 16336202838033,
16336202838374, 16336202838798, 16336202839200, 16336202839603,
16336202840034, 16336202840389, 16336202840783, 16336202841200,
16336202841617, 16336202842034, 16336202842390, 16336202842737,
16336202843158, 16336202843585, 16336202843923, 16336202844313,
16336202844724, 16336202845158, 16336202845576, 16336202845939,
16336202846368, 16336202846728, 16336202847158, 16336202847568,
16336202847911, 16336202848291, 16336202848695, 16336202849103,
16336202849533, 16336202849942, 16336202850368, 16336202850747,
16336202851158, 16336202851549, 16336202851978, 16336202852383,
16336202852725, 16336202853158, 16336202853554, 16336202853961,
16336202854308, 16336202854704, 16336202855060, 16336202855418,
16336202855776, 16336202856203, 16336202856617, 16336202857036,
16336202857455, 16336202857884, 16336202858262, 16336202858658,
16336202859071, 16336202859847, 16336202860237, 16336202860658,
16336202861037, 16336202861452, 16336202861869, 16336202862218,
16336202862590, 16336202863001, 16336202863422, 16336202863857,
16336202864219, 16336202864658, 16336202865047, 16336202865404,
16336202865789, 16336202866210, 16336202866624, 16336202867033,
16336202867380, 16336202867797, 16336202868227, 16336202868658,
16336202869083, 16336202869500, 16336202869906, 16336202870246,
16336202870658, 16336202871086, 16336202871441, 16336202871820,
16336202872204, 16336202872546, 16336202872943, 16336202873380,
16336202873811, 16336202874213, 16336202874566, 16336202874918,
16336202875261, 16336202875655, 16336202876047, 16336202876771,
16336202877202, 16336202877612, 16336202878033, 16336202878412,
16336202878846, 16336202879241, 16336202879658, 16336202880072,
16336202880508, 16336202880901, 16336202881308, 16336202881725,
16336202882158, 16336202882579, 16336202882945, 16336202883286,
16336202883657, 16336202884048, 16336202884404, 16336202884752,
16336202885158, 16336202885533, 16336202885938, 16336202886364,
16336202886759, 16336202887175, 16336202887585, 16336202887929,
16336202888345, 16336202888743, 16336202889157, 16336202889570,
16336202889970, 16336202890382, 16336202890761, 16336202891187,
16336202891600, 16336202892033, 16336202892454, 16336202892794,
16336202893178, 16336202893533, 16336202893903, 16336202894264,
16336202894668, 16336202895049, 16336202895400, 16336202895774,
16336202896157, 16336202896537, 16336202896883, 16336202897232,
16336202897658, 16336202898065, 16336202898493, 16336202898884,
16336202899251, 16336202899673, 16336202900047, 16336202900467,
16336202900883, 16336202901300, 16336202901676, 16336202902068,
16336202902479, 16336202902902, 16336202903260, 16336202903675,
16336202904094, 16336202904476, 16336202904824, 16336202905158,
16336202905533, 16336202905934, 16336202906289, 16336202906717,
16336202907158, 16336202907547, 16336202907904, 16336202908294,
16336202908717, 16336202909157, 16336202909582, 16336202910005,
16336202910399, 16336202910800, 16336202911220, 16336202911657,
16336202912064, 16336202912405, 16336202912779, 16336202913158,
16336202913553, 16336202913966, 16336202914376, 16336202914719,
16336202915091, 16336202915515, 16336202915887, 16336202916293,
16336202916649, 16336202917438, 16336202917869, 16336202918221,
16336202919053, 16336202919425, 16336202919833, 16336202920234,
16336202920658, 16336202921033, 16336202921433, 16336202921801,
16336202922161, 16336202922589, 16336202923017, 16336202923418,
16336202923804, 16336202924199, 16336202924593, 16336202925033,
16336202925449, 16336202925818, 16336202926223, 16336202926662,
16336202927431, 16336202927812, 16336202928227, 16336202928658,
16336202929061, 16336202929473, 16336202929891, 16336202930241,
16336202930657, 16336202931057, 16336202931396, 16336202931811,
16336202932225, 16336202932657, 16336202933058, 16336202933445,
16336202933790, 16336202934157, 16336202934562, 16336202934988,
16336202935391, 16336202935777, 16336202936160, 16336202936562,
16336202936986, 16336202937396, 16336202937751, 16336202938158,
16336202938578, 16336202938985, 16336202939396, 16336202939752,
16336202940157, 16336202940585
16336202536562, 16336202536908, 16336202537294, 16336202537705, 16336202538114, 16336202538534, 16336202538941,
16336202539323, 16336202539742, 16336202540159, 16336202540877, 16336202541310, 16336202541749, 16336202542159,
16336202542565, 16336202542996, 16336202543333, 16336202543761, 16336202544159, 16336202544534, 16336202544944,
16336202545345, 16336202545744, 16336202546159, 16336202546573, 16336202546986, 16336202547399, 16336202547781,
16336202548202, 16336202548564, 16336202548949, 16336202549329, 16336202549762, 16336202550168, 16336202550534,
16336202550887, 16336202551305, 16336202551659, 16336202552060, 16336202552449, 16336202552854, 16336202553270,
16336202553609, 16336202554034, 16336202554437, 16336202554783, 16336202555191, 16336202555623, 16336202556034,
16336202556449, 16336202556890, 16336202557283, 16336202557669, 16336202558084, 16336202558496, 16336202558863,
16336202559271, 16336202559659, 16336202560051, 16336202560452, 16336202560873, 16336202561290, 16336202561659,
16336202562035, 16336202562440, 16336202562862, 16336202563284, 16336202563659, 16336202564034, 16336202564444,
16336202564853, 16336202565245, 16336202565659, 16336202566034, 16336202566455, 16336202566873, 16336202567284,
16336202567659, 16336202568034, 16336202568386, 16336202568790, 16336202569204, 16336202569620, 16336202570384,
16336202570768, 16336202571188, 16336202571551, 16336202572327, 16336202572717, 16336202573116, 16336202573541,
16336202573959, 16336202574319, 16336202574682, 16336202575040, 16336202575375, 16336202577001, 16336202577342,
16336202577680, 16336202578066, 16336202578451, 16336202579166, 16336202579534, 16336202579960, 16336202580370,
16336202580789, 16336202581159, 16336202581576, 16336202581949, 16336202582294, 16336202583087, 16336202583496,
16336202583858, 16336202584203, 16336202584606, 16336202585034, 16336202585386, 16336202585788, 16336202586211,
16336202586604, 16336202587034, 16336202587459, 16336202587869, 16336202588295, 16336202588668, 16336202589092,
16336202589452, 16336202589831, 16336202590197, 16336202590608, 16336202591034, 16336202591460, 16336202591880,
16336202592295, 16336202592727, 16336202593172, 16336202593567, 16336202593994, 16336202594397, 16336202594795,
16336202595224, 16336202595659, 16336202596058, 16336202596463, 16336202596890, 16336202597322, 16336202597732,
16336202598159, 16336202598534, 16336202598951, 16336202599365, 16336202599785, 16336202600159, 16336202600593,
16336202601005, 16336202601402, 16336202601807, 16336202602214, 16336202602556, 16336202602895, 16336202603307,
16336202603661, 16336202604075, 16336202604491, 16336202604853, 16336202605268, 16336202605670, 16336202606034,
16336202606393, 16336202606748, 16336202607170, 16336202607568, 16336202607982, 16336202608411, 16336202608836,
16336202609197, 16336202609596, 16336202609965, 16336202610333, 16336202610740, 16336202611159, 16336202611573,
16336202611975, 16336202612317, 16336202612691, 16336202613060, 16336202613474, 16336202613903, 16336202614341,
16336202614707, 16336202615094, 16336202615534, 16336202615883, 16336202616296, 16336202616671, 16336202617034,
16336202617391, 16336202617727, 16336202618159, 16336202618534, 16336202618937, 16336202619360, 16336202619770,
16336202620179, 16336202620716, 16336202621143, 16336202621534, 16336202622303, 16336202622659, 16336202623085,
16336202623498, 16336202623850, 16336202624220, 16336202624606, 16336202625034, 16336202625387, 16336202625805,
16336202626210, 16336202626599, 16336202627034, 16336202627386, 16336202627748, 16336202628159, 16336202628534,
16336202628954, 16336202629373, 16336202629809, 16336202630197, 16336202630535, 16336202630916, 16336202631290,
16336202631666, 16336202632034, 16336202632369, 16336202633152, 16336202633534, 16336202633883, 16336202634309,
16336202634717, 16336202635106, 16336202635871, 16336202636253, 16336202636671, 16336202637070, 16336202637434,
16336202637798, 16336202638184, 16336202638539, 16336202638938, 16336202639307, 16336202639666, 16336202640095,
16336202640534, 16336202640962, 16336202641307, 16336202641659, 16336202642087, 16336202642521, 16336202642886,
16336202643309, 16336202643662, 16336202644067, 16336202644491, 16336202644853, 16336202645226, 16336202645659,
16336202646074, 16336202646497, 16336202646890, 16336202647311, 16336202647749, 16336202648169, 16336202648976,
16336202649378, 16336202649810, 16336202650165, 16336202650534, 16336202650875, 16336202651250, 16336202651659,
16336202652093, 16336202652516, 16336202652921, 16336202653332, 16336202653722, 16336202654142, 16336202654534,
16336202654880, 16336202655221, 16336202655562, 16336202655997, 16336202656378, 16336202656811, 16336202657161,
16336202657588, 16336202657944, 16336202658360, 16336202658708, 16336202659089, 16336202659428, 16336202659849,
16336202660273, 16336202660685, 16336202661105, 16336202661534, 16336202661873, 16336202662228, 16336202662658,
16336202663438, 16336202663843, 16336202664219, 16336202664646, 16336202665050, 16336202665487, 16336202665838,
16336202666211, 16336202666573, 16336202666927, 16336202667334, 16336202667746, 16336202668158, 16336202668563,
16336202668980, 16336202669406, 16336202669753, 16336202670192, 16336202670554, 16336202670903, 16336202671324,
16336202671734, 16336202672159, 16336202672573, 16336202672982, 16336202673346, 16336202673680, 16336202674087,
16336202674499, 16336202674909, 16336202675260, 16336202676110, 16336202676535, 16336202676913, 16336202677312,
16336202677658, 16336202678044, 16336202678413, 16336202678793, 16336202679208, 16336202679604, 16336202680034,
16336202680385, 16336202680799, 16336202681213, 16336202681595, 16336202682004, 16336202682346, 16336202682726,
16336202683158, 16336202683586, 16336202683990, 16336202684323, 16336202684742, 16336202685175, 16336202685578,
16336202685979, 16336202686805, 16336202687206, 16336202687614, 16336202688038, 16336202688473, 16336202688848,
16336202689221, 16336202689559, 16336202689971, 16336202690368, 16336202690776, 16336202691159, 16336202691585,
16336202692010, 16336202692373, 16336202692780, 16336202693179, 16336202693580, 16336202693991, 16336202694324,
16336202694727, 16336202695159, 16336202695588, 16336202695991, 16336202696335, 16336202697160, 16336202697542,
16336202697929, 16336202698323, 16336202698674, 16336202699060, 16336202699492, 16336202699835, 16336202700238,
16336202700658, 16336202701059, 16336202701420, 16336202701815, 16336202702229, 16336202702659, 16336202703857,
16336202704256, 16336202704659, 16336202705497, 16336202706309, 16336202706660, 16336202707085, 16336202707511,
16336202707866, 16336202708210, 16336202708552, 16336202708925, 16336202709287, 16336202709670, 16336202710045,
16336202710402, 16336202710802, 16336202711167, 16336202711533, 16336202712249, 16336202712660, 16336202713088,
16336202713519, 16336202713936, 16336202714355, 16336202714740, 16336202715160, 16336202715533, 16336202715878,
16336202716290, 16336202716708, 16336202717102, 16336202718290, 16336202718699, 16336202719052, 16336202719388,
16336202719808, 16336202720225, 16336202720659, 16336202721052, 16336202721414, 16336202721828, 16336202722925,
16336202723664, 16336202724063, 16336202724405, 16336202726003, 16336202726736, 16336202727158, 16336202727543,
16336202727930, 16336202728336, 16336202728703, 16336202729061, 16336202729483, 16336202729832, 16336202730222,
16336202730659, 16336202731084, 16336202731500, 16336202731911, 16336202732326, 16336202733158, 16336202733585,
16336202734001, 16336202734691, 16336202735042, 16336202735442, 16336202735863, 16336202736255, 16336202736671,
16336202737043, 16336202737884, 16336202738671, 16336202739110, 16336202739533, 16336202739886, 16336202740283,
16336202740706, 16336202741143, 16336202741534, 16336202741942, 16336202742352, 16336202742697, 16336202743103,
16336202743940, 16336202745172, 16336202745542, 16336202745937, 16336202746339, 16336202746758, 16336202747531,
16336202747877, 16336202748232, 16336202748658, 16336202749055, 16336202749468, 16336202749859, 16336202750416,
16336202750839, 16336202751178, 16336202751572, 16336202752002, 16336202752419, 16336202753269, 16336202753678,
16336202754086, 16336202754432, 16336202754835, 16336202755260, 16336202755683, 16336202756059, 16336202756402,
16336202756837, 16336202758084, 16336202758507, 16336202758879, 16336202759270, 16336202759674, 16336202760044,
16336202760400, 16336202760801, 16336202761659, 16336202762053, 16336202762397, 16336202763199, 16336202763547,
16336202763948, 16336202764714, 16336202765113, 16336202765947, 16336202766329, 16336202766664, 16336202767085,
16336202768233, 16336202769056, 16336202769758, 16336202770178, 16336202770585, 16336202770929, 16336202771325,
16336202772158, 16336202772594, 16336202773033, 16336202773403, 16336202773801, 16336202774179, 16336202774555,
16336202774989, 16336202775393, 16336202775809, 16336202776209, 16336202776618, 16336202777033, 16336202777421,
16336202777845, 16336202778246, 16336202778658, 16336202779055, 16336202779411, 16336202779761, 16336202780175,
16336202780594, 16336202781002, 16336202781848, 16336202782658, 16336202783033, 16336202783857, 16336202784211,
16336202784557, 16336202784972, 16336202785377, 16336202785810, 16336202786172, 16336202786934, 16336202787343,
16336202787765, 16336202788201, 16336202788563, 16336202788970, 16336202789329, 16336202789672, 16336202790055,
16336202790456, 16336202790802, 16336202791580, 16336202791920, 16336202792326, 16336202793158, 16336202793953,
16336202794368, 16336202795187, 16336202795622, 16336202796033, 16336202796393, 16336202796777, 16336202797173,
16336202797540, 16336202797975, 16336202798317, 16336202798739, 16336202799158, 16336202799567, 16336202799966,
16336202800378, 16336202800803, 16336202801232, 16336202801658, 16336202802033, 16336202802374, 16336202802759,
16336202803158, 16336202803533, 16336202803947, 16336202804354, 16336202804729, 16336202805158, 16336202805534,
16336202805950, 16336202806390, 16336202806805, 16336202807219, 16336202807643, 16336202808033, 16336202808377,
16336202808790, 16336202809211, 16336202809560, 16336202809920, 16336202810355, 16336202810758, 16336202811187,
16336202811596, 16336202811943, 16336202812348, 16336202812710, 16336202813060, 16336202813398, 16336202813791,
16336202814158, 16336202814533, 16336202814878, 16336202815246, 16336202815658, 16336202816079, 16336202816851,
16336202817202, 16336202817540, 16336202817905, 16336202818244, 16336202818663, 16336202819068, 16336202819418,
16336202819777, 16336202820193, 16336202820599, 16336202821033, 16336202821395, 16336202821745, 16336202822158,
16336202822590, 16336202822996, 16336202823396, 16336202823804, 16336202824210, 16336202824581, 16336202824991,
16336202825406, 16336202825806, 16336202826210, 16336202826598, 16336202827033, 16336202827446, 16336202827839,
16336202828201, 16336202828577, 16336202828968, 16336202829362, 16336202829709, 16336202830096, 16336202830533,
16336202830917, 16336202831290, 16336202831699, 16336202832035, 16336202832406, 16336202832804, 16336202833200,
16336202833604, 16336202834033, 16336202834386, 16336202834759, 16336202835190, 16336202835621, 16336202836033,
16336202836405, 16336202837191, 16336202837613, 16336202838033, 16336202838374, 16336202838798, 16336202839200,
16336202839603, 16336202840034, 16336202840389, 16336202840783, 16336202841200, 16336202841617, 16336202842034,
16336202842390, 16336202842737, 16336202843158, 16336202843585, 16336202843923, 16336202844313, 16336202844724,
16336202845158, 16336202845576, 16336202845939, 16336202846368, 16336202846728, 16336202847158, 16336202847568,
16336202847911, 16336202848291, 16336202848695, 16336202849103, 16336202849533, 16336202849942, 16336202850368,
16336202850747, 16336202851158, 16336202851549, 16336202851978, 16336202852383, 16336202852725, 16336202853158,
16336202853554, 16336202853961, 16336202854308, 16336202854704, 16336202855060, 16336202855418, 16336202855776,
16336202856203, 16336202856617, 16336202857036, 16336202857455, 16336202857884, 16336202858262, 16336202858658,
16336202859071, 16336202859847, 16336202860237, 16336202860658, 16336202861037, 16336202861452, 16336202861869,
16336202862218, 16336202862590, 16336202863001, 16336202863422, 16336202863857, 16336202864219, 16336202864658,
16336202865047, 16336202865404, 16336202865789, 16336202866210, 16336202866624, 16336202867033, 16336202867380,
16336202867797, 16336202868227, 16336202868658, 16336202869083, 16336202869500, 16336202869906, 16336202870246,
16336202870658, 16336202871086, 16336202871441, 16336202871820, 16336202872204, 16336202872546, 16336202872943,
16336202873380, 16336202873811, 16336202874213, 16336202874566, 16336202874918, 16336202875261, 16336202875655,
16336202876047, 16336202876771, 16336202877202, 16336202877612, 16336202878033, 16336202878412, 16336202878846,
16336202879241, 16336202879658, 16336202880072, 16336202880508, 16336202880901, 16336202881308, 16336202881725,
16336202882158, 16336202882579, 16336202882945, 16336202883286, 16336202883657, 16336202884048, 16336202884404,
16336202884752, 16336202885158, 16336202885533, 16336202885938, 16336202886364, 16336202886759, 16336202887175,
16336202887585, 16336202887929, 16336202888345, 16336202888743, 16336202889157, 16336202889570, 16336202889970,
16336202890382, 16336202890761, 16336202891187, 16336202891600, 16336202892033, 16336202892454, 16336202892794,
16336202893178, 16336202893533, 16336202893903, 16336202894264, 16336202894668, 16336202895049, 16336202895400,
16336202895774, 16336202896157, 16336202896537, 16336202896883, 16336202897232, 16336202897658, 16336202898065,
16336202898493, 16336202898884, 16336202899251, 16336202899673, 16336202900047, 16336202900467, 16336202900883,
16336202901300, 16336202901676, 16336202902068, 16336202902479, 16336202902902, 16336202903260, 16336202903675,
16336202904094, 16336202904476, 16336202904824, 16336202905158, 16336202905533, 16336202905934, 16336202906289,
16336202906717, 16336202907158, 16336202907547, 16336202907904, 16336202908294, 16336202908717, 16336202909157,
16336202909582, 16336202910005, 16336202910399, 16336202910800, 16336202911220, 16336202911657, 16336202912064,
16336202912405, 16336202912779, 16336202913158, 16336202913553, 16336202913966, 16336202914376, 16336202914719,
16336202915091, 16336202915515, 16336202915887, 16336202916293, 16336202916649, 16336202917438, 16336202917869,
16336202918221, 16336202919053, 16336202919425, 16336202919833, 16336202920234, 16336202920658, 16336202921033,
16336202921433, 16336202921801, 16336202922161, 16336202922589, 16336202923017, 16336202923418, 16336202923804,
16336202924199, 16336202924593, 16336202925033, 16336202925449, 16336202925818, 16336202926223, 16336202926662,
16336202927431, 16336202927812, 16336202928227, 16336202928658, 16336202929061, 16336202929473, 16336202929891,
16336202930241, 16336202930657, 16336202931057, 16336202931396, 16336202931811, 16336202932225, 16336202932657,
16336202933058, 16336202933445, 16336202933790, 16336202934157, 16336202934562, 16336202934988, 16336202935391,
16336202935777, 16336202936160, 16336202936562, 16336202936986, 16336202937396, 16336202937751, 16336202938158,
16336202938578, 16336202938985, 16336202939396, 16336202939752, 16336202940157, 16336202940585
],
"frameTimes": [
346, 411, 420, 382, 417, 433, 410, 431, 428, 375, 401, 415, 413, 382, 362,
380, 406, 353, 354, 389, 416, 425, 346, 432, 415, 393, 415, 367, 388, 401,
417, 376, 422, 375, 410, 392, 375, 418, 375, 352, 414, 764, 420, 776, 399,
418, 363, 335, 341, 386, 715, 426, 419, 417, 345, 409, 345, 428, 402, 393,
425, 426, 424, 379, 411, 426, 415, 445, 427, 398, 435, 405, 432, 427, 417,
420, 434, 397, 407, 339, 354, 416, 415, 364, 355, 398, 429, 361, 369, 407,
414, 342, 369, 429, 366, 440, 413, 363, 336, 375, 423, 409, 427, 769, 426,
352, 386, 353, 405, 435, 362, 375, 419, 388, 381, 376, 335, 382, 426, 389,
382, 399, 364, 355, 369, 429, 428, 352, 434, 423, 405, 362, 433, 423, 421,
420, 402, 355, 341, 409, 423, 411, 420, 346, 341, 381, 350, 356, 348, 339,
424, 420, 339, 430, 405, 427, 437, 373, 354, 412, 405, 426, 439, 349, 410,
414, 364, 407, 410, 850, 378, 346, 369, 415, 430, 414, 382, 342, 432, 404,
419, 403, 826, 408, 435, 373, 412, 408, 426, 363, 399, 411, 403, 429, 344,
382, 394, 386, 343, 420, 361, 414, 1198, 403, 812, 425, 355, 342, 362, 375,
400, 366, 411, 431, 419, 420, 345, 418, 1188, 353, 420, 434, 362, 1097, 399,
1598, 422, 387, 367, 422, 390, 425, 411, 832, 416, 351, 421, 416, 841, 439,
353, 423, 391, 410, 406, 1232, 395, 419, 346, 426, 413, 557, 339, 430, 850,
408, 403, 423, 343, 1247, 372, 404, 356, 858, 344, 348, 766, 834, 335, 1148,
702, 407, 396, 436, 370, 378, 434, 416, 409, 388, 401, 397, 350, 419, 846,
375, 354, 415, 433, 762, 422, 362, 359, 383, 346, 340, 832, 415, 435, 360,
396, 435, 422, 409, 412, 429, 375, 385, 375, 407, 429, 416, 415, 424, 344,
421, 360, 403, 409, 405, 350, 393, 375, 368, 421, 351, 365, 419, 350, 416,
434, 350, 432, 400, 406, 410, 400, 388, 413, 362, 391, 347, 437, 373, 336,
398, 404, 353, 431, 412, 786, 420, 424, 403, 355, 417, 417, 347, 427, 390,
434, 363, 360, 410, 380, 408, 409, 379, 391, 405, 433, 407, 396, 358, 427,
419, 429, 396, 776, 421, 415, 349, 411, 435, 439, 357, 421, 409, 417, 431,
417, 340, 428, 379, 342, 437, 402, 352, 394, 724, 410, 379, 395, 414, 393,
417, 421, 341, 391, 348, 375, 426, 416, 344, 398, 413, 412, 426, 433, 340,
355, 361, 381, 374, 380, 349, 407, 391, 422, 420, 417, 392, 423, 415, 382,
334, 401, 428, 389, 390, 440, 423, 401, 437, 341, 379, 413, 343, 424, 406,
789, 352, 372, 401, 375, 368, 428, 401, 395, 440, 369, 439, 381, 431, 412,
350, 400, 415, 432, 387, 367, 426, 386, 402, 410, 407, 407, 356, 428
346, 411, 420, 382, 417, 433, 410, 431, 428, 375, 401, 415, 413, 382, 362, 380, 406, 353, 354, 389, 416, 425, 346,
432, 415, 393, 415, 367, 388, 401, 417, 376, 422, 375, 410, 392, 375, 418, 375, 352, 414, 764, 420, 776, 399, 418,
363, 335, 341, 386, 715, 426, 419, 417, 345, 409, 345, 428, 402, 393, 425, 426, 424, 379, 411, 426, 415, 445, 427,
398, 435, 405, 432, 427, 417, 420, 434, 397, 407, 339, 354, 416, 415, 364, 355, 398, 429, 361, 369, 407, 414, 342,
369, 429, 366, 440, 413, 363, 336, 375, 423, 409, 427, 769, 426, 352, 386, 353, 405, 435, 362, 375, 419, 388, 381,
376, 335, 382, 426, 389, 382, 399, 364, 355, 369, 429, 428, 352, 434, 423, 405, 362, 433, 423, 421, 420, 402, 355,
341, 409, 423, 411, 420, 346, 341, 381, 350, 356, 348, 339, 424, 420, 339, 430, 405, 427, 437, 373, 354, 412, 405,
426, 439, 349, 410, 414, 364, 407, 410, 850, 378, 346, 369, 415, 430, 414, 382, 342, 432, 404, 419, 403, 826, 408,
435, 373, 412, 408, 426, 363, 399, 411, 403, 429, 344, 382, 394, 386, 343, 420, 361, 414, 1198, 403, 812, 425, 355,
342, 362, 375, 400, 366, 411, 431, 419, 420, 345, 418, 1188, 353, 420, 434, 362, 1097, 399, 1598, 422, 387, 367,
422, 390, 425, 411, 832, 416, 351, 421, 416, 841, 439, 353, 423, 391, 410, 406, 1232, 395, 419, 346, 426, 413, 557,
339, 430, 850, 408, 403, 423, 343, 1247, 372, 404, 356, 858, 344, 348, 766, 834, 335, 1148, 702, 407, 396, 436, 370,
378, 434, 416, 409, 388, 401, 397, 350, 419, 846, 375, 354, 415, 433, 762, 422, 362, 359, 383, 346, 340, 832, 415,
435, 360, 396, 435, 422, 409, 412, 429, 375, 385, 375, 407, 429, 416, 415, 424, 344, 421, 360, 403, 409, 405, 350,
393, 375, 368, 421, 351, 365, 419, 350, 416, 434, 350, 432, 400, 406, 410, 400, 388, 413, 362, 391, 347, 437, 373,
336, 398, 404, 353, 431, 412, 786, 420, 424, 403, 355, 417, 417, 347, 427, 390, 434, 363, 360, 410, 380, 408, 409,
379, 391, 405, 433, 407, 396, 358, 427, 419, 429, 396, 776, 421, 415, 349, 411, 435, 439, 357, 421, 409, 417, 431,
417, 340, 428, 379, 342, 437, 402, 352, 394, 724, 410, 379, 395, 414, 393, 417, 421, 341, 391, 348, 375, 426, 416,
344, 398, 413, 412, 426, 433, 340, 355, 361, 381, 374, 380, 349, 407, 391, 422, 420, 417, 392, 423, 415, 382, 334,
401, 428, 389, 390, 440, 423, 401, 437, 341, 379, 413, 343, 424, 406, 789, 352, 372, 401, 375, 368, 428, 401, 395,
440, 369, 439, 381, 431, 412, 350, 400, 415, 432, 387, 367, 426, 386, 402, 410, 407, 407, 356, 428
],
"percentileMs": {
"50": 40.7,

View File

@@ -25,6 +25,5 @@
},
"devDependencies": {
"fast-deep-equal": "^3.1.3"
},
"prettier": "../.prettierrc.cjs"
}
}

70
biome.json Normal file
View File

@@ -0,0 +1,70 @@
{
"$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
"organizeImports": {
"enabled": true
},
"linter": {
"enabled": false
},
"javascript": {
"parser": {
"unsafeParameterDecoratorsEnabled": true
},
"formatter": {
"arrowParentheses": "asNeeded",
"quoteProperties": "preserve",
"semicolons": "always",
"trailingComma": "all",
"indentStyle": "space",
"quoteStyle": "double"
}
},
"json": {
"formatter": {
"indentStyle": "space"
},
"parser": {
"allowComments": true,
"allowTrailingCommas": true
}
},
"vcs": {
"clientKind": "git",
"enabled": false,
"root": "./"
},
"files": {
"maxSize": 9128312873
},
"formatter": {
"enabled": true,
"indentWidth": 2,
"lineEnding": "lf",
"formatWithErrors": true,
"lineWidth": 120,
"indentStyle": "space",
"ignore": [
"node_modules/**",
"test/snapshots",
"test/fixtures",
".next",
"test/js/deno",
"./src/deps",
"./src/bun.js/WebKit/**",
"packages/bun-polyfills",
"./build-*",
"./build",
".cache",
"out/",
"test/transpiler/property-non-ascii-fixture.js",
"test/transpiler/macro-test.test.ts",
"test/transpiler/decorator-metadata.test.ts",
"src/react-refresh.js",
"bindings-obj/*",
"src/deps/**",
"./bench/react-hello-world/react-hello-world.node.js",
"./test/cli/run/require-cache-bug-leak-fixture-large-ast.js",
"./test/cli/run/esm-leak-fixture-large-ast.mjs"
]
}
}

View File

@@ -591,6 +591,7 @@ pub fn build_(b: *Build) !void {
\\For more info, see https://bun.sh/docs/project/contributing
\\
});
b.default_step.dependOn(&mistake_message.step);
}

BIN
bun.lockb

Binary file not shown.

View File

@@ -65,19 +65,19 @@ Below we create a new `DataView` and set the first byte to 5.
```ts
const buf = new ArrayBuffer(4);
// [0x0, 0x0, 0x0, 0x0]
// [0b00000000, 0b00000000, 0b00000000, 0b00000000]
const dv = new DataView(buf);
dv.setUint8(0, 3); // write value 3 at byte offset 0
dv.getUint8(0); // => 3
// [0x11, 0x0, 0x0, 0x0]
// [0b00000011, 0b00000000, 0b00000000, 0b00000000]
```
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`.
```ts
dv.setUint16(1, 513);
// [0x11, 0x10, 0x1, 0x0]
// [0b00000011, 0b00000010, 0b00000001, 0b00000000]
console.log(dv.getUint16(1)); // => 513
```

View File

@@ -7,7 +7,7 @@ Bun includes a fast native implementation of file globbing.
```ts
import { Glob } from "bun";
const glob = new Glob("*.ts");
const glob = new Glob("**/*.ts");
// Scans the current working directory and each of its sub-directories recursively
for await (const file of glob.scan(".")) {

View File

@@ -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
const response = new Response(async function* () {
yield "hello";
yield "world";
}());
await response.text(); // "helloworld"
```
You can also use `[Symbol.asyncIterator]` directly.
```ts
const response = new Response({
[Symbol.asyncIterator]: async function* () {
yield "hello";
yield "world";
},
});
await response.text(); // "helloworld"
```
If you need more granular control over the stream, `yield` will return the direct ReadableStream controller.
```ts
const response = new Response({
[Symbol.asyncIterator]: async function* () {
const controller = yield "hello";
await controller.end();
},
});
await response.text(); // "hello"
```
## `Bun.ArrayBufferSink`
The `Bun.ArrayBufferSink` class is a fast incremental writer for constructing an `ArrayBuffer` of unknown size.

View File

@@ -50,7 +50,7 @@ export default jsx(
To override the default loader specified in the `new Bun.Transpiler()` constructor, pass a second argument to `.transformSync()`.
```ts
await transpiler.transform("<div>hi!</div>", "tsx");
transpiler.transformSync("<div>hi!</div>", "tsx");
```
{% details summary="Nitty gritty" %}

View File

@@ -182,12 +182,12 @@ const server = Bun.serve<{ username: string }>({
open(ws) {
const msg = `${ws.data.username} has entered the chat`;
ws.subscribe("the-group-chat");
ws.publish("the-group-chat", msg);
server.publish("the-group-chat", msg);
},
message(ws, message) {
// this is a group chat
// so the server re-broadcasts incoming message to everyone
ws.publish("the-group-chat", `${ws.data.username}: ${message}`);
server.publish("the-group-chat", `${ws.data.username}: ${message}`);
},
close(ws) {
const msg = `${ws.data.username} has left the chat`;

View File

@@ -43,7 +43,7 @@ Let's build our first bundle. You have the following two files, which implement
import * as ReactDOM from 'react-dom/client';
import {Component} from "./Component"
const root = ReactDOM.createRoot(document.getElementById('root'));
const root = ReactDOM.createRoot(document.getElementById('root')!);
root.render(<Component message="Sup!" />)
```
@@ -155,7 +155,7 @@ Like the Bun runtime, the bundler supports an array of file types out of the box
---
- `.js` `.cjs` `.mjs` `.mts` `.cts` `.ts` `.tsx`
- `.js` `.jsx`, `.cjs` `.mjs` `.mts` `.cts` `.ts` `.tsx`
- 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.
---

View File

@@ -63,6 +63,12 @@ $ bunx --bun my-cli # good
$ bunx my-cli --bun # bad
```
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:

View File

@@ -35,6 +35,6 @@ It creates:
If you pass `-y` or `--yes`, it will assume you want to continue without asking questions.
At the end, it runs `bun install` to install `bun-types`.
At the end, it runs `bun install` to install `@types/bun`.
{% /details %}

View File

@@ -113,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();
@@ -151,7 +147,7 @@ Snapshots are supported by `bun test`.
// example usage of toMatchSnapshot
import { test, expect } from "bun:test";
test("snapshot", async () => {
test("snapshot", () => {
expect({ a: 1 }).toMatchSnapshot();
});
```

View File

@@ -0,0 +1,46 @@
---
name: Common HTTP server usage
---
This starts an HTTP server listening on port `3000`. It demonstates basic routing with a number of common responses and also handles POST data from standard forms or as JSON.
See [`Bun.serve`](/docs/api/http) for details.
```ts
const server = Bun.serve({
async fetch (req) {
const path = new URL(req.url).pathname;
// respond with text/html
if (path === "/") return new Response("Welcome to Bun!");
// redirect
if (path === "/abc") return Response.redirect("/source", 301);
// send back a file (in this case, *this* file)
if (path === "/source") return new Response(Bun.file(import.meta.file));
// respond with JSON
if (path === "/api") return Response.json({ some: "buns", for: "you" });
// receive JSON data to a POST request
if (req.method === "POST" && path === "/api/post") {
const data = await req.json();
console.log("Received JSON:", data);
return Response.json({ success: true, data });
}
// receive POST data from a form
if (req.method === "POST" && path === "/form") {
const data = await req.formData();
console.log(data.get("someField"));
return new Response("Success");
}
// 404s
return new Response("Page not found", { status: 404 });
}
})
console.log(`Listening on ${server.url}`);
```

View File

@@ -15,13 +15,13 @@ Below is the full set of recommended `compilerOptions` for a Bun project. With t
```jsonc
{
"compilerOptions": {
// enable latest features
// Enable latest features
"lib": ["ESNext"],
"target": "ESNext",
"module": "ESNext",
"moduleDetection": "force",
"jsx": "react-jsx", // support JSX
"allowJs": true, // allow importing `.js` from `.ts`
"jsx": "react-jsx",
"allowJs": true,
// Bundler mode
"moduleResolution": "bundler",
@@ -32,12 +32,11 @@ Below is the full set of recommended `compilerOptions` for a Bun project. With t
// Best practices
"strict": true,
"skipLibCheck": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
// Some stricter flags
"useUnknownInCatchVariables": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noPropertyAccessFromIndexSignature": true
}
}

View File

@@ -93,7 +93,7 @@ $ bun test --timeout 10000
Many other flags become irrelevant or obsolete when using `bun test`.
- `transform` — Buns supports TypeScript & JSX. Other file types can be configured with [Plugins](/docs/runtime/plugins).
- `transform` — Bun supports TypeScript & JSX. Other file types can be configured with [Plugins](/docs/runtime/plugins).
- `extensionsToTreatAsEsm`
- `haste` — Bun uses it's own internal source maps
- `watchman`, `watchPlugins`, `watchPathIgnorePatterns` — use `--watch` to run tests in watch mode

View File

@@ -20,11 +20,11 @@ const server = Bun.serve<{ username: string }>({
open(ws) {
const msg = `${ws.data.username} has entered the chat`;
ws.subscribe("the-group-chat");
ws.publish("the-group-chat", msg);
server.publish("the-group-chat", msg);
},
message(ws, message) {
// the server re-broadcasts incoming messages to everyone
ws.publish("the-group-chat", `${ws.data.username}: ${message}`);
server.publish("the-group-chat", `${ws.data.username}: ${message}`);
},
close(ws) {
const msg = `${ws.data.username} has left the chat`;

View File

@@ -233,6 +233,10 @@ If you need to remove Bun from your system, use the following commands.
$ rm -rf ~/.bun # for macOS, Linux, and WSL
```
```bash#Windows
$ Remove-Item ~\.bun -Recurse
```
```bash#NPM
$ npm uninstall -g bun
```

View File

@@ -369,6 +369,9 @@ export default {
page("project/contributing", "Contributing", {
description: "Learn how to contribute to Bun and get your local development environment up and running.",
}),
page("project/building-windows", "Building Windows", {
description: "Learn how to setup a development environment for contributing to the Windows build of Bun.",
}),
page("project/licensing", "License", {
description: `Bun is a MIT-licensed project with a large number of statically-linked dependencies with various licenses.`,
}),

View File

@@ -1,13 +1,15 @@
The following document is not yet complete, please join the [#windows channel on our Discord](http://bun.sh/discord) for help.
This document describes the build process for Windows. If you run into problems, please join the [#windows channel on our Discord](http://bun.sh/discord) for help.
It is strongly recommended to use [PowerShell 7 (`pwsh.exe`)](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4) instead of the default `powershell.exe`.
## Prerequisites
<!--
{% details summary="Extra notes for Bun Core Team Members" %}
Here are the extra steps I ran on my fresh windows machine (some of these are a little opiniated)
- Change user to a local account (set username to `window` and empty password)
- (Empty password will disable the password and auto-login on boot)
- Change user to a local account (set username to `window` and 'bun!')
- Set Windows Terminal as default terminal
- Install latest version of Powershell
- Display scale to 100%
@@ -30,17 +32,11 @@ Here are the extra steps I ran on my fresh windows machine (some of these are a
I recommend using VSCode through SSH instead of Tunnels or the Tailscale extension, it seems to be more reliable.
{% /details %}
Make sure to use powershell with the proper shell environment loaded. To do so, you can run:
```ps1
.\scripts\env.ps1
```
{% /details %} -->
### Enable Scripts
By default, scripts are blocked.
By default, running unverified scripts are blocked.
```ps1
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
@@ -48,8 +44,14 @@ Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
### System Dependencies
- Bun 1.1 or later. We use Bun to run it's own code generators.
```ps1
irm bun.sh/install.ps1 | iex
```
- [Visual Studio](https://visualstudio.microsoft.com) with the "Desktop Development with C++" workload.
- Install Git and CMake from here, if not already installed.
- Install Git and CMake from this installer, if not already installed.
After Visual Studio, you need the following:
@@ -59,25 +61,31 @@ After Visual Studio, you need the following:
- NASM
- Perl
- Ruby
- Node.js (until bun is stable enough on windows)
- Node.js
[Scoop](https://scoop.sh) can be used to install these easily.
{% callout %}
The Zig compiler is automatically downloaded, installed, and updated by the building process.
{% /callout %}
[Scoop](https://scoop.sh) can be used to install these remaining tools easily:
```ps1
irm https://get.scoop.sh | iex
```bash
scoop install nodejs-lts go rust nasm ruby perl
scoop llvm@16.0.4 # scoop bug if you install llvm and the rest at the same time
```
If you intend on building WebKit locally (optional), you should install some more packages:
If you intend on building WebKit locally (optional), you should install these packages:
```bash
```ps1
scoop install make cygwin python
```
From here on out, it is **expected you use a Developer PowerShell Terminal with `.\scripts\env.ps1 sourced**. This script is available in the Bun repository and can be loaded by executing it.
From here on out, it is **expected you use a PowerShell Terminal with `.\scripts\env.ps1` sourced**. This script is available in the Bun repository and can be loaded by executing it:
```ps1
$ .\scripts\env.ps1
.\scripts\env.ps1
```
To verify, you can check for an MSVC-only command line such as `mt.exe`
@@ -86,55 +94,55 @@ To verify, you can check for an MSVC-only command line such as `mt.exe`
Get-Command mt
```
### Zig
Bun pins a version of Zig. As the compiler is still in development, breaking changes happen often that will break the build. It is recommended to use [Zigup](https://github.com/marler8997/zigup/releases) as it can quickly switch to any version by name, but you can also [manually download Zig](https://ziglang.org/download/).
```bash
$ zigup 0.12.0-dev.1604+caae40c21
```
{% callout %}
We last updated Zig on **October 26th, 2023**
It is not recommended to install `ninja` / `cmake` into your global path, because you may run into a situation where you try to build bun without .\scripts\env.ps1 sourced.
{% /callout %}
### Codegen
On Unix platforms, we depend on an existing build of Bun to generate code for itself. Since the Windows build is not stable enough for this to run the code generators, you currently need to use another computer or WSL to generate this:
```bash
$ wsl --install # run twice if it doesnt install
# in the linux environment
$ sudo apt install unzip
$ curl -fsSL https://bun.sh/install | bash
```
Whenever codegen-related things are updated, please re-run
```ps1
$ .\scripts\codegen.ps1
```
## Building
```ps1
npm install
bun install
.\scripts\env.ps1
.\scripts\update-submodules.ps1
.\scripts\all-dependencies.ps1
.\scripts\codegen.ps1
.\scripts\update-submodules.ps1 # this syncs git submodule state
.\scripts\all-dependencies.ps1 # this builds all dependencies
.\scripts\make-old-js.ps1 # runs some old code generators
cd build # this was created by the codegen.ps1 script in the prerequisites
# Configure build environment
cmake -Bbuild -GNinja -DCMAKE_BUILD_TYPE=Debug
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Debug
ninja
# Build bun
ninja -Cbuild
```
If this was successful, you should have a `bun-debug.exe` in the `build` folder.
```ps1
.\bun-debug.exe --version
.\build\bun-debug.exe --revision
```
You should add this to `$Env:PATH`. The simplest way to do so is to open the start menu, type "Path", and then navigate the environment variables menu to add `C:\.....\bun\build` to the user environment variable `PATH`. You should then restart your editor (if it does not update still, log out and log back in).
## Extra paths
- WebKit is extracted to `build/bun-webkit`
- Zig is extracted to `.cache/zig/zig.exe`
## Tests
You can run the test suite either using `bun test`, or by using the wrapper script `packages\bun-internal-test`. The internal test package is a wrapper cli to run every test file in a separate instance of bun.exe, to prevent a crash in the test runner from stopping the entire suite.
```ps1
# Setup
bun i --cwd packages\bun-internal-test
# Run the entire test suite with reporter
# the package.json script "test" uses "build/bun-debug.exe" by default
bun run test
# Run an individual test file:
bun-debug test node\fs
bun-debug test "C:\bun\test\js\bun\resolve\import-meta.test.js"
```
## Troubleshooting

View File

@@ -105,6 +105,8 @@ $ export PATH="$PATH:/usr/lib/llvm16/bin"
{% /codetabs %}
> ⚠️ Ubuntu distributions may require installation of the C++ standard library independently. See the [troubleshooting section](#span-file-not-found-on-ubuntu) for more information.
## Building Bun
After cloning the repository, run the following command to run the first build. This may take a while as it will clone submodules and build dependencies.
@@ -252,6 +254,16 @@ fatal error: 'span' file not found
^~~~~~
```
The issue may manifest when initially running `bun setup` as Clang being unable to compile a simple program:
```
The C++ compiler
"/usr/bin/clang++-16"
is not able to compile a simple test program.
```
To fix the error, we need to update the GCC version to 11. To do this, we'll need to check if the latest version is available in the distribution's official repositories or use a third-party repository that provides GCC 11 packages. Here are general steps:
```bash

View File

@@ -45,18 +45,25 @@ console.log(`Listening on http://localhost:${server.port} ...`);
{% details summary="Seeing TypeScript errors on `Bun`?" %}
If you used `bun init`, Bun will have automatically installed Bun's TypeScript declarations and configured your `tsconfig.json`. If you're trying out Bun in an existing project, you may see a type error on the `Bun` global.
To fix this, first install `bun-types` as a dev dependency.
To fix this, first install `@types/bun` as a dev dependency.
```sh
$ bun add -d bun-types
$ bun add -d @types/bun
```
Then add the following line to your `compilerOptions` in `tsconfig.json`.
Then add the following to your `compilerOptions` in `tsconfig.json`:
```json-diff#tsconfig.json
```json#tsconfig.json
{
"compilerOptions": {
+ "types": ["bun-types"]
"lib": ["ESNext"],
"target": "ESNext",
"module": "ESNext",
"moduleDetection": "force",
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"verbatimModuleSyntax": true,
"noEmit": true,
}
}
```
@@ -117,12 +124,12 @@ Update `index.ts` to use `figlet` in the `fetch` handler.
+ import figlet from "figlet";
const server = Bun.serve({
fetch() {
port: 3000,
fetch(req) {
+ const body = figlet.textSync("Bun!");
+ return new Response(body);
- return new Response("Bun!");
},
port: 3000,
});
```

View File

@@ -298,7 +298,7 @@ Valid values are:
---
- `"fallback"`
- Check local `node_modules` first, the auto-install any packages that aren't found. You can enable this from the CLI with `bun -i`.
- Check local `node_modules` first, then auto-install any packages that aren't found. You can enable this from the CLI with `bun -i`.
{% /table %}

View File

@@ -116,7 +116,7 @@ Some methods are not optimized yet.
### [`node:stream`](https://nodejs.org/api/stream.html)
🟡 Missing `getDefaultHighWaterMark` `setDefaultHighWaterMark`
🟡 Missing `getDefaultHighWaterMark` `setDefaultHighWaterMark` `toWeb`
### [`node:string_decoder`](https://nodejs.org/api/string_decoder.html)
@@ -312,23 +312,23 @@ The table below lists all globals implemented by Node.js and Bun's current compa
### [`PerformanceEntry`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry)
🔴 Not implemented.
🟢 Fully implemented.
### [`PerformanceMark`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceMark)
🔴 Not implemented.
🟢 Fully implemented.
### [`PerformanceMeasure`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceMeasure)
🔴 Not implemented.
🟢 Fully implemented.
### [`PerformanceObserver`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver)
🔴 Not implemented.
🟢 Fully implemented.
### [`PerformanceObserverEntryList`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserverEntryList)
🔴 Not implemented.
🟢 Fully implemented.
### [`PerformanceResourceTiming`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming)
@@ -356,11 +356,11 @@ The table below lists all globals implemented by Node.js and Bun's current compa
### [`ReadableStreamBYOBReader`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader)
🔴 Not implemented.
🟢 Fully implemented.
### [`ReadableStreamBYOBRequest`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBRequest)
🔴 Not implemented.
🟢 Fully implemented.
### [`ReadableStreamDefaultController`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultController)

View File

@@ -214,7 +214,7 @@ With this plugin, Svelte components can now be directly imported and consumed.
import "./sveltePlugin.ts";
import MySvelteComponent from "./component.svelte";
console.log(mySvelteComponent.render());
console.log(MySvelteComponent.render());
```
## Virtual Modules

View File

@@ -269,7 +269,7 @@ import { $ } from "bun";
const search = "bun";
for await (let line of await $`cat list.txt | grep ${search}`.lines()) {
for await (let line of $`cat list.txt | grep ${search}`.lines()) {
console.log(line);
}
```
@@ -322,15 +322,26 @@ await $.braces(`echo {1,2,3}`);
// => ["echo 1", "echo 2", "echo 3"]
```
### `$.escape` (unescaped strings)
### `$.escape` (escape strings)
For security purposes, Bun Shell escapes input by default. If you need to disable that, this function returns a string that is not escaped by Bun Shell:
Exposes Bun Shell's escaping logic as a function:
```js
import { $ } from "bun";
await $`echo ${$.escape("Hello World!")}`;
// => Hello World!
console.log($.escape('$(foo) `bar` "baz"'))
// => \$(foo) \`bar\` \"baz\"
```
If you do not want your string to be escaped, wrap it in a `{ raw: 'str' }` object:
```js
import { $ } from "bun";
await $`echo ${{ raw: '$(foo) `bar` "baz"' }}`
// => bun: command not found: foo
// => bun: command not found: bar
// => baz
```
## .bun.sh file loader

View File

@@ -52,7 +52,7 @@ It is possible to specify a coverage threshold in `bunfig.toml`. If your test su
coverageThreshold = 0.9
# to set different thresholds for lines and functions
coverageThreshold = { line = 0.9, function = 0.9 }
coverageThreshold = { lines = 0.9, functions = 0.9 }
```
### Sourcemaps

View File

@@ -60,7 +60,7 @@ test("unlike in jest", () => {
To reset the system time, pass no arguments to `setSystemTime`:
```ts
import { setSystemTime, beforeAll } from "bun:test";
import { setSystemTime, expect, test } from "bun:test";
test("it was 2020, for a moment.", () => {
// Set it to something!

View File

@@ -109,7 +109,7 @@ $ bun test --todo
## `test.only`
To run a particular test or suite of tests use `test.only()` or `describe.only()`. Once declared, running `bun test --only` will only execute tests/suites that have been marked with `.only()`.
To run a particular test or suite of tests use `test.only()` or `describe.only()`. Once declared, running `bun test --only` will only execute tests/suites that have been marked with `.only()`. Running `bun test` without the `--only` option with `test.only()` declared will result in all tests in the given suite being executed _up to_ the test with `.only()`. `describe.only()` functions the same in both execution scenarios.
```ts
import { test, describe } from "bun:test";
@@ -135,6 +135,12 @@ The following command will only execute tests #2 and #3.
$ bun test --only
```
The following command will only execute tests #1, #2 and #3.
```sh
$ bun test
```
## `test.if`
To run a test conditionally, use `test.if()`. The test will run if the condition is truthy. This is particularly useful for tests that should only run on specific architectures or operating systems.
@@ -301,7 +307,7 @@ Bun implements the following matchers. Full Jest compatibility is on the roadmap
---
-
-
- [`.extend`](https://jestjs.io/docs/expect#expectextendmatchers)
---

View File

@@ -17,13 +17,13 @@ Bun supports things like top-level await, JSX, and extensioned `.ts` imports, wh
```jsonc
{
"compilerOptions": {
// enable latest features
// Enable latest features
"lib": ["ESNext"],
"target": "ESNext",
"module": "ESNext",
"moduleDetection": "force",
"jsx": "react-jsx", // support JSX
"allowJs": true, // allow importing `.js` from `.ts`
"jsx": "react-jsx",
"allowJs": true,
// Bundler mode
"moduleResolution": "bundler",
@@ -34,18 +34,17 @@ Bun supports things like top-level await, JSX, and extensioned `.ts` imports, wh
// Best practices
"strict": true,
"skipLibCheck": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
// Some stricter flags
"useUnknownInCatchVariables": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noPropertyAccessFromIndexSignature": true
}
}
```
If you run `bun init` in a new directory, this `tsconfig.json` will be generated for you.
If you run `bun init` in a new directory, this `tsconfig.json` will be generated for you. (The stricter flags are disabled by default.)
```sh
$ bun init

View File

@@ -1,6 +1,8 @@
{
"private": true,
"name": "bun",
"dependencies": {
"@biomejs/biome": "1.5.3",
"@vscode/debugadapter": "^1.61.0",
"esbuild": "^0.17.15",
"eslint": "^8.20.0",
@@ -13,7 +15,11 @@
"source-map-js": "^1.0.2",
"typescript": "^5.0.2"
},
"private": true,
"devDependencies": {
"@types/react": "^18.0.25",
"@typescript-eslint/eslint-plugin": "^5.31.0",
"@typescript-eslint/parser": "^5.31.0"
},
"scripts": {
"setup": "./scripts/setup.sh",
"build": "if [ ! -e build ]; then bun setup; fi && ninja -C build",
@@ -21,19 +27,12 @@
"build:release": "cmake . -DCMAKE_BUILD_TYPE=Release -GNinja -Bbuild-release && ninja -Cbuild-release",
"build:safe": "cmake . -DZIG_OPTIMIZE=ReleaseSafe -DUSE_DEBUG_JSC=ON -DCMAKE_BUILD_TYPE=Release -GNinja -Bbuild-safe && ninja -Cbuild-safe",
"typecheck": "tsc --noEmit && cd test && bun run typecheck",
"fmt": "prettier --write --cache \"./{src,test,bench,packages/{bun-types,bun-inspector-*,bun-vscode,bun-debug-adapter-protocol}}/**/*.{mjs,ts,tsx,js,jsx}\"",
"fmt:zig": "zig fmt src/*.zig src/**/*.zig",
"fmt": "biome format --write {.vscode,src,test,bench,packages/{bun-types,bun-inspector-*,bun-vscode,bun-debug-adapter-protocol}}",
"fmt:zig": "zig fmt src/*.zig src/*/*.zig src/*/*/*.zig src/*/*/*/*.zig",
"lint": "eslint './**/*.d.ts' --cache",
"lint:fix": "eslint './**/*.d.ts' --cache --fix",
"test": "node packages/bun-internal-test/src/runner.node.mjs ./build/bun-debug",
"test:release": "node packages/bun-internal-test/src/runner.node.mjs ./build-release/bun",
"update-known-failures": "node packages/bun-internal-test/src/update-known-windows-failures.mjs"
},
"devDependencies": {
"@types/react": "^18.0.25",
"@typescript-eslint/eslint-plugin": "^5.31.0",
"@typescript-eslint/parser": "^5.31.0"
},
"version": "0.0.0",
"prettier": "./.prettierrc.cjs"
}
}

View File

@@ -11,11 +11,7 @@ import type {
StackFrame,
WebsocketMessageBuildFailure,
} from "../../src/api/schema";
import {
messagesToMarkdown,
problemsToMarkdown,
withBunInfo,
} from "./markdown";
import { messagesToMarkdown, problemsToMarkdown, withBunInfo } from "./markdown";
import { fetchAllMappings, remapPosition, sourceMappings } from "./sourcemap";
export enum StackFrameScope {
@@ -82,9 +78,7 @@ enum ErrorTagType {
}
const ErrorTag = ({ type }: { type: ErrorTagType }) => (
<div className={`BunError-ErrorTag BunError-ErrorTag--${ErrorTagType[type]}`}>
{ErrorTagType[type]}
</div>
<div className={`BunError-ErrorTag BunError-ErrorTag--${ErrorTagType[type]}`}>{ErrorTagType[type]}</div>
);
const errorTags = [
@@ -133,11 +127,7 @@ function hasColumnOrLine(filename: string) {
return /:\d+/.test(filename);
}
function appendLineColumnIfNeeded(
base: string,
line?: number,
column?: number,
) {
function appendLineColumnIfNeeded(base: string, line?: number, column?: number) {
if (hasColumnOrLine(base)) return base;
return appendLineColumn(base, line, column);
@@ -155,11 +145,7 @@ function appendLineColumn(base: string, line?: number, column?: number) {
return base;
}
const blobFileURL = (
filename: string,
line?: number,
column?: number,
): string => {
const blobFileURL = (filename: string, line?: number, column?: number): string => {
var base = `/blob:${filename}`;
base = appendLineColumnIfNeeded(base, line, column);
@@ -167,11 +153,7 @@ const blobFileURL = (
return new URL(base, globalThis.location.href).href;
};
const maybeBlobFileURL = (
filename: string,
line?: number,
column?: number,
): string => {
const maybeBlobFileURL = (filename: string, line?: number, column?: number): string => {
if (filename.includes(".bun")) {
return blobFileURL(filename, line, column);
}
@@ -183,9 +165,7 @@ const maybeBlobFileURL = (
return srcFileURL(filename, line, column);
};
const openWithoutFlashOfNewTab: React.MouseEventHandler<HTMLAnchorElement> = (
event,
) => {
const openWithoutFlashOfNewTab: React.MouseEventHandler<HTMLAnchorElement> = event => {
const target = event.currentTarget;
const href = target.getAttribute("href");
if (!href || event.button !== 0) {
@@ -216,18 +196,13 @@ const openWithoutFlashOfNewTab: React.MouseEventHandler<HTMLAnchorElement> = (
})
.then(
() => {},
(er) => {},
er => {},
);
return false;
};
const srcFileURL = (
filename: string,
line?: number,
column?: number,
): string => {
if (filename.startsWith("http://") || filename.startsWith("https://"))
return appendLineColumnIfNeeded(filename);
const srcFileURL = (filename: string, line?: number, column?: number): string => {
if (filename.startsWith("http://") || filename.startsWith("https://")) return appendLineColumnIfNeeded(filename);
if (filename.endsWith(".bun")) {
return new URL("/" + filename, globalThis.location.href).href;
@@ -272,10 +247,7 @@ class FancyTypeError {
const nextWord = /(["a-zA-Z0-9_\.]+)\)$/.exec(partial);
if (nextWord && nextWord[0]) {
this.runtimeTypeName = nextWord[0];
this.runtimeTypeName = this.runtimeTypeName.substring(
0,
this.runtimeTypeName.length - 1,
);
this.runtimeTypeName = this.runtimeTypeName.substring(0, this.runtimeTypeName.length - 1);
switch (this.runtimeTypeName.toLowerCase()) {
case "undefined": {
this.runtimeType = RuntimeType.Undefined;
@@ -312,15 +284,12 @@ class FancyTypeError {
}
}
this.message = exception.message.substring(0, i);
this.message = this.message.substring(
0,
this.message.lastIndexOf("(In "),
);
this.message = this.message.substring(0, this.message.lastIndexOf("(In "));
}
}
}
export const clientURL = (filename) => {
export const clientURL = filename => {
if (filename.includes(".bun")) {
return `/${filename.replace(/^(\/)?/g, "")}`;
}
@@ -368,22 +337,17 @@ const AsyncSourceLines = ({
Accept: "text/plain",
},
})
.then((resp) => {
.then(resp => {
return resp.text();
})
.then((text) => {
.then(text => {
if (cancelled) return;
// TODO: make this faster
const lines = text.split("\n");
const startLineNumber = Math.max(
Math.min(Math.max(highlight - 4, 0), lines.length - 1),
0,
);
const startLineNumber = Math.max(Math.min(Math.max(highlight - 4, 0), lines.length - 1), 0);
const endLineNumber = Math.min(startLineNumber + 8, lines.length);
const sourceLines: SourceLine[] = new Array(
endLineNumber - startLineNumber,
);
const sourceLines: SourceLine[] = new Array(endLineNumber - startLineNumber);
var index = 0;
for (let i = startLineNumber; i < endLineNumber; i++) {
const currentLine = lines[i - 1];
@@ -394,14 +358,10 @@ const AsyncSourceLines = ({
};
}
setSourceLines(
index !== sourceLines.length
? sourceLines.slice(0, index)
: sourceLines,
);
setSourceLines(index !== sourceLines.length ? sourceLines.slice(0, index) : sourceLines);
setLoadState(LoadState.loaded);
})
.catch((err) => {
.catch(err => {
if (!cancelled) {
console.error(err);
setLoadState(LoadState.failed);
@@ -499,8 +459,7 @@ const SourceLines = ({
}
}
const leftPad =
maxLineNumber.toString(10).length - minLineNumber.toString(10).length;
const leftPad = maxLineNumber.toString(10).length - minLineNumber.toString(10).length;
const _sourceLines = sourceLines.slice(start, end);
const lines = new Array(_sourceLines.length + React.Children.count(children));
@@ -520,15 +479,10 @@ const SourceLines = ({
data-line={line}
data-column={classes.highlight ? highlightColumnStart : dedent}
title={`Open line ${line} in editor`}
href={buildURL(
line,
classes.highlight ? highlightColumnStart : dedent,
)}
href={buildURL(line, classes.highlight ? highlightColumnStart : dedent)}
onClickCapture={openWithoutFlashOfNewTab}
key={"highlight-number-" + line}
className={`BunError-SourceLine-number ${
classes.empty ? "BunError-SourceLine-number--empty" : ""
} ${
className={`BunError-SourceLine-number ${classes.empty ? "BunError-SourceLine-number--empty" : ""} ${
classes.highlight ? "BunError-SourceLine-number--highlight" : ""
}`}
>
@@ -536,9 +490,9 @@ const SourceLines = ({
</a>
<div
tabIndex={i}
className={`BunError-SourceLine-text ${
classes.empty ? "BunError-SourceLine-text--empty" : ""
} ${classes.highlight ? "BunError-SourceLine-text--highlight" : ""}`}
className={`BunError-SourceLine-text ${classes.empty ? "BunError-SourceLine-text--empty" : ""} ${
classes.highlight ? "BunError-SourceLine-text--highlight" : ""
}`}
>
{_text}
</div>
@@ -549,9 +503,7 @@ const SourceLines = ({
return (
<IndentationContext.Provider value={dedent}>
<div className="BunError-SourceLines">
<div
className={`BunError-SourceLines-highlighter--${highlightI}`}
></div>
<div className={`BunError-SourceLines-highlighter--${highlightI}`}></div>
{lines}
</div>
@@ -568,10 +520,7 @@ const BuildErrorSourceLines = ({
}) => {
const { line, line_text, column } = location;
const sourceLines: SourceLine[] = [{ line, text: line_text }];
const buildURL = React.useCallback(
(line, column) => srcFileURL(filename, line, column),
[srcFileURL, filename],
);
const buildURL = React.useCallback((line, column) => srcFileURL(filename, line, column), [srcFileURL, filename]);
return (
<SourceLines
sourceLines={sourceLines}
@@ -613,8 +562,7 @@ export const StackFrameIdentifier = ({
}) => {
switch (scope) {
case StackFrameScope.Constructor: {
functionName =
markdown && functionName ? "`" + functionName + "`" : functionName;
functionName = markdown && functionName ? "`" + functionName + "`" : functionName;
return functionName ? `new ${functionName}` : "new (anonymous)";
}
@@ -636,16 +584,12 @@ export const StackFrameIdentifier = ({
case StackFrameScope.Function:
default: {
return functionName
? markdown
? "`" + functionName + "`"
: functionName
: "λ()";
return functionName ? (markdown ? "`" + functionName + "`" : functionName) : "λ()";
}
}
};
const getNativeStackFrameIdentifier = (frame) => {
const getNativeStackFrameIdentifier = frame => {
const { file, function_name: functionName, scope } = frame;
return StackFrameIdentifier({
@@ -673,11 +617,7 @@ const NativeStackFrame = ({
} = frame;
const fileName = normalizedFilename(file, cwd);
return (
<div
className={`BunError-StackFrame ${
fileName.endsWith(".bun") ? "BunError-StackFrame--muted" : ""
}`}
>
<div className={`BunError-StackFrame ${fileName.endsWith(".bun") ? "BunError-StackFrame--muted" : ""}`}>
<div
title={StackFrameScope[scope]}
className="BunError-StackFrame-identifier"
@@ -700,9 +640,7 @@ const NativeStackFrame = ({
<div className="BunError-StackFrame-link-content">
<div className={`BunError-StackFrame-file`}>{fileName}</div>
{line > -1 && <div className="BunError-StackFrame-line">:{line}</div>}
{column > -1 && (
<div className="BunError-StackFrame-column">:{column}</div>
)}
{column > -1 && <div className="BunError-StackFrame-column">:{column}</div>}
</div>
</a>
</div>
@@ -714,21 +652,11 @@ const NativeStackFrames = ({ frames, urlBuilder }) => {
var maxLength = 0;
for (let i = 0; i < frames.length; i++) {
maxLength = Math.max(
getNativeStackFrameIdentifier(frames[i]).length,
maxLength,
);
maxLength = Math.max(getNativeStackFrameIdentifier(frames[i]).length, maxLength);
}
for (let i = 0; i < frames.length; i++) {
items[i] = (
<NativeStackFrame
maxLength={maxLength}
urlBuilder={urlBuilder}
key={i}
frame={frames[i]}
/>
);
items[i] = <NativeStackFrame maxLength={maxLength} urlBuilder={urlBuilder} key={i} frame={frames[i]} />;
}
return (
@@ -756,10 +684,7 @@ const NativeStackTrace = ({
const filename = normalizedFilename(file, cwd);
const urlBuilder = isClient ? clientURL : maybeBlobFileURL;
const ref = React.useRef<HTMLDivElement>(null);
const buildURL = React.useCallback(
(line, column) => urlBuilder(file, line, column),
[file, urlBuilder],
);
const buildURL = React.useCallback((line, column) => urlBuilder(file, line, column), [file, urlBuilder]);
return (
<div ref={ref} className={`BunError-NativeStackTrace`}>
@@ -797,9 +722,7 @@ const NativeStackTrace = ({
{children}
</AsyncSourceLines>
)}
{frames.length > 1 && (
<NativeStackFrames urlBuilder={urlBuilder} frames={frames} />
)}
{frames.length > 1 && <NativeStackFrames urlBuilder={urlBuilder} frames={frames} />}
</div>
);
};
@@ -822,9 +745,7 @@ const JSException = ({
isClient: boolean;
}) => {
const tag = isClient ? ErrorTagType.client : ErrorTagType.server;
const [sourceLines, _setSourceLines] = React.useState(
value?.stack?.source_lines ?? [],
);
const [sourceLines, _setSourceLines] = React.useState(value?.stack?.source_lines ?? []);
var message = value.message || "";
var name = value.name || "";
if (!name && !message) {
@@ -849,25 +770,17 @@ const JSException = ({
if (fancyTypeError.runtimeType !== RuntimeType.Nothing) {
return (
<div
className={`BunError-JSException BunError-JSException--TypeError`}
>
<div className={`BunError-JSException BunError-JSException--TypeError`}>
<div className="BunError-error-header">
<div className={`BunError-error-code`}>TypeError</div>
{errorTags[tag]}
</div>
<div className={`BunError-error-message`}>
{fancyTypeError.message}
</div>
<div className={`BunError-error-message`}>{fancyTypeError.message}</div>
{fancyTypeError.runtimeTypeName.length && (
<div className={`BunError-error-subtitle`}>
It's{" "}
<span className="BunError-error-typename">
{fancyTypeError.runtimeTypeName}
</span>
.
It's <span className="BunError-error-typename">{fancyTypeError.runtimeTypeName}</span>.
</div>
)}
@@ -879,9 +792,7 @@ const JSException = ({
setSourceLines={setSourceLines}
>
<Indent by={value.stack.frames[0].position.column_start}>
<span className="BunError-error-typename">
{fancyTypeError.runtimeTypeName}
</span>
<span className="BunError-error-typename">{fancyTypeError.runtimeTypeName}</span>
</Indent>
</NativeStackTrace>
)}
@@ -956,17 +867,8 @@ const Summary = ({
{errorCount}&nbsp;error{errorCount > 1 ? "s" : ""}&nbsp;on this page
</div>
<a
href="https://bun.sh/discord"
target="_blank"
className="BunError-Summary-help"
>
<svg
width="18"
viewBox="0 0 71 55"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<a href="https://bun.sh/discord" target="_blank" className="BunError-Summary-help">
<svg width="18" viewBox="0 0 71 55" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path
d="M60.1045 4.8978C55.5792 2.8214 50.7265 1.2916 45.6527 0.41542C45.5603 0.39851 45.468 0.440769 45.4204 0.525289C44.7963 1.6353 44.105 3.0834 43.6209 4.2216C38.1637 3.4046 32.7345 3.4046 27.3892 4.2216C26.905 3.0581 26.1886 1.6353 25.5617 0.525289C25.5141 0.443589 25.4218 0.40133 25.3294 0.41542C20.2584 1.2888 15.4057 2.8186 10.8776 4.8978C10.8384 4.9147 10.8048 4.9429 10.7825 4.9795C1.57795 18.7309 -0.943561 32.1443 0.293408 45.3914C0.299005 45.4562 0.335386 45.5182 0.385761 45.5576C6.45866 50.0174 12.3413 52.7249 18.1147 54.5195C18.2071 54.5477 18.305 54.5139 18.3638 54.4378C19.7295 52.5728 20.9469 50.6063 21.9907 48.5383C22.0523 48.4172 21.9935 48.2735 21.8676 48.2256C19.9366 47.4931 18.0979 46.6 16.3292 45.5858C16.1893 45.5041 16.1781 45.304 16.3068 45.2082C16.679 44.9293 17.0513 44.6391 17.4067 44.3461C17.471 44.2926 17.5606 44.2813 17.6362 44.3151C29.2558 49.6202 41.8354 49.6202 53.3179 44.3151C53.3935 44.2785 53.4831 44.2898 53.5502 44.3433C53.9057 44.6363 54.2779 44.9293 54.6529 45.2082C54.7816 45.304 54.7732 45.5041 54.6333 45.5858C52.8646 46.6197 51.0259 47.4931 49.0921 48.2228C48.9662 48.2707 48.9102 48.4172 48.9718 48.5383C50.038 50.6034 51.2554 52.5699 52.5959 54.435C52.6519 54.5139 52.7526 54.5477 52.845 54.5195C58.6464 52.7249 64.529 50.0174 70.6019 45.5576C70.6551 45.5182 70.6887 45.459 70.6943 45.3942C72.1747 30.0791 68.2147 16.7757 60.1968 4.9823C60.1772 4.9429 60.1437 4.9147 60.1045 4.8978ZM23.7259 37.3253C20.2276 37.3253 17.3451 34.1136 17.3451 30.1693C17.3451 26.225 20.1717 23.0133 23.7259 23.0133C27.308 23.0133 30.1626 26.2532 30.1066 30.1693C30.1066 34.1136 27.28 37.3253 23.7259 37.3253ZM47.3178 37.3253C43.8196 37.3253 40.9371 34.1136 40.9371 30.1693C40.9371 26.225 43.7636 23.0133 47.3178 23.0133C50.9 23.0133 53.7545 26.2532 53.6986 30.1693C53.6986 34.1136 50.9 37.3253 47.3178 37.3253Z"
@@ -1005,13 +907,9 @@ const BuildError = ({ message }: { message: Message }) => {
<div className={`BunError-error-message`}>{title}</div>
{subtitle.length > 0 && (
<div className={`BunError-error-subtitle`}>{subtitle}</div>
)}
{subtitle.length > 0 && <div className={`BunError-error-subtitle`}>{subtitle}</div>}
{message.data.location && (
<BuildErrorStackTrace location={message.data.location} />
)}
{message.data.location && <BuildErrorStackTrace location={message.data.location} />}
</div>
);
};
@@ -1034,16 +932,12 @@ const ResolveError = ({ message }: { message: Message }) => {
<div className={`BunError-error-message`}>
Can't import{" "}
<span className="BunError-error-message--mono BunError-error-message--quoted">
"{message.on.resolve}"
</span>
<span className="BunError-error-message--mono BunError-error-message--quoted">"{message.on.resolve}"</span>
</div>
{subtitle && <div className={`BunError-error-subtitle`}>{subtitle}</div>}
{message.data.location && (
<BuildErrorStackTrace location={message.data.location} />
)}
{message.data.location && <BuildErrorStackTrace location={message.data.location} />}
</div>
);
};
@@ -1052,9 +946,7 @@ const OverlayMessageContainer = ({
reason,
isClient = false,
}: FallbackMessageContainer & { isClient: boolean }) => {
const errorCount = problems
? problems.exceptions.length + problems.build.errors
: 0;
const errorCount = problems ? problems.exceptions.length + problems.build.errors : 0;
return (
<div id="BunErrorOverlay-container">
<div className="BunError-content">
@@ -1086,7 +978,7 @@ function copyToClipboard(input: string | Promise<string>) {
if (!input) return;
if (typeof input === "object" && "then" in input) {
return input.then((str) => copyToClipboard(str));
return input.then(str => copyToClipboard(str));
}
return navigator.clipboard.writeText(input).then(() => {});
@@ -1148,9 +1040,7 @@ function renderWithFunc(func) {
reactRoot = document.createElement("div");
reactRoot.id = BUN_ERROR_CONTAINER_ID;
const fallbackStyleSheet = document.querySelector(
"style[data-has-bun-fallback-style]",
);
const fallbackStyleSheet = document.querySelector("style[data-has-bun-fallback-style]");
if (!fallbackStyleSheet) {
reactRoot.style.visibility = "hidden";
}
@@ -1204,7 +1094,7 @@ import { parse as getStackTrace } from "./stack-trace-parser";
var runtimeErrorController: AbortController | null = null;
var pending: { stopped: boolean }[] = [];
var onIdle = globalThis.requestIdleCallback || ((cb) => setTimeout(cb, 32));
var onIdle = globalThis.requestIdleCallback || (cb => setTimeout(cb, 32));
function clearSourceMappings() {
sourceMappings.clear();
}
@@ -1270,8 +1160,7 @@ export function renderRuntimeError(error: Error) {
exception.stack.frames[0].position.line = error[lineNumberProperty];
if (Number.isFinite(error[columnNumberProperty])) {
exception.stack.frames[0].position.column_start =
error[columnNumberProperty];
exception.stack.frames[0].position.column_start = error[columnNumberProperty];
}
}
}
@@ -1308,20 +1197,18 @@ export function renderRuntimeError(error: Error) {
// Rely on the cached ones
// and don't fetch them again
const framePromises = fetchAllMappings(
exception.stack.frames.map((frame) =>
normalizedFilename(frame.file, thisCwd),
),
exception.stack.frames.map(frame => normalizedFilename(frame.file, thisCwd)),
signal,
)
.map((frame, i) => {
if (stopThis.stopped) return null;
return [frame, i];
})
.map((result) => {
.map(result => {
if (!result) return;
const [mappings, frameIndex] = result;
if (mappings?.then) {
return mappings.then((mappings) => {
return mappings.then(mappings => {
if (!mappings || stopThis.stopped) {
return null;
}
@@ -1391,10 +1278,7 @@ export function dismissError() {
}
}
export const renderBuildFailure = (
failure: WebsocketMessageBuildFailure,
cwd: string,
) => {
export const renderBuildFailure = (failure: WebsocketMessageBuildFailure, cwd: string) => {
thisCwd = cwd;
renderWithFunc(() => (
<ErrorGroupContext.Provider value={{ cwd }}>

View File

@@ -1,15 +1,5 @@
import {
normalizedFilename,
StackFrameIdentifier,
thisCwd,
StackFrameScope,
} from "./index";
import type {
JSException,
JSException as JSExceptionType,
Message,
Problems,
} from "../../src/api/schema";
import { normalizedFilename, StackFrameIdentifier, thisCwd, StackFrameScope } from "./index";
import type { JSException, JSException as JSExceptionType, Message, Problems } from "../../src/api/schema";
export function problemsToMarkdown(problems: Problems) {
var markdown = "";
@@ -27,14 +17,14 @@ export function problemsToMarkdown(problems: Problems) {
export function messagesToMarkdown(messages: Message[]): string {
return messages
.map(messageToMarkdown)
.map((a) => a.trim())
.map(a => a.trim())
.join("\n");
}
export function exceptionsToMarkdown(exceptions: JSExceptionType[]): string {
return exceptions
.map(exceptionToMarkdown)
.map((a) => a.trim())
.map(a => a.trim())
.join("\n");
}
@@ -73,11 +63,7 @@ function exceptionToMarkdown(exception: JSException): string {
const {
file: _file = "",
function_name = "",
position: {
line = -1,
column_start: column = -1,
column_stop: columnEnd = column,
} = {
position: { line = -1, column_start: column = -1, column_stop: columnEnd = column } = {
line: -1,
column_start: -1,
column_stop: -1,
@@ -114,23 +100,17 @@ function exceptionToMarkdown(exception: JSException): string {
markdown += "\n```";
markdown += extname;
markdown += "\n";
stack.source_lines.forEach((sourceLine) => {
stack.source_lines.forEach(sourceLine => {
const lineText = sourceLine.text.trimEnd();
markdown += lineText + "\n";
if (sourceLine.line === line && stack.source_lines.length > 1) {
// the comment should start at the first non-whitespace character
// ideally it should be length the original line
// but it may not be
var prefix = "".padStart(
lineText.length - lineText.trimStart().length,
" ",
);
var prefix = "".padStart(lineText.length - lineText.trimStart().length, " ");
prefix +=
"/* ".padEnd(column - 1 - prefix.length, " ") +
"^ happened here ";
markdown +=
prefix.padEnd(Math.max(lineText.length, 1) - 1, " ") + "*/\n";
prefix += "/* ".padEnd(column - 1 - prefix.length, " ") + "^ happened here ";
markdown += prefix.padEnd(Math.max(lineText.length, 1) - 1, " ") + "*/\n";
}
});
markdown = markdown.trimEnd() + "\n```";
@@ -240,11 +220,9 @@ function messageToMarkdown(message: Message): string {
if (message.data.location.line_text.length) {
const extnameI = message.data.location.file.lastIndexOf(".");
const extname =
extnameI > -1 ? message.data.location.file.slice(extnameI + 1) : "";
const extname = extnameI > -1 ? message.data.location.file.slice(extnameI + 1) : "";
markdown +=
"\n```" + extname + "\n" + message.data.location.line_text + "\n```\n";
markdown += "\n```" + extname + "\n" + message.data.location.line_text + "\n```\n";
} else {
markdown += "\n";
}
@@ -257,14 +235,14 @@ function messageToMarkdown(message: Message): string {
return markdown;
}
export const withBunInfo = (text) => {
export const withBunInfo = text => {
const bunInfo = getBunInfo();
const trimmed = text.trim();
if (bunInfo && "then" in bunInfo) {
return bunInfo.then(
(info) => {
info => {
const markdown = bunInfoToMarkdown(info).trim();
return trimmed + "\n" + markdown + "\n";
},
@@ -379,8 +357,8 @@ function getBunInfo() {
Accept: "application/json",
},
})
.then((resp) => resp.json())
.then((bunInfo) => {
.then(resp => resp.json())
.then(bunInfo => {
clearTimeout(id);
bunInfoMemoized = bunInfo;
if ("sessionStorage" in globalThis) {

View File

@@ -1,10 +1,6 @@
// Based on https://github.com/stacktracejs/error-stack-parser/blob/master/error-stack-parser.js
import type {
StackFrame as StackFrameType,
StackFramePosition,
StackFrameScope,
} from "../../src/api/schema";
import type { StackFrame as StackFrameType, StackFramePosition, StackFrameScope } from "../../src/api/schema";
export class StackFrame implements StackFrameType {
function_name: string;
@@ -89,9 +85,7 @@ export default class RuntimeError {
return filtered.map(function (line) {
if (line.indexOf("(eval ") > -1) {
// Throw away eval information until we implement stacktrace.js/stackframe#8
line = line
.replace(/eval code/g, "eval")
.replace(/(\(eval at [^()]*)|(\),.*$)/g, "");
line = line.replace(/eval code/g, "eval").replace(/(\(eval at [^()]*)|(\),.*$)/g, "");
}
var sanitizedLine = line.replace(/^\s+/, "").replace(/\(eval code/g, "(");
@@ -100,20 +94,13 @@ export default class RuntimeError {
var location = sanitizedLine.match(/ (\((.+):(\d+):(\d+)\)$)/);
// remove the parenthesized location from the line, if it was matched
sanitizedLine = location
? sanitizedLine.replace(location[0], "")
: sanitizedLine;
sanitizedLine = location ? sanitizedLine.replace(location[0], "") : sanitizedLine;
var tokens = sanitizedLine.split(/\s+/).slice(1);
// if a location was matched, pass it to extractLocation() otherwise pop the last token
var locationParts = this.extractLocation(
location ? location[1] : tokens.pop(),
);
var locationParts = this.extractLocation(location ? location[1] : tokens.pop());
var functionName = tokens.join(" ") || undefined;
var fileName =
["eval", "<anonymous>"].indexOf(locationParts[0]) > -1
? undefined
: locationParts[0];
var fileName = ["eval", "<anonymous>"].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0];
return new StackFrame({
functionName: functionName,
@@ -133,10 +120,7 @@ export default class RuntimeError {
return filtered.map(function (line) {
// Throw away eval information until we implement stacktrace.js/stackframe#8
if (line.indexOf(" > eval") > -1) {
line = line.replace(
/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,
":$1",
);
line = line.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g, ":$1");
}
if (line.indexOf("@") === -1 && line.indexOf(":") === -1) {
@@ -148,9 +132,7 @@ export default class RuntimeError {
var functionNameRegex = /((.*".+"[^@]*)?[^@]*)(?:@)/;
var matches = line.match(functionNameRegex);
var functionName = matches && matches[1] ? matches[1] : undefined;
var locationParts = this.extractLocation(
line.replace(functionNameRegex, ""),
);
var locationParts = this.extractLocation(line.replace(functionNameRegex, ""));
return new StackFrame({
functionName: functionName,

View File

@@ -1,7 +1,6 @@
// Accelerate VLQ decoding with a lookup table
const vlqTable = new Uint8Array(128);
const vlqChars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
const vlqChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
vlqTable.fill(0xff);
for (let i = 0; i < vlqChars.length; i++) vlqTable[vlqChars.charCodeAt(i)] = i;
@@ -10,10 +9,7 @@ export function parseSourceMap(json) {
throw new Error("Invalid source map");
}
if (
!(json.sources instanceof Array) ||
json.sources.some((x) => typeof x !== "string")
) {
if (!(json.sources instanceof Array) || json.sources.some(x => typeof x !== "string")) {
throw new Error("Invalid source map");
}
@@ -147,8 +143,7 @@ export function decodeMappings(mappings, sourcesCount) {
// Read the original source
const originalSourceDelta = decodeVLQ();
originalSource += originalSourceDelta;
if (originalSource < 0 || originalSource >= sourcesCount)
decodeError("Invalid original source");
if (originalSource < 0 || originalSource >= sourcesCount) decodeError("Invalid original source");
// Read the original line
const originalLineDelta = decodeVLQ();
@@ -211,11 +206,7 @@ export function decodeMappings(mappings, sourcesCount) {
return data.subarray(0, dataLength);
}
export function remapPosition(
decodedMappings: Int32Array,
line: number,
column: number,
) {
export function remapPosition(decodedMappings: Int32Array, line: number, column: number) {
if (!(decodedMappings instanceof Int32Array)) {
throw new Error("decodedMappings must be an Int32Array");
}
@@ -260,7 +251,7 @@ export function fetchMappings(file, signal) {
return sourceMappings.get(file);
}
return fetchRemoteSourceMap(file, signal).then((json) => {
return fetchRemoteSourceMap(file, signal).then(json => {
if (!json) return null;
const { data } = parseSourceMap(json);
sourceMappings.set(file, data);
@@ -285,11 +276,11 @@ export function fetchAllMappings(files, signal) {
var resolvers = [];
for (let i = 0; i < indices.length; i++) {
results[indices[i]] = new Promise((resolve, reject) => {
resolvers[i] = (res) => resolve(res ? [res, i] : null);
resolvers[i] = res => resolve(res ? [res, i] : null);
});
}
mapped.finally((a) => {
mapped.finally(a => {
for (let resolve of resolvers) {
try {
resolve(a);
@@ -320,10 +311,7 @@ function indexOfMapping(mappings: Int32Array, line: number, column: number) {
var i = index + step;
// this multiply is slow but it's okay for now
var j = i * 6;
if (
mappings[j] < line ||
(mappings[j] == line && mappings[j + 1] <= column)
) {
if (mappings[j] < line || (mappings[j] == line && mappings[j + 1] <= column)) {
index = i + 1;
count -= step + 1;
} else {

View File

@@ -17,12 +17,7 @@ export function parse(stackString): StackFrame[] {
const lines = stackString.split("\n");
return lines.reduce((stack, line) => {
const parseResult =
parseChrome(line) ||
parseWinjs(line) ||
parseGecko(line) ||
parseNode(line) ||
parseJSC(line);
const parseResult = parseChrome(line) || parseWinjs(line) || parseGecko(line) || parseNode(line) || parseJSC(line);
if (parseResult) {
stack.push(parseResult);
@@ -32,15 +27,14 @@ export function parse(stackString): StackFrame[] {
}, []);
}
const formatFile = (file) => {
const formatFile = file => {
if (!file) {
return "";
}
if (file.startsWith("blob:")) {
if (globalThis["__BUN"]?.client) {
const replacement =
globalThis["__BUN"]?.client.dependencies.getFilePathFromBlob(file);
const replacement = globalThis["__BUN"]?.client.dependencies.getFilePathFromBlob(file);
if (replacement) {
file = replacement;
}
@@ -146,8 +140,7 @@ function parseGecko(line) {
};
}
const javaScriptCoreRe =
/^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i;
const javaScriptCoreRe = /^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i;
function parseJSC(line) {
const parts = javaScriptCoreRe.exec(line);
@@ -166,8 +159,7 @@ function parseJSC(line) {
};
}
const nodeRe =
/^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i;
const nodeRe = /^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i;
function parseNode(line) {
const parts = nodeRe.exec(line);

View File

@@ -48,10 +48,7 @@
"id": "Channel",
"description": "Logging channel.",
"type": "object",
"properties": [
{ "name": "source", "$ref": "ChannelSource" },
{ "name": "level", "$ref": "ChannelLevel" }
]
"properties": [{ "name": "source", "$ref": "ChannelSource" }, { "name": "level", "$ref": "ChannelLevel" }]
},
{
"id": "ConsoleMessage",
@@ -1142,10 +1139,7 @@
{
"name": "snapshot",
"description": "Take a heap snapshot.",
"returns": [
{ "name": "timestamp", "type": "number" },
{ "name": "snapshotData", "$ref": "HeapSnapshotData" }
]
"returns": [{ "name": "timestamp", "type": "number" }, { "name": "snapshotData", "$ref": "HeapSnapshotData" }]
},
{
"name": "startTracking",
@@ -1235,10 +1229,7 @@
{ "name": "evaluateForTestInFrontend", "parameters": [{ "name": "script", "type": "string" }] },
{
"name": "inspect",
"parameters": [
{ "name": "object", "$ref": "Runtime.RemoteObject" },
{ "name": "hints", "type": "object" }
]
"parameters": [{ "name": "object", "$ref": "Runtime.RemoteObject" }, { "name": "hints", "type": "object" }]
}
]
},

View File

@@ -1518,10 +1518,7 @@
"id": "EventMetadata",
"description": "A key-value pair for additional event information to pass along.",
"type": "object",
"properties": [
{ "name": "key", "type": "string" },
{ "name": "value", "type": "string" }
]
"properties": [{ "name": "key", "type": "string" }, { "name": "value", "type": "string" }]
},
{
"id": "BackgroundServiceEvent",
@@ -1573,10 +1570,7 @@
{
"name": "setRecording",
"description": "Set the recording state for the service.",
"parameters": [
{ "name": "shouldRecord", "type": "boolean" },
{ "name": "service", "$ref": "ServiceName" }
]
"parameters": [{ "name": "shouldRecord", "type": "boolean" }, { "name": "service", "$ref": "ServiceName" }]
},
{
"name": "clearEvents",
@@ -1588,10 +1582,7 @@
{
"name": "recordingStateChanged",
"description": "Called when the recording state for the service has been updated.",
"parameters": [
{ "name": "isRecording", "type": "boolean" },
{ "name": "service", "$ref": "ServiceName" }
]
"parameters": [{ "name": "isRecording", "type": "boolean" }, { "name": "service", "$ref": "ServiceName" }]
},
{
"name": "backgroundServiceEventReceived",
@@ -2081,10 +2072,7 @@
{
"id": "Header",
"type": "object",
"properties": [
{ "name": "name", "type": "string" },
{ "name": "value", "type": "string" }
]
"properties": [{ "name": "name", "type": "string" }, { "name": "value", "type": "string" }]
},
{
"id": "CachedResponse",
@@ -3454,10 +3442,7 @@
{
"name": "setStyleSheetText",
"description": "Sets the new stylesheet text.",
"parameters": [
{ "name": "styleSheetId", "$ref": "StyleSheetId" },
{ "name": "text", "type": "string" }
],
"parameters": [{ "name": "styleSheetId", "$ref": "StyleSheetId" }, { "name": "text", "type": "string" }],
"returns": [
{
"name": "sourceMapURL",
@@ -3582,10 +3567,7 @@
},
{
"name": "executeSQL",
"parameters": [
{ "name": "databaseId", "$ref": "DatabaseId" },
{ "name": "query", "type": "string" }
],
"parameters": [{ "name": "databaseId", "$ref": "DatabaseId" }, { "name": "query", "type": "string" }],
"returns": [
{ "name": "columnNames", "optional": true, "type": "array", "items": { "type": "string" } },
{ "name": "values", "optional": true, "type": "array", "items": { "type": "any" } },
@@ -3626,10 +3608,7 @@
{
"name": "selectPrompt",
"description": "Select a device in response to a DeviceAccess.deviceRequestPrompted event.",
"parameters": [
{ "name": "id", "$ref": "RequestId" },
{ "name": "deviceId", "$ref": "DeviceId" }
]
"parameters": [{ "name": "id", "$ref": "RequestId" }, { "name": "deviceId", "$ref": "DeviceId" }]
},
{
"name": "cancelPrompt",
@@ -5677,10 +5656,7 @@
},
{
"name": "removeDOMStorageItem",
"parameters": [
{ "name": "storageId", "$ref": "StorageId" },
{ "name": "key", "type": "string" }
]
"parameters": [{ "name": "storageId", "$ref": "StorageId" }, { "name": "key", "type": "string" }]
},
{
"name": "setDOMStorageItem",
@@ -5702,10 +5678,7 @@
},
{
"name": "domStorageItemRemoved",
"parameters": [
{ "name": "storageId", "$ref": "StorageId" },
{ "name": "key", "type": "string" }
]
"parameters": [{ "name": "storageId", "$ref": "StorageId" }, { "name": "key", "type": "string" }]
},
{
"name": "domStorageItemUpdated",
@@ -5775,10 +5748,7 @@
{
"id": "MediaFeature",
"type": "object",
"properties": [
{ "name": "name", "type": "string" },
{ "name": "value", "type": "string" }
]
"properties": [{ "name": "name", "type": "string" }, { "name": "value", "type": "string" }]
},
{
"id": "VirtualTimePolicy",
@@ -5792,10 +5762,7 @@
"description": "Used to specify User Agent Cient Hints to emulate. See https://wicg.github.io/ua-client-hints",
"experimental": true,
"type": "object",
"properties": [
{ "name": "brand", "type": "string" },
{ "name": "version", "type": "string" }
]
"properties": [{ "name": "brand", "type": "string" }, { "name": "version", "type": "string" }]
},
{
"id": "UserAgentMetadata",
@@ -6153,10 +6120,7 @@
"name": "setSensorOverrideReadings",
"description": "Updates the sensor readings reported by a sensor type previously overriden\nby setSensorOverrideEnabled.",
"experimental": true,
"parameters": [
{ "name": "type", "$ref": "SensorType" },
{ "name": "reading", "$ref": "SensorReading" }
]
"parameters": [{ "name": "type", "$ref": "SensorType" }, { "name": "reading", "$ref": "SensorReading" }]
},
{
"name": "setIdleOverride",
@@ -6441,17 +6405,11 @@
{ "name": "disable" },
{
"name": "selectAccount",
"parameters": [
{ "name": "dialogId", "type": "string" },
{ "name": "accountIndex", "type": "integer" }
]
"parameters": [{ "name": "dialogId", "type": "string" }, { "name": "accountIndex", "type": "integer" }]
},
{
"name": "clickDialogButton",
"parameters": [
{ "name": "dialogId", "type": "string" },
{ "name": "dialogButton", "$ref": "DialogButton" }
]
"parameters": [{ "name": "dialogId", "type": "string" }, { "name": "dialogButton", "$ref": "DialogButton" }]
},
{
"name": "dismissDialog",
@@ -6506,10 +6464,7 @@
"id": "HeaderEntry",
"description": "Response HTTP header entry",
"type": "object",
"properties": [
{ "name": "name", "type": "string" },
{ "name": "value", "type": "string" }
]
"properties": [{ "name": "name", "type": "string" }, { "name": "value", "type": "string" }]
},
{
"id": "AuthChallenge",
@@ -8346,28 +8301,19 @@
"id": "PlayerProperty",
"description": "Corresponds to kMediaPropertyChange",
"type": "object",
"properties": [
{ "name": "name", "type": "string" },
{ "name": "value", "type": "string" }
]
"properties": [{ "name": "name", "type": "string" }, { "name": "value", "type": "string" }]
},
{
"id": "PlayerEvent",
"description": "Corresponds to kMediaEventTriggered",
"type": "object",
"properties": [
{ "name": "timestamp", "$ref": "Timestamp" },
{ "name": "value", "type": "string" }
]
"properties": [{ "name": "timestamp", "$ref": "Timestamp" }, { "name": "value", "type": "string" }]
},
{
"id": "PlayerErrorSourceLocation",
"description": "Represents logged source line numbers reported in an error.\nNOTE: file and line are from chromium c++ implementation code, not js.",
"type": "object",
"properties": [
{ "name": "file", "type": "string" },
{ "name": "line", "type": "integer" }
]
"properties": [{ "name": "file", "type": "string" }, { "name": "line", "type": "integer" }]
},
{
"id": "PlayerError",
@@ -12411,10 +12357,7 @@
"description": "Pair of issuer origin and number of available (signed, but not used) Trust\nTokens from that issuer.",
"experimental": true,
"type": "object",
"properties": [
{ "name": "issuerOrigin", "type": "string" },
{ "name": "count", "type": "number" }
]
"properties": [{ "name": "issuerOrigin", "type": "string" }, { "name": "count", "type": "number" }]
},
{
"id": "InterestGroupAccessType",
@@ -12477,10 +12420,7 @@
"id": "SharedStorageEntry",
"description": "Struct for a single key-value pair in an origin's shared storage.",
"type": "object",
"properties": [
{ "name": "key", "type": "string" },
{ "name": "value", "type": "string" }
]
"properties": [{ "name": "key", "type": "string" }, { "name": "value", "type": "string" }]
},
{
"id": "SharedStorageMetadata",
@@ -12496,10 +12436,7 @@
"id": "SharedStorageReportingMetadata",
"description": "Pair of reporting metadata details for a candidate URL for `selectURL()`.",
"type": "object",
"properties": [
{ "name": "eventType", "type": "string" },
{ "name": "reportingUrl", "type": "string" }
]
"properties": [{ "name": "eventType", "type": "string" }, { "name": "reportingUrl", "type": "string" }]
},
{
"id": "SharedStorageUrlWithMetadata",
@@ -12631,10 +12568,7 @@
"id": "AttributionReportingAggregationKeysEntry",
"experimental": true,
"type": "object",
"properties": [
{ "name": "key", "type": "string" },
{ "name": "value", "$ref": "UnsignedInt128AsBase16" }
]
"properties": [{ "name": "key", "type": "string" }, { "name": "value", "$ref": "UnsignedInt128AsBase16" }]
},
{
"id": "AttributionReportingEventReportWindows",
@@ -13009,10 +12943,7 @@
"name": "getInterestGroupDetails",
"description": "Gets details for a named interest group.",
"experimental": true,
"parameters": [
{ "name": "ownerOrigin", "type": "string" },
{ "name": "name", "type": "string" }
],
"parameters": [{ "name": "ownerOrigin", "type": "string" }, { "name": "name", "type": "string" }],
"returns": [{ "name": "details", "$ref": "InterestGroupDetails" }]
},
{
@@ -13055,10 +12986,7 @@
"name": "deleteSharedStorageEntry",
"description": "Deletes entry for `key` (if it exists) for a given origin's shared storage.",
"experimental": true,
"parameters": [
{ "name": "ownerOrigin", "type": "string" },
{ "name": "key", "type": "string" }
]
"parameters": [{ "name": "ownerOrigin", "type": "string" }, { "name": "key", "type": "string" }]
},
{
"name": "clearSharedStorageEntries",
@@ -13082,10 +13010,7 @@
"name": "setStorageBucketTracking",
"description": "Set tracking for a storage key's buckets.",
"experimental": true,
"parameters": [
{ "name": "storageKey", "type": "string" },
{ "name": "enable", "type": "boolean" }
]
"parameters": [{ "name": "storageKey", "type": "string" }, { "name": "enable", "type": "boolean" }]
},
{
"name": "deleteStorageBucket",
@@ -13531,10 +13456,7 @@
"id": "RemoteLocation",
"experimental": true,
"type": "object",
"properties": [
{ "name": "host", "type": "string" },
{ "name": "port", "type": "integer" }
]
"properties": [{ "name": "host", "type": "string" }, { "name": "port", "type": "integer" }]
}
],
"commands": [

View File

@@ -79,10 +79,7 @@
"env": {
"NAME": "Bun"
},
"args": [
"--jsx-import-source",
"src/middleware/jsx/jsx-dev-runtime"
],
"args": ["--jsx-import-source", "src/middleware/jsx/jsx-dev-runtime"],
"path": "runtime_tests/bun/index.test.tsx"
}
},

View File

@@ -107,9 +107,9 @@ async function runTest(path) {
const expected_crash_reason = windows
? await readFile(resolve(path), "utf-8").then(data => {
const match = data.match(/@known-failing-on-windows:(.*)\n/);
return match ? match[1].trim() : null;
})
const match = data.match(/@known-failing-on-windows:(.*)\n/);
return match ? match[1].trim() : null;
})
: null;
const start = Date.now();
@@ -195,8 +195,7 @@ async function runTest(path) {
}
console.log(
`\x1b[2m${formatTime(duration).padStart(6, " ")}\x1b[0m ${
passed ? "\x1b[32m✔" : expected_crash_reason ? "\x1b[33m⚠" : "\x1b[31m✖"
`\x1b[2m${formatTime(duration).padStart(6, " ")}\x1b[0m ${passed ? "\x1b[32m✔" : expected_crash_reason ? "\x1b[33m⚠" : "\x1b[31m✖"
} ${name}\x1b[0m${reason ? ` (${reason})` : ""}`,
);
@@ -320,10 +319,9 @@ console.log("\n" + "-".repeat(Math.min(process.stdout.columns || 40, 80)) + "\n"
console.log(header);
console.log("\n" + "-".repeat(Math.min(process.stdout.columns || 40, 80)) + "\n");
let report = `# bun test on ${
process.env["GITHUB_REF"] ??
let report = `# bun test on ${process.env["GITHUB_REF"] ??
spawnSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], { encoding: "utf-8" }).stdout.trim()
}
}
\`\`\`
${header}
@@ -347,8 +345,7 @@ if (regressions.length > 0) {
report += regressions
.map(
({ path, reason, expected_crash_reason }) =>
`- [\`${path}\`](${sectionLink(path)}) ${reason}${
expected_crash_reason ? ` (expected: ${expected_crash_reason})` : ""
`- [\`${path}\`](${sectionLink(path)}) ${reason}${expected_crash_reason ? ` (expected: ${expected_crash_reason})` : ""
}`,
)
.join("\n");
@@ -381,8 +378,9 @@ if (failing_tests.length) {
report += `${reason}\n\n`;
}
report += "```\n";
report += output.replace(/\x1b\[[0-9;]*m/g, "")
.replace(/^::(group|endgroup|error|warning|set-output|add-matcher|remove-matcher).*$/gm, "")
report += output
.replace(/\x1b\[[0-9;]*m/g, "")
.replace(/^::(group|endgroup|error|warning|set-output|add-matcher|remove-matcher).*$/gm, "");
report += "```\n\n";
}
}
@@ -402,22 +400,19 @@ console.log("-> test-report.md, test-report.json");
if (ci) {
if (windows) {
if (regressions.length > 0) {
action.setFailed(`${regressions.length} regressing tests`);
}
action.setOutput(
"regressing_tests",
regressions.map(({ path }) => `- \`${path}\``).join("\n"),
);
action.setOutput("regressing_tests", regressions.map(({ path }) => `- \`${path}\``).join("\n"));
action.setOutput("regressing_test_count", regressions.length);
} else {
if (failing_tests.length > 0) {
action.setFailed(`${failing_tests.length} files with failing tests`);
}
action.setOutput("failing_tests", failingTestDisplay);
action.setOutput("failing_tests_count", failing_tests.length);
}
action.summary.addRaw(report);
if (failing_tests.length > 0) {
action.setFailed(`${failing_tests.length} files with failing tests`);
}
action.setOutput("failing_tests", failingTestDisplay);
action.setOutput("failing_tests_count", failing_tests.length);
let truncated_report = report;
if (truncated_report.length > 512 * 1000) {
truncated_report = truncated_report.slice(0, 512 * 1000) + "\n\n...truncated...";
}
action.summary.addRaw(truncated_report);
await action.summary.write();
} else {
if (windows && (regressions.length > 0 || fixes.length > 0)) {

View File

@@ -279,7 +279,7 @@ async function sendResponse(response: unknown): Promise<void> {
}
await fetch(`runtime/invocation/${requestId}/response`, {
method: "POST",
body: response === null ? null : (typeof response === 'string' ? response : JSON.stringify(response)),
body: response === null ? null : typeof response === "string" ? response : JSON.stringify(response),
});
}
@@ -594,8 +594,8 @@ class LambdaServer implements Server {
typeof options.port === "number"
? options.port
: typeof options.port === "string"
? parseInt(options.port)
: this.port;
? parseInt(options.port)
: this.port;
this.hostname = options.hostname ?? this.hostname;
this.development = options.development ?? this.development;
}

View File

@@ -87,12 +87,13 @@ export class BuildCommand extends Command {
this.log("Saving...", output);
const archiveBuffer = await archive
.generateAsync({
type: 'blob',
type: "blob",
compression: "DEFLATE",
compressionOptions: {
level: 9,
},
}).then(blob => blob.arrayBuffer());
})
.then(blob => blob.arrayBuffer());
writeFileSync(output, archiveBuffer);
this.log("Saved");
}

View File

@@ -32,54 +32,60 @@ export class PublishCommand extends BuildCommand {
}
const { layer, region, arch, output, public: isPublic } = flags;
if (region.includes("*")) {
// prettier-ignore
const result = this.#aws([
"ec2",
"describe-regions",
"--query", "Regions[].RegionName",
"--output", "json"
]);
// biome-ignore: format ignore
const result = this.#aws(["ec2", "describe-regions", "--query", "Regions[].RegionName", "--output", "json"]);
region.length = 0;
for (const name of JSON.parse(result)) {
region.push(name);
}
} else if (!region.length) {
// prettier-ignore
region.push(this.#aws([
"configure",
"get",
"region"
]));
// biome-ignore: format ignore
region.push(this.#aws(["configure", "get", "region"]));
}
this.log("Publishing...");
for (const regionName of region) {
for (const layerName of layer) {
// prettier-ignore
// biome-ignore: format ignore
const result = this.#aws([
"lambda",
"publish-layer-version",
"--layer-name", layerName,
"--region", regionName,
"--description", "Bun is an incredibly fast JavaScript runtime, bundler, transpiler, and package manager.",
"--license-info", "MIT",
"--compatible-architectures", arch === "x64" ? "x86_64" : "arm64",
"--compatible-runtimes", "provided.al2", "provided",
"--zip-file", `fileb://${output}`,
"--output", "json",
"--layer-name",
layerName,
"--region",
regionName,
"--description",
"Bun is an incredibly fast JavaScript runtime, bundler, transpiler, and package manager.",
"--license-info",
"MIT",
"--compatible-architectures",
arch === "x64" ? "x86_64" : "arm64",
"--compatible-runtimes",
"provided.al2",
"provided",
"--zip-file",
`fileb://${output}`,
"--output",
"json",
]);
const { LayerVersionArn } = JSON.parse(result);
this.log("Published", LayerVersionArn);
if (isPublic) {
// prettier-ignore
// biome-ignore: format ignore
this.#aws([
"lambda",
"add-layer-version-permission",
"--layer-name", layerName,
"--region", regionName,
"--version-number", LayerVersionArn.split(":").pop(),
"--statement-id", `${layerName}-public`,
"--action", "lambda:GetLayerVersion",
"--principal", "*",
"--layer-name",
layerName,
"--region",
regionName,
"--version-number",
LayerVersionArn.split(":").pop(),
"--statement-id",
`${layerName}-public`,
"--action",
"lambda:GetLayerVersion",
"--principal",
"*",
]);
}
}

View File

@@ -32,9 +32,7 @@ for (const asset of release.assets) {
const url = asset.browser_download_url;
const response = await fetch(url);
if (!response.ok) {
throw new Error(
`Failed to download asset: ${response.status} ${url}`
);
throw new Error(`Failed to download asset: ${response.status} ${url}`);
}
const name = asset.name;
let contentType: string;
@@ -86,9 +84,7 @@ async function uploadToS3({
headers,
});
if (!response.ok) {
throw new Error(
`Failed to upload to S3: ${response.status} ${response.statusText}`
);
throw new Error(`Failed to upload to S3: ${response.status} ${response.statusText}`);
}
}

View File

@@ -1,6 +0,0 @@
{
"arrowParens": "avoid",
"printWidth": 80,
"trailingComma": "all",
"useTabs": false
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

74
packages/bun-types/deprecated.d.ts vendored Normal file
View File

@@ -0,0 +1,74 @@
declare module "bun" {
/**
* @deprecated Renamed to `ErrorLike`
*/
type Errorlike = ErrorLike;
interface TLSOptions {
/**
* File path to a TLS key
*
* To enable TLS, this option is required.
*
* @deprecated since v0.6.3 - Use `key: Bun.file(path)` instead.
*/
keyFile?: string;
/**
* File path to a TLS certificate
*
* To enable TLS, this option is required.
*
* @deprecated since v0.6.3 - Use `cert: Bun.file(path)` instead.
*/
certFile?: string;
/**
* File path to a .pem file for a custom root CA
*
* @deprecated since v0.6.3 - Use `ca: Bun.file(path)` instead.
*/
caFile?: string;
}
}
declare namespace NodeJS {
interface Process {
/**
* @deprecated This is deprecated; use the "node:assert" module instead.
*/
assert(value: unknown, message?: string | Error): asserts value;
}
}
declare namespace Bun {
interface MessageEvent {
/** @deprecated */
initMessageEvent(
type: string,
bubbles?: boolean,
cancelable?: boolean,
data?: any,
origin?: string,
lastEventId?: string,
source?: null,
): void;
}
}
interface CustomEvent<T = any> {
/** @deprecated */
initCustomEvent(type: string, bubbles?: boolean, cancelable?: boolean, detail?: T): void;
}
interface DOMException {
/** @deprecated */
readonly code: number;
}
/**
* @deprecated Renamed to `BuildMessage`
*/
declare var BuildError: typeof BuildMessage;
/**
* @deprecated Renamed to `ResolveMessage`
*/
declare var ResolveError: typeof ResolveMessage;

53
packages/bun-types/fetch.d.ts vendored Normal file
View File

@@ -0,0 +1,53 @@
type _Response = typeof globalThis extends { onmessage: any } ? {} : import("undici-types").Response;
export interface Response extends _Response {}
export declare class Response {
constructor(body?: Bun.BodyInit | null | undefined, init?: Bun.ResponseInit | undefined);
/**
* Create a new {@link Response} with a JSON body
*
* @param body - The body of the response
* @param options - options to pass to the response
*
* @example
*
* ```ts
* const response = Response.json({hi: "there"});
* console.assert(
* await response.text(),
* `{"hi":"there"}`
* );
* ```
* -------
*
* This is syntactic sugar for:
* ```js
* new Response(JSON.stringify(body), {headers: { "Content-Type": "application/json" }})
* ```
* @link https://github.com/whatwg/fetch/issues/1389
*/
static json(body?: any, options?: Bun.ResponseInit | number): Response;
/**
* Create a new {@link Response} that redirects to url
*
* @param url - the URL to redirect to
* @param status - the HTTP status code to use for the redirect
*/
// tslint:disable-next-line:unified-signatures
static redirect(url: string, status?: number): Response;
/**
* Create a new {@link Response} that redirects to url
*
* @param url - the URL to redirect to
* @param options - options to pass to the response
*/
// tslint:disable-next-line:unified-signatures
static redirect(url: string, options?: Bun.ResponseInit): Response;
/**
* Create a new {@link Response} that has a network error
*/
static error(): Response;
}

View File

@@ -259,7 +259,7 @@ declare module "bun:ffi" {
f32 = 10,
/**
* Booelan value
* Boolean value
*
* Must be `true` or `false`. `0` and `1` type coercion is not supported.
*
@@ -339,8 +339,7 @@ declare module "bun:ffi" {
function = 17,
}
type UNTYPED = never;
type Pointer = number & {};
type Pointer = number & { __pointer__: null };
interface FFITypeToArgsType {
[FFIType.char]: number;
@@ -509,7 +508,7 @@ declare module "bun:ffi" {
* This is useful if the library has already been loaded
* or if the module is also using Node-API.
*/
readonly ptr?: number | bigint;
readonly ptr?: Pointer | bigint;
/**
* Can C/FFI code call this function from a separate thread?
@@ -539,7 +538,7 @@ declare module "bun:ffi" {
// */
// export function callback(ffi: FFIFunction, cb: Function): number;
interface Library<Fns extends Readonly<Record<string, Narrow<FFIFunction>>>> {
interface Library<Fns extends Symbols> {
symbols: ConvertFns<Fns>;
/**
@@ -552,26 +551,9 @@ declare module "bun:ffi" {
close(): void;
}
type ToFFIType<T extends FFITypeOrString> = T extends FFIType
? T
: T extends string
? FFITypeStringToType[T]
: never;
type ToFFIType<T extends FFITypeOrString> = T extends FFIType ? T : T extends string ? FFITypeStringToType[T] : never;
// eslint-disable-next-line @definitelytyped/no-single-element-tuple-type
type _Narrow<T, U> = [U] extends [T] ? U : Extract<T, U>;
type Narrow<T = unknown> =
| _Narrow<T, 0 | (number & {})>
| _Narrow<T, 0n | (bigint & {})>
| _Narrow<T, "" | (string & {})>
| _Narrow<T, boolean>
| _Narrow<T, symbol>
| _Narrow<T, []>
| _Narrow<T, { [_: PropertyKey]: Narrow }>
| (T extends object ? { [K in keyof T]: Narrow<T[K]> } : never)
| Extract<{} | null | undefined, T>;
type ConvertFns<Fns extends Readonly<Record<string, FFIFunction>>> = {
type ConvertFns<Fns extends Symbols> = {
[K in keyof Fns]: (
...args: Fns[K]["args"] extends infer A extends readonly FFITypeOrString[]
? { [L in keyof A]: FFITypeToArgsType[ToFFIType<A[L]>] }
@@ -579,8 +561,7 @@ declare module "bun:ffi" {
[unknown] extends [Fns[K]["args"]]
? []
: never
) => // eslint-disable-next-line @definitelytyped/no-single-element-tuple-type
[unknown] extends [Fns[K]["returns"]]
) => [unknown] extends [Fns[K]["returns"]] // eslint-disable-next-line @definitelytyped/no-single-element-tuple-type
? undefined
: FFITypeToReturnsType[ToFFIType<NonNullable<Fns[K]["returns"]>>];
};
@@ -611,10 +592,7 @@ declare module "bun:ffi" {
* bun uses [tinycc](https://github.com/TinyCC/tinycc), so a big thanks
* goes to Fabrice Bellard and TinyCC maintainers for making this possible.
*/
function dlopen<Fns extends Record<string, Narrow<FFIFunction>>>(
name: string,
symbols: Fns,
): Library<Fns>;
function dlopen<Fns extends Record<string, FFIFunction>>(name: string, symbols: Fns): Library<Fns>;
/**
* Turn a native library's function pointer into a JavaScript function
@@ -700,9 +678,7 @@ declare module "bun:ffi" {
* bun uses [tinycc](https://github.com/TinyCC/tinycc), so a big thanks
* goes to Fabrice Bellard and TinyCC maintainers for making this possible.
*/
function linkSymbols<Fns extends Record<string, Narrow<FFIFunction>>>(
symbols: Fns,
): Library<Fns>;
function linkSymbols<Fns extends Record<string, FFIFunction>>(symbols: Fns): Library<Fns>;
/**
* Read a pointer as a {@link Buffer}
@@ -718,11 +694,7 @@ declare module "bun:ffi" {
* reading beyond the bounds of the pointer will crash the program or cause
* undefined behavior. Use with care!
*/
function toBuffer(
ptr: Pointer,
byteOffset?: number,
byteLength?: number,
): Buffer;
function toBuffer(ptr: Pointer, byteOffset?: number, byteLength?: number): Buffer;
/**
* Read a pointer as an {@link ArrayBuffer}
@@ -738,11 +710,7 @@ declare module "bun:ffi" {
* reading beyond the bounds of the pointer will crash the program or cause
* undefined behavior. Use with care!
*/
function toArrayBuffer(
ptr: Pointer,
byteOffset?: number,
byteLength?: number,
): ArrayBuffer;
function toArrayBuffer(ptr: Pointer, byteOffset?: number, byteLength?: number): ArrayBuffer;
namespace read {
/**
@@ -929,10 +897,7 @@ declare module "bun:ffi" {
* }
* ```
*/
function ptr(
view: NodeJS.TypedArray | ArrayBufferLike | DataView,
byteOffset?: number,
): Pointer;
function ptr(view: NodeJS.TypedArray | ArrayBufferLike | DataView, byteOffset?: number): Pointer;
/**
* Get a string from a UTF-8 encoded C string

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +0,0 @@
// Type definitions for bun {version}
// Project: https://github.com/oven-sh/bun
// Definitions by: Jarred Sumner <https://github.com/Jarred-Sumner>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
/// <reference lib="esnext" />
/// <reference types="node" />
/// <reference types="ws" />
// This file is bundled so that your TypeScript editor integration loads it faster.

View File

@@ -106,13 +106,8 @@ declare namespace HTMLRewriterTypes {
*/
declare class HTMLRewriter {
constructor();
on(
selector: string,
handlers: HTMLRewriterTypes.HTMLRewriterElementContentHandlers,
): HTMLRewriter;
onDocument(
handlers: HTMLRewriterTypes.HTMLRewriterDocumentContentHandlers,
): HTMLRewriter;
on(selector: string, handlers: HTMLRewriterTypes.HTMLRewriterElementContentHandlers): HTMLRewriter;
onDocument(handlers: HTMLRewriterTypes.HTMLRewriterDocumentContentHandlers): HTMLRewriter;
/**
* @param input - The HTML to transform
* @returns A new {@link Response} with the transformed HTML

View File

@@ -11,8 +11,12 @@
/// <reference path="./globals.d.ts" />
/// <reference path="./bun.d.ts" />
/// <reference path="./overrides.d.ts" />
/// <reference path="./fetch.d.ts" />
/// <reference path="./ffi.d.ts" />
/// <reference path="./test.d.ts" />
/// <reference path="./html-rewriter.d.ts" />
/// <reference path="./jsc.d.ts" />
/// <reference path="./sqlite.d.ts" />
/// <reference path="./wasm.d.ts" />
/// <reference path="./deprecated.d.ts" />

View File

@@ -1,9 +1,8 @@
declare module "bun:jsc" {
type AnyFunction = (..._: any[]) => any;
/**
* This used to be called "describe" but it could be confused with the test runner.
*/ function jscDescribe(value: any): string;
*/
function jscDescribe(value: any): string;
function jscDescribeArray(args: any[]): string;
function gcAndSweep(): number;
function fullGC(): number;
@@ -31,13 +30,13 @@ declare module "bun:jsc" {
function setRandomSeed(value: number): void;
function isRope(input: string): boolean;
function callerSourceOrigin(): string;
function noFTL(func: AnyFunction): AnyFunction;
function noOSRExitFuzzing(func: AnyFunction): AnyFunction;
function optimizeNextInvocation(func: AnyFunction): void;
function numberOfDFGCompiles(func: AnyFunction): number;
function noFTL(func: (...args: any[]) => any): (...args: any[]) => any;
function noOSRExitFuzzing(func: (...args: any[]) => any): (...args: any[]) => any;
function optimizeNextInvocation(func: (...args: any[]) => any): void;
function numberOfDFGCompiles(func: (...args: any[]) => any): number;
function releaseWeakRefs(): void;
function totalCompileTime(func: AnyFunction): number;
function reoptimizationRetryCount(func: AnyFunction): number;
function totalCompileTime(func: (...args: any[]) => any): number;
function reoptimizationRetryCount(func: (...args: any[]) => any): number;
function drainMicrotasks(): void;
/**
@@ -47,10 +46,8 @@ declare module "bun:jsc" {
*
* @param value A JavaScript value, usually an object or array, to be converted.
* @returns A SharedArrayBuffer that can be sent to another Bun instance.
*/ function serialize(
value: any,
options?: { binaryType?: "arraybuffer" },
): SharedArrayBuffer;
*/
function serialize(value: any, options?: { binaryType?: "arraybuffer" }): SharedArrayBuffer;
/**
* Convert a JavaScript value to a binary representation that can be sent to another Bun instance.
@@ -59,16 +56,15 @@ declare module "bun:jsc" {
*
* @param value A JavaScript value, usually an object or array, to be converted.
* @returns A Buffer that can be sent to another Bun instance.
*/ function serialize(
value: any,
options?: { binaryType: "nodebuffer" },
): Buffer;
*/
function serialize(value: any, options?: { binaryType: "nodebuffer" }): Buffer;
/**
* Convert an ArrayBuffer or Buffer to a JavaScript value compatible with the HTML Structured Clone Algorithm.
*
* @param value A serialized value, usually an ArrayBuffer or Buffer, to be converted.
*/ function deserialize(value: ArrayBufferLike | TypedArray | Buffer): any;
*/
function deserialize(value: ArrayBufferLike | NodeJS.TypedArray | Buffer): any;
/**
* Set the timezone used by Intl, Date, etc.
@@ -79,7 +75,8 @@ declare module "bun:jsc" {
*
* You can also set process.env.TZ to the time zone you want to use.
* You can also view the current timezone with `Intl.DateTimeFormat().resolvedOptions().timeZone`
*/ function setTimeZone(timeZone: string): string;
*/
function setTimeZone(timeZone: string): string;
/**
* Run JavaScriptCore's sampling profiler for a particular function
@@ -91,7 +88,8 @@ declare module "bun:jsc" {
* - Baseline is the first JIT compilation tier. It's the least optimized, but the fastest to compile
* - DFG means "Data Flow Graph", which is the second JIT compilation tier. It has some optimizations, but is slower to compile
* - FTL means "Faster Than Light", which is the third JIT compilation tier. It has the most optimizations, but is the slowest to compile
*/ function profile(
*/
function profile(
callback: CallableFunction,
sampleInterval?: number,
): {
@@ -197,7 +195,8 @@ declare module "bun:jsc" {
* This function is mostly a debugging tool for bun itself.
*
* Warning: not all objects returned are supposed to be observable from JavaScript
*/ function getProtectedObjects(): any[];
*/
function getProtectedObjects(): any[];
/**
* Start a remote debugging socket server on the given port.
@@ -205,9 +204,11 @@ declare module "bun:jsc" {
* This exposes JavaScriptCore's built-in debugging server.
*
* This is untested. May not be supported yet on macOS
*/ function startRemoteDebugger(host?: string, port?: number): void;
*/
function startRemoteDebugger(host?: string, port?: number): void;
/**
* Run JavaScriptCore's sampling profiler
*/ function startSamplingProfiler(optionalDirectory?: string): void;
*/
function startSamplingProfiler(optionalDirectory?: string): void;
}

View File

@@ -1,38 +1,28 @@
declare namespace NodeJS {
type _BunEnv = import("bun").Env;
interface ProcessVersions extends Dict<string> {
bun: string;
}
interface ProcessEnv extends Dict<string>, _BunEnv {
/**
* Can be used to change the default timezone at runtime
*/
NODE_ENV?: string;
export {};
import type { Env, PathLike, BunFile } from "bun";
declare global {
namespace NodeJS {
interface ProcessVersions extends Dict<string> {
bun: string;
}
interface ProcessEnv extends Env {}
}
}
declare module "fs/promises" {
import { PathLike } from "bun";
function exists(path: PathLike): Promise<boolean>;
}
declare module "tls" {
// eslint-disable-next-line no-duplicate-imports
import { BunFile } from "bun";
type BunConnectionOptions = Omit<ConnectionOptions, "ca" | "tls" | "cert"> & {
interface BunConnectionOptions extends Omit<ConnectionOptions, "key" | "ca" | "tls" | "cert"> {
/**
* Optionally override the trusted CA certificates. Default is to trust
* the well-known CAs curated by Mozilla. Mozilla's CAs are completely
* replaced when CAs are explicitly specified using this option.
*/
ca?:
| string
| Buffer
| NodeJS.TypedArray
| BunFile
| Array<string | Buffer | BunFile>
| undefined;
ca?: string | Buffer | NodeJS.TypedArray | BunFile | Array<string | Buffer | BunFile> | undefined;
/**
* Cert chains in PEM format. One cert chain should be provided per
* private key. Each cert chain should consist of the PEM formatted
@@ -68,10 +58,7 @@ declare module "tls" {
| NodeJS.TypedArray
| Array<string | Buffer | BunFile | NodeJS.TypedArray | KeyObject>
| undefined;
};
}
function connect(
options: BunConnectionOptions,
secureConnectListener?: () => void,
): TLSSocket;
function connect(options: BunConnectionOptions, secureConnectListener?: () => void): TLSSocket;
}

View File

@@ -1,25 +1,37 @@
{
"name": "bun-types",
"repository": "https://github.com/oven-sh/bun",
"license": "MIT",
"main": "",
"types": "index.d.ts",
"description": "Type definitions for Bun, an incredibly fast JavaScript runtime",
"repository": {
"type": "git",
"url": "https://github.com/oven-sh/bun",
"directory": "packages/bun-types"
},
"files": [
"*.d.ts"
],
"homepage": "https://bun.sh",
"dependencies": {
"@types/node": "*",
"@types/ws": "*",
"undici-types": "~5.26.4"
"@types/node": "~20.11.3",
"@types/ws": "~8.5.10"
},
"devDependencies": {
"@biomejs/biome": "^1.5.3",
"@definitelytyped/dtslint": "^0.0.199",
"@definitelytyped/eslint-plugin": "^0.0.197",
"prettier": "^2.4.1",
"typescript": "^5.0.2"
},
"private": true,
"scripts": {
"prebuild": "echo $(pwd)",
"build": "rm -rf ./dist && bun run bundle && bun run fmt",
"bundle": "bun scripts/bundle.ts ./dist",
"build": "bun scripts/build.ts && bun run fmt",
"test": "tsc",
"fmt": "echo $(which prettier) && prettier --write './**/*.{ts,tsx,js,jsx}'"
"fmt": "echo $(which biome) && biome format --write ."
},
"types": "index.d.ts"
}
"keywords": [
"bun",
"bun.js",
"types"
]
}

View File

@@ -0,0 +1,7 @@
import { join } from "node:path";
import pkg from "../package.json";
const BUN_VERSION = (process.env.BUN_VERSION || Bun.version || process.versions.bun).replace(/^.*v/, "");
Bun.write(join(import.meta.dir, "..", "package.json"), JSON.stringify({ version: BUN_VERSION, ...pkg }, null, 2));

View File

@@ -1,103 +0,0 @@
import { file, write } from "bun";
import { mkdirSync } from "fs";
import { join, resolve } from "path";
import { getDotTsFiles } from "./utils/getDotTsFiles";
// Combine all the .d.ts files into a single .d.ts file
// so that your editor loads the types faster
const BUN_VERSION = (
process.env.BUN_VERSION ||
Bun.version ||
process.versions.bun
).replace(/^.*v/, "");
const folder = resolve(process.argv.at(-1)!);
if (folder.endsWith("bundle.ts")) {
throw new Error("Pass a folder");
}
try {
mkdirSync(folder, { recursive: true });
} catch (err) {
err;
}
const header = await file(join(import.meta.dir, "..", "header.txt")).text();
const filesToCat = (await getDotTsFiles("./")).filter(
f => f !== "./index.d.ts",
);
const fileContents: string[] = [];
for (let i = 0; i < filesToCat.length; i++) {
const name = filesToCat[i];
fileContents.push(
"// " +
name +
"\n\n" +
(await file(resolve(import.meta.dir, "..", name)).text()) +
"\n",
);
}
const text = header.replace("{version}", BUN_VERSION) + fileContents.join("\n");
const destination = resolve(folder, "types.d.ts");
await write(destination, text);
const packageJSON = {
name: process.env.PACKAGE_NAME || "bun-types",
version: BUN_VERSION,
license: "MIT",
description:
"Type definitions for Bun, an incredibly fast JavaScript runtime",
types: "types.d.ts",
files: ["types.d.ts", "README.md", "tsconfig.json"],
private: false,
keywords: ["bun", "bun.js", "types"],
repository: "https://github.com/oven-sh/bun",
homepage: "https://bun.sh",
dependencies: {
"@types/node": "*",
"@types/ws": "*",
"undici-types": "^5.26.4",
},
};
await write(
resolve(folder, "package.json"),
JSON.stringify(packageJSON, null, 2) + "\n",
);
const tsConfig = {
compilerOptions: {
lib: ["ESNext"],
target: "ESNext",
module: "ESNext",
moduleResolution: "bundler",
moduleDetection: "force",
resolveJsonModule: true,
strict: true,
downlevelIteration: true,
skipLibCheck: true,
jsx: "react-jsx",
allowImportingTsExtensions: true,
noEmit: true,
composite: true,
allowSyntheticDefaultImports: true,
forceConsistentCasingInFileNames: true,
allowJs: true,
},
};
await write(
resolve(folder, "tsconfig.json"),
JSON.stringify(tsConfig, null, 2) + "\n",
);
await write(
resolve(folder, "README.md"),
file(resolve(import.meta.dir, "..", "README.md")),
);
export {};

View File

@@ -1,12 +0,0 @@
/// <reference path="../index.d.ts" />
import { join } from "path";
// @ts-ignore
import pkg from "../dist/package.json";
const __dirname = new URL(".", import.meta.url).pathname;
pkg.name = `@oven-sh/${pkg.name}`;
await Bun.write(
join(__dirname, "..", "dist", "package.json"),
JSON.stringify(pkg),
);

View File

@@ -1,25 +0,0 @@
import { readdir } from "node:fs/promises";
import { join } from "node:path";
const allDotTsFiles: string[] = [];
export const getDotTsFiles = async (
prefix = "",
folder: string = join(import.meta.dir, "..", ".."),
folderName?: string,
) => {
const files = await readdir(folder, { withFileTypes: true });
for await (const file of files) {
if (
file.isDirectory() &&
(file.name === "node_modules" || file.name === "tests")
)
continue;
if (file.isDirectory())
await getDotTsFiles(prefix, join(folder, file.name), file.name);
else if (file.name.endsWith(".d.ts"))
allDotTsFiles.push(prefix + join(folderName || "", file.name));
}
return allDotTsFiles;
};

View File

@@ -165,17 +165,11 @@ declare module "bun:sqlite" {
* | `bigint` | `INTEGER` |
* | `null` | `NULL` |
*/
run<ParamsType extends SQLQueryBindings[]>(
sqlQuery: string,
...bindings: ParamsType[]
): void;
run<ParamsType extends SQLQueryBindings[]>(sqlQuery: string, ...bindings: ParamsType[]): void;
/**
This is an alias of {@link Database.prototype.run}
*/
exec<ParamsType extends SQLQueryBindings[]>(
sqlQuery: string,
...bindings: ParamsType[]
): void;
exec<ParamsType extends SQLQueryBindings[]>(sqlQuery: string, ...bindings: ParamsType[]): void;
/**
* Compile a SQL query and return a {@link Statement} object. This is the
@@ -226,10 +220,7 @@ declare module "bun:sqlite" {
*
* Under the hood, this calls `sqlite3_prepare_v3`.
*/
prepare<
ReturnType,
ParamsType extends SQLQueryBindings | SQLQueryBindings[],
>(
prepare<ReturnType, ParamsType extends SQLQueryBindings | SQLQueryBindings[]>(
sqlQuery: string,
params?: ParamsType,
): // eslint-disable-next-line @definitelytyped/no-single-element-tuple-type
@@ -435,10 +426,7 @@ declare module "bun:sqlite" {
* });
* ```
*/
static deserialize(
serialized: TypedArray | ArrayBufferLike,
isReadOnly?: boolean,
): Database;
static deserialize(serialized: NodeJS.TypedArray | ArrayBufferLike, isReadOnly?: boolean): Database;
}
/**
@@ -467,10 +455,7 @@ declare module "bun:sqlite" {
* // => undefined
* ```
*/
export class Statement<
ReturnType = unknown,
ParamsType extends SQLQueryBindings[] = any[],
> {
export class Statement<ReturnType = unknown, ParamsType extends SQLQueryBindings[] = any[]> {
/**
* Creates a new prepared statement from native code.
*
@@ -604,9 +589,7 @@ declare module "bun:sqlite" {
* | `bigint` | `INTEGER` |
* | `null` | `NULL` |
*/
values(
...params: ParamsType
): Array<Array<string | bigint | number | boolean | Uint8Array>>;
values(...params: ParamsType): Array<Array<string | bigint | number | boolean | Uint8Array>>;
/**
* The names of the columns returned by the prepared statement.
@@ -802,11 +785,11 @@ declare module "bun:sqlite" {
export type SQLQueryBindings =
| string
| bigint
| TypedArray
| NodeJS.TypedArray
| number
| boolean
| null
| Record<string, string | bigint | TypedArray | number | boolean | null>;
| Record<string, string | bigint | NodeJS.TypedArray | number | boolean | null>;
export default Database;

View File

@@ -13,20 +13,14 @@
* $ bun test <filename>
* ```
*/
declare module "bun:test" {
type AnyFunction = (...args: any) => any;
/**
* -- Mocks --
*/
export interface Mock<T extends AnyFunction>
extends JestMock.MockInstance<T> {
(...args: Parameters<T>): ReturnType<T>;
}
type _Mock<T extends AnyFunction> = Mock<T>;
export type Mock<T extends (...args: any[]) => any> = JestMock.Mock<T>;
export const mock: {
<T extends AnyFunction>(Function: T): Mock<T>;
<T extends (...args: any[]) => any>(Function?: T): Mock<T>;
/**
* Replace the module `id` with the return value of `factory`.
@@ -97,14 +91,15 @@ declare module "bun:test" {
interface Jest {
restoreAllMocks(): void;
fn<T extends AnyFunction>(func?: T): Mock<T>;
fn<T extends (...args: any[]) => any>(func?: T): Mock<T>;
setSystemTime(now?: number | Date): void;
}
export const jest: Jest;
export namespace jest {
/**
* Constructs the type of a mock function, e.g. the return type of `jest.fn()`.
*/
type Mock<T extends AnyFunction = AnyFunction> = _Mock<T>;
type Mock<T extends (...args: any[]) => any = (...args: any[]) => any> = JestMock.Mock<T>;
/**
* Wraps a class, function or object type with Jest mock type definitions.
*/
@@ -116,7 +111,7 @@ declare module "bun:test" {
/**
* Wraps a function type with Jest mock type definitions.
*/
// type MockedFunction<T extends AnyFunction> = JestMock.MockedFunction<T>;
// type MockedFunction<T extends (...args: any[]) => any> = JestMock.MockedFunction<T>;
/**
* Wraps an object type with Jest mock type definitions.
*/
@@ -128,7 +123,7 @@ declare module "bun:test" {
/**
* Constructs the type of a spied class or function.
*/
type Spied<T extends JestMock.ClassLike | AnyFunction> = JestMock.Spied<T>;
type Spied<T extends JestMock.ClassLike | ((...args: any[]) => any)> = JestMock.Spied<T>;
/**
* Constructs the type of a spied class.
*/
@@ -136,7 +131,7 @@ declare module "bun:test" {
/**
* Constructs the type of a spied function.
*/
type SpiedFunction<T extends AnyFunction> = JestMock.SpiedFunction<T>;
type SpiedFunction<T extends (...args: any[]) => any> = JestMock.SpiedFunction<T>;
/**
* Constructs the type of a spied getter.
*/
@@ -150,7 +145,7 @@ declare module "bun:test" {
export function spyOn<T extends object, K extends keyof T>(
obj: T,
methodOrPropertyValue: K,
): Mock<T[K] extends AnyFunction ? T[K] : never>;
): Mock<T[K] extends (...args: any[]) => any ? T[K] : never>;
/**
* Describes a group of related tests.
@@ -191,6 +186,12 @@ declare module "bun:test" {
* @param fn the function that defines the tests
*/
todo(label: string, fn?: () => void): void;
/**
* Marks this group of tests as broken and in need of fixing.
* @param label the label for the tests
* @param fn the function that defines the tests
*/
fixme(label: string, fn?: () => void): void;
/**
* Runs this group of tests, only if `condition` is true.
*
@@ -213,25 +214,13 @@ declare module "bun:test" {
each<T extends Readonly<[any, ...any[]]>>(
table: readonly T[],
): (
label: string,
fn: (...args: [...T]) => void | Promise<unknown>,
options?: number | TestOptions,
) => void;
): (label: string, fn: (...args: [...T]) => void | Promise<unknown>, options?: number | TestOptions) => void;
each<T extends any[]>(
table: readonly T[],
): (
label: string,
fn: (...args: Readonly<T>) => void | Promise<unknown>,
options?: number | TestOptions,
) => void;
): (label: string, fn: (...args: Readonly<T>) => void | Promise<unknown>, options?: number | TestOptions) => void;
each<T>(
table: T[],
): (
label: string,
fn: (...args: T[]) => void | Promise<unknown>,
options?: number | TestOptions,
) => void;
): (label: string, fn: (...args: T[]) => void | Promise<unknown>, options?: number | TestOptions) => void;
}
/**
* Describes a group of related tests.
@@ -266,11 +255,7 @@ declare module "bun:test" {
*
* @param fn the function to run
*/
export function beforeAll(
fn:
| (() => void | Promise<unknown>)
| ((done: (err?: unknown) => void) => void),
): void;
export function beforeAll(fn: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void)): void;
/**
* Runs a function before each test.
*
@@ -281,11 +266,7 @@ declare module "bun:test" {
*
* @param fn the function to run
*/
export function beforeEach(
fn:
| (() => void | Promise<unknown>)
| ((done: (err?: unknown) => void) => void),
): void;
export function beforeEach(fn: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void)): void;
/**
* Runs a function, once, after all the tests.
*
@@ -302,11 +283,7 @@ declare module "bun:test" {
*
* @param fn the function to run
*/
export function afterAll(
fn:
| (() => void | Promise<unknown>)
| ((done: (err?: unknown) => void) => void),
): void;
export function afterAll(fn: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void)): void;
/**
* Runs a function after each test.
*
@@ -315,11 +292,7 @@ declare module "bun:test" {
*
* @param fn the function to run
*/
export function afterEach(
fn:
| (() => void | Promise<unknown>)
| ((done: (err?: unknown) => void) => void),
): void;
export function afterEach(fn: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void)): void;
export interface TestOptions {
/**
* Sets the timeout for the test in milliseconds.
@@ -369,9 +342,7 @@ declare module "bun:test" {
export interface Test {
(
label: string,
fn:
| (() => void | Promise<unknown>)
| ((done: (err?: unknown) => void) => void),
fn: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void),
/**
* - If a `number`, sets the timeout for the test in milliseconds.
* - If an `object`, sets the options for the test.
@@ -382,7 +353,7 @@ declare module "bun:test" {
options?: number | TestOptions,
): void;
/**
* Skips all other tests, except this test.
* Skips all other tests, except this test when run with the `--only` option.
*
* @param label the label for the test
* @param fn the test function
@@ -390,9 +361,7 @@ declare module "bun:test" {
*/
only(
label: string,
fn:
| (() => void | Promise<unknown>)
| ((done: (err?: unknown) => void) => void),
fn: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void),
options?: number | TestOptions,
): void;
/**
@@ -404,9 +373,7 @@ declare module "bun:test" {
*/
skip(
label: string,
fn:
| (() => void | Promise<unknown>)
| ((done: (err?: unknown) => void) => void),
fn: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void),
options?: number | TestOptions,
): void;
/**
@@ -423,9 +390,22 @@ declare module "bun:test" {
*/
todo(
label: string,
fn?:
| (() => void | Promise<unknown>)
| ((done: (err?: unknown) => void) => void),
fn?: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void),
options?: number | TestOptions,
): void;
/**
* Marks this test as broken and in need of fixing.
*
* If the test function fails, it will be marked as `fixme` in the test results
* instead of `fail`. This is useful for marking tests that are known to be broken.
*
* @param label the label for the test
* @param fn the test function
* @param options the test timeout or options
*/
fixme(
label: string,
fn?: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void),
options?: number | TestOptions,
): void;
/**
@@ -439,9 +419,7 @@ declare module "bun:test" {
condition: boolean,
): (
label: string,
fn:
| (() => void | Promise<unknown>)
| ((done: (err?: unknown) => void) => void),
fn: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void),
options?: number | TestOptions,
) => void;
/**
@@ -453,9 +431,31 @@ declare module "bun:test" {
condition: boolean,
): (
label: string,
fn:
| (() => void | Promise<unknown>)
| ((done: (err?: unknown) => void) => void),
fn: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void),
options?: number | TestOptions,
) => void;
/**
* Marks this test as `todo`, if `condition` is true.
*
* @param condition if the test should be marked as `todo`
*/
todoIf(
condition: boolean,
): (
label: string,
fn?: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void),
options?: number | TestOptions,
) => void;
/**
* Marks this test as `fixme`, if `condition` is true.
*
* @param condition if the test should be marked as `fixme`
*/
fixmeIf(
condition: boolean,
): (
label: string,
fn?: (() => void | Promise<unknown>) | ((done: (err?: unknown) => void) => void),
options?: number | TestOptions,
) => void;
/**
@@ -465,25 +465,13 @@ declare module "bun:test" {
*/
each<T extends Readonly<[any, ...any[]]>>(
table: readonly T[],
): (
label: string,
fn: (...args: [...T]) => void | Promise<unknown>,
options?: number | TestOptions,
) => void;
): (label: string, fn: (...args: [...T]) => void | Promise<unknown>, options?: number | TestOptions) => void;
each<T extends any[]>(
table: readonly T[],
): (
label: string,
fn: (...args: Readonly<T>) => void | Promise<unknown>,
options?: number | TestOptions,
) => void;
): (label: string, fn: (...args: Readonly<T>) => void | Promise<unknown>, options?: number | TestOptions) => void;
each<T>(
table: T[],
): (
label: string,
fn: (...args: T[]) => void | Promise<unknown>,
options?: number | TestOptions,
) => void;
): (label: string, fn: (...args: T[]) => void | Promise<unknown>, options?: number | TestOptions) => void;
}
/**
* Runs a test.
@@ -517,8 +505,7 @@ declare module "bun:test" {
*/
export const expect: Expect;
type ExpectNot = Omit<AsymmetricMatchers, keyof AsymmetricMatchersBuiltin> &
AsymmetricMatchersBuiltinNegated;
type ExpectNot = Omit<AsymmetricMatchers, keyof AsymmetricMatchersBuiltin> & AsymmetricMatchersBuiltinNegated;
export interface Expect extends AsymmetricMatchers {
// the `expect()` callable signature
@@ -619,7 +606,6 @@ declare module "bun:test" {
* interface Matchers<T> extends MyCustomMatchers {}
* interface AsymmetricMatchers extends MyCustomMatchers {}
* }
* export {};
*
* @example
* // my_modules.d.ts (alternatively)
@@ -631,7 +617,6 @@ declare module "bun:test" {
* toBeWithinRange(floor: number, ceiling: number): any;
* }
* }
* export {};
*/
export interface Matchers<T = unknown> extends MatchersBuiltin<T> {}
@@ -646,7 +631,6 @@ declare module "bun:test" {
* interface Matchers<T> extends MyCustomMatchers {}
* interface AsymmetricMatchers extends MyCustomMatchers {}
* }
* export {};
*
* @example
* // my_modules.d.ts (alternatively)
@@ -658,7 +642,6 @@ declare module "bun:test" {
* toBeWithinRange(floor: number, ceiling: number): any;
* }
* }
* export {};
*/
export interface AsymmetricMatchers extends AsymmetricMatchersBuiltin {}
@@ -679,9 +662,7 @@ declare module "bun:test" {
* expect(mock).toBeCalledWith(expect.any(Number));
* });
*/
any(
constructor: ((..._: any[]) => any) | { new (..._: any[]): any },
): AsymmetricMatcher;
any(constructor: ((...args: any[]) => any) | { new (...args: any[]): any }): AsymmetricMatcher;
/**
* Matches anything but null or undefined. You can use it inside `toEqual` or `toBeCalledWith` instead
* of a literal value. For example, if you want to check that a mock function is called with a
@@ -1027,10 +1008,7 @@ declare module "bun:test" {
* @param keyPath the expected property name or path, or an index
* @param value the expected property value, if provided
*/
toHaveProperty(
keyPath: string | number | Array<string | number>,
value?: unknown,
): void;
toHaveProperty(keyPath: string | number | Array<string | number>, value?: unknown): void;
/**
* Asserts that a value is "truthy".
*
@@ -1285,17 +1263,7 @@ declare module "bun:test" {
* expect("hello").toBeTypeOf("string");
* expect([]).not.toBeTypeOf("boolean");
*/
toBeTypeOf(
type:
| "bigint"
| "boolean"
| "function"
| "number"
| "object"
| "string"
| "symbol"
| "undefined",
): void;
toBeTypeOf(type: "bigint" | "boolean" | "function" | "number" | "object" | "string" | "symbol" | "undefined"): void;
/**
* Asserts that a value is `false`.
*
@@ -1499,10 +1467,7 @@ declare module "bun:test" {
) => MatcherResult | Promise<MatcherResult>;
/** All non-builtin matchers and asymmetric matchers that have been type-registered through declaration merging */
export type CustomMatchersDetected = Omit<
Matchers<unknown>,
keyof MatchersBuiltin<unknown>
> &
export type CustomMatchersDetected = Omit<Matchers<unknown>, keyof MatchersBuiltin<unknown>> &
Omit<AsymmetricMatchers, keyof AsymmetricMatchersBuiltin>;
/**
@@ -1516,12 +1481,7 @@ declare module "bun:test" {
};
/** Custom equality tester */
export type Tester = (
this: TesterContext,
a: any,
b: any,
customTesters: Tester[],
) => boolean | undefined;
export type Tester = (this: TesterContext, a: any, b: any, customTesters: Tester[]) => boolean | undefined;
export type EqualsFunction = (
a: unknown,
@@ -1586,8 +1546,7 @@ declare module "bun:test" {
}
declare module "test" {
import BunTestModule = require("bun:test");
export = BunTestModule;
export type * from "bun:test";
}
declare namespace JestMock {
@@ -1615,6 +1574,10 @@ declare namespace JestMock {
[K in keyof T as Required<T>[K] extends FunctionLike ? K : never]: T[K];
};
export interface Mock<T extends (...args: any[]) => any> extends MockInstance<T> {
(...args: Parameters<T>): ReturnType<T>;
}
/**
* All what the internal typings need is to be sure that we have any-function.
* `FunctionLike` type ensures that and helps to constrain the type as well.
@@ -1892,13 +1855,9 @@ declare namespace JestMock {
// ): MockedShallow<T>;
// }
export type PropertyLikeKeys<T> = Exclude<
keyof T,
ConstructorLikeKeys<T> | MethodLikeKeys<T>
>;
export type PropertyLikeKeys<T> = Exclude<keyof T, ConstructorLikeKeys<T> | MethodLikeKeys<T>>;
export type RejectType<T extends FunctionLike> =
ReturnType<T> extends PromiseLike<any> ? unknown : never;
export type RejectType<T extends FunctionLike> = ReturnType<T> extends PromiseLike<any> ? unknown : never;
export interface Replaced<T = unknown> {
/**
@@ -1919,16 +1878,13 @@ declare namespace JestMock {
[K in keyof T as Required<T>[K] extends ClassLike ? K : never]: T[K];
}
| keyof {
[K_1 in keyof T as Required<T>[K_1] extends FunctionLike
? K_1
: never]: T[K_1];
[K_1 in keyof T as Required<T>[K_1] extends FunctionLike ? K_1 : never]: T[K_1];
}
>,
V extends T[K_2],
>(object: T, propertyKey: K_2, value: V): Replaced<T[K_2]>;
export type ResolveType<T extends FunctionLike> =
ReturnType<T> extends PromiseLike<infer U> ? U : never;
export type ResolveType<T extends FunctionLike> = ReturnType<T> extends PromiseLike<infer U> ? U : never;
export type Spied<T extends ClassLike | FunctionLike> = T extends ClassLike
? SpiedClass<T>
@@ -1940,15 +1896,15 @@ declare namespace JestMock {
(...args: ConstructorParameters<T>) => InstanceType<T>
>;
export type SpiedFunction<T extends FunctionLike = UnknownFunction> =
MockInstance<(...args: Parameters<T>) => ReturnType<T>>;
export type SpiedFunction<T extends FunctionLike = UnknownFunction> = MockInstance<
(...args: Parameters<T>) => ReturnType<T>
>;
export type SpiedGetter<T> = MockInstance<() => T>;
export type SpiedSetter<T> = MockInstance<(arg: T) => void>;
export interface SpyInstance<T extends FunctionLike = UnknownFunction>
extends MockInstance<T> {}
export interface SpyInstance<T extends FunctionLike = UnknownFunction> extends MockInstance<T> {}
export const spyOn: {
<
@@ -1956,14 +1912,10 @@ declare namespace JestMock {
K_2 extends Exclude<
keyof T,
| keyof {
[K in keyof T as Required<T>[K] extends ClassLike
? K
: never]: T[K];
[K in keyof T as Required<T>[K] extends ClassLike ? K : never]: T[K];
}
| keyof {
[K_1 in keyof T as Required<T>[K_1] extends FunctionLike
? K_1
: never]: T[K_1];
[K_1 in keyof T as Required<T>[K_1] extends FunctionLike ? K_1 : never]: T[K_1];
}
>,
V extends Required<T>[K_2],
@@ -1972,23 +1924,15 @@ declare namespace JestMock {
object: T,
methodKey: K_2,
accessType: A,
): A extends "get"
? SpiedGetter<V>
: A extends "set"
? SpiedSetter<V>
: never;
): A extends "get" ? SpiedGetter<V> : A extends "set" ? SpiedSetter<V> : never;
<
T_1 extends object,
K_5 extends
| keyof {
[K_3 in keyof T_1 as Required<T_1>[K_3] extends ClassLike
? K_3
: never]: T_1[K_3];
[K_3 in keyof T_1 as Required<T_1>[K_3] extends ClassLike ? K_3 : never]: T_1[K_3];
}
| keyof {
[K_4 in keyof T_1 as Required<T_1>[K_4] extends FunctionLike
? K_4
: never]: T_1[K_4];
[K_4 in keyof T_1 as Required<T_1>[K_4] extends FunctionLike ? K_4 : never]: T_1[K_4];
},
V_1 extends Required<T_1>[K_5],
>(
@@ -2002,6 +1946,4 @@ declare namespace JestMock {
}
export type UnknownFunction = (...args: unknown[]) => unknown;
export {};
}

View File

@@ -1,8 +1,8 @@
import { expectType } from "./utilities.test";
async function* listReleases() {
for (let page = 1; ; page++) {
const response = await fetch(
`https://api.github.com/repos/oven-sh/bun/releases?page=${page}`,
);
const response = await fetch(`https://api.github.com/repos/oven-sh/bun/releases?page=${page}`);
const releases = (await response.json()) as Array<{ data: string }>;
if (!releases.length) {
break;
@@ -15,4 +15,18 @@ async function* listReleases() {
await Array.fromAsync(listReleases());
// Tests from issue #8484
// https://github.com/oven-sh/bun/issues/8484
async function* naturals() {
for (let i = 0; i < 10; i++) {
yield i;
}
}
const test1 = await Array.fromAsync(naturals(), n => Promise.resolve(`${n}`));
expectType<string[]>(test1);
const test2 = await Array.fromAsync([Promise.resolve(1), Promise.resolve(2)]);
expectType<number[]>(test2);
export {};

View File

@@ -163,10 +163,7 @@ tsd.expectType<CString>(lib2.symbols.sqlite3_libversion());
// tslint:disable-next-line:no-void-expression
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type
tsd.expectType<void>(lib2.symbols.multi_args(1, 2));
tsd.expectTypeEquals<
ReturnType<(typeof lib2)["symbols"]["no_returns"]>,
undefined
>(true);
tsd.expectTypeEquals<ReturnType<(typeof lib2)["symbols"]["no_returns"]>, undefined>(true);
tsd.expectTypeEquals<Parameters<(typeof lib2)["symbols"]["no_args"]>, []>(true);
tsd.expectType<number>(read.u8(0));

View File

@@ -32,9 +32,7 @@ expectType<Uint8Array>(
windowBits: 15,
}),
);
expectType<Uint8Array>(
Bun.gzipSync(new Uint8Array(128), { level: 9, memLevel: 6, windowBits: 27 }),
);
expectType<Uint8Array>(Bun.gzipSync(new Uint8Array(128), { level: 9, memLevel: 6, windowBits: 27 }));
expectType<Uint8Array>(Bun.inflateSync(new Uint8Array(64))); // Pretend this is DEFLATE compressed data
expectType<Uint8Array>(Bun.gunzipSync(new Uint8Array(64))); // Pretend this is GZIP compressed data
expectAssignable<ZlibCompressionOptions>({ windowBits: -11 });
@@ -46,9 +44,7 @@ expectType<URL>(Bun.pathToFileURL("/foo/bar.txt"));
expectType<string>(Bun.fileURLToPath(new URL("file:///foo/bar.txt")));
// Testing ../fs.d.ts
expectType<string>(
fs.readFileSync("./index.d.ts", { encoding: "utf-8" }).toString(),
);
expectType<string>(fs.readFileSync("./index.d.ts", { encoding: "utf-8" }).toString());
expectType<boolean>(fs.existsSync("./index.d.ts"));
// tslint:disable-next-line:no-void-expression
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type
@@ -61,9 +57,7 @@ expectType<void>(fs.appendFileSync("./index.d.ts", "test"));
expectType<void>(fs.mkdirSync("./index.d.ts"));
// Testing ^promises.d.ts
expectType<string>(
(await fsPromises.readFile("./index.d.ts", { encoding: "utf-8" })).toString(),
);
expectType<string>((await fsPromises.readFile("./index.d.ts", { encoding: "utf-8" })).toString());
expectType<Promise<void>>(fsPromises.access("./index.d.ts"));
expectType<Promise<void>>(fsPromises.appendFile("./index.d.ts", "test"));
expectType<Promise<void>>(fsPromises.mkdir("./index.d.ts"));

View File

@@ -1,11 +1,4 @@
import {
FileSink,
NullSubprocess,
PipedSubprocess,
ReadableSubprocess,
SyncSubprocess,
WritableSubprocess,
} from "bun";
import { FileSink, NullSubprocess, PipedSubprocess, ReadableSubprocess, SyncSubprocess, WritableSubprocess } from "bun";
import * as tsd from "./utilities.test";
Bun.spawn(["echo", "hello"]);
@@ -32,11 +25,7 @@ function depromise<T>(_promise: Promise<T>): T {
{
const proc = Bun.spawn(["cat"], {
stdin: depromise(
fetch(
"https://raw.githubusercontent.com/oven-sh/bun/main/examples/hashing.js",
),
),
stdin: depromise(fetch("https://raw.githubusercontent.com/oven-sh/bun/main/examples/hashing.js")),
});
const text = depromise(new Response(proc.stdout).text());
@@ -141,36 +130,16 @@ function depromise<T>(_promise: Promise<T>): T {
});
tsd.expectType<number>(proc.stdin);
}
tsd.expectAssignable<PipedSubprocess>(
Bun.spawn([], { stdio: ["pipe", "pipe", "pipe"] }),
);
tsd.expectNotAssignable<PipedSubprocess>(
Bun.spawn([], { stdio: ["inherit", "inherit", "inherit"] }),
);
tsd.expectAssignable<ReadableSubprocess>(
Bun.spawn([], { stdio: ["ignore", "pipe", "pipe"] }),
);
tsd.expectAssignable<ReadableSubprocess>(
Bun.spawn([], { stdio: ["pipe", "pipe", "pipe"] }),
);
tsd.expectNotAssignable<ReadableSubprocess>(
Bun.spawn([], { stdio: ["pipe", "ignore", "pipe"] }),
);
tsd.expectAssignable<WritableSubprocess>(
Bun.spawn([], { stdio: ["pipe", "pipe", "pipe"] }),
);
tsd.expectAssignable<WritableSubprocess>(
Bun.spawn([], { stdio: ["pipe", "ignore", "inherit"] }),
);
tsd.expectNotAssignable<WritableSubprocess>(
Bun.spawn([], { stdio: ["ignore", "pipe", "pipe"] }),
);
tsd.expectAssignable<NullSubprocess>(
Bun.spawn([], { stdio: ["ignore", "inherit", "ignore"] }),
);
tsd.expectAssignable<NullSubprocess>(
Bun.spawn([], { stdio: [null, null, null] }),
);
tsd.expectAssignable<PipedSubprocess>(Bun.spawn([], { stdio: ["pipe", "pipe", "pipe"] }));
tsd.expectNotAssignable<PipedSubprocess>(Bun.spawn([], { stdio: ["inherit", "inherit", "inherit"] }));
tsd.expectAssignable<ReadableSubprocess>(Bun.spawn([], { stdio: ["ignore", "pipe", "pipe"] }));
tsd.expectAssignable<ReadableSubprocess>(Bun.spawn([], { stdio: ["pipe", "pipe", "pipe"] }));
tsd.expectNotAssignable<ReadableSubprocess>(Bun.spawn([], { stdio: ["pipe", "ignore", "pipe"] }));
tsd.expectAssignable<WritableSubprocess>(Bun.spawn([], { stdio: ["pipe", "pipe", "pipe"] }));
tsd.expectAssignable<WritableSubprocess>(Bun.spawn([], { stdio: ["pipe", "ignore", "inherit"] }));
tsd.expectNotAssignable<WritableSubprocess>(Bun.spawn([], { stdio: ["ignore", "pipe", "pipe"] }));
tsd.expectAssignable<NullSubprocess>(Bun.spawn([], { stdio: ["ignore", "inherit", "ignore"] }));
tsd.expectAssignable<NullSubprocess>(Bun.spawn([], { stdio: [null, null, null] }));
tsd.expectNotAssignable<ReadableSubprocess>(Bun.spawn([], {}));
tsd.expectNotAssignable<PipedSubprocess>(Bun.spawn([], {}));

View File

@@ -1,13 +1,4 @@
import {
afterAll,
afterEach,
beforeAll,
beforeEach,
describe,
expect,
spyOn,
test,
} from "bun:test";
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, spyOn, test } from "bun:test";
import { expectType } from "./utilities.test";
const spy = spyOn(console, "log");

View File

@@ -5,6 +5,4 @@ export declare const expectAssignable: <T>(expression: T) => void;
// eslint-disable-next-line @definitelytyped/no-unnecessary-generics
export declare const expectNotAssignable: <T>(expression: any) => void;
// eslint-disable-next-line @definitelytyped/no-unnecessary-generics
export declare const expectTypeEquals: <T, S>(
expression: T extends S ? (S extends T ? true : false) : false,
) => void;
export declare const expectTypeEquals: <T, S>(expression: T extends S ? (S extends T ? true : false) : false) => void;

270
packages/bun-types/wasm.d.ts vendored Normal file
View File

@@ -0,0 +1,270 @@
export {};
type _Global<T extends Bun.WebAssembly.ValueType = Bun.WebAssembly.ValueType> = typeof globalThis extends {
onerror: any;
WebAssembly: { Global: infer T };
}
? T
: Bun.WebAssembly.Global<T>;
type _CompileError = typeof globalThis extends {
onerror: any;
WebAssembly: { CompileError: infer T };
}
? T
: Bun.WebAssembly.CompileError;
type _LinkError = typeof globalThis extends {
onerror: any;
WebAssembly: { LinkError: infer T };
}
? T
: Bun.WebAssembly.LinkError;
type _RuntimeError = typeof globalThis extends {
onerror: any;
WebAssembly: { RuntimeError: infer T };
}
? T
: Bun.WebAssembly.RuntimeError;
type _Memory = typeof globalThis extends {
onerror: any;
WebAssembly: { Memory: infer T };
}
? T
: Bun.WebAssembly.Memory;
type _Instance = typeof globalThis extends {
onerror: any;
WebAssembly: { Instance: infer T };
}
? T
: Bun.WebAssembly.Instance;
type _Module = typeof globalThis extends {
onerror: any;
WebAssembly: { Module: infer T };
}
? T
: Bun.WebAssembly.Module;
type _Table = typeof globalThis extends {
onerror: any;
WebAssembly: { Table: infer T };
}
? T
: Bun.WebAssembly.Table;
declare global {
namespace Bun {
namespace WebAssembly {
type ImportExportKind = "function" | "global" | "memory" | "table";
type TableKind = "anyfunc" | "externref";
// eslint-disable-next-line @typescript-eslint/ban-types
type ExportValue = Function | Global | WebAssembly.Memory | WebAssembly.Table;
type Exports = Record<string, ExportValue>;
type ImportValue = ExportValue | number;
type Imports = Record<string, ModuleImports>;
type ModuleImports = Record<string, ImportValue>;
interface ValueTypeMap {
// eslint-disable-next-line @typescript-eslint/ban-types
anyfunc: Function;
externref: any;
f32: number;
f64: number;
i32: number;
i64: bigint;
v128: never;
}
type ValueType = keyof ValueTypeMap;
interface GlobalDescriptor<T extends ValueType = ValueType> {
mutable?: boolean;
value: T;
}
interface Global<T extends ValueType = ValueType> {
// <T extends ValueType = ValueType> {
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Global/value) */
value: ValueTypeMap[T];
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Global/valueOf) */
valueOf(): ValueTypeMap[T];
}
interface CompileError extends Error {}
interface LinkError extends Error {}
interface RuntimeError extends Error {}
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance) */
interface Instance {
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance/exports) */
readonly exports: Exports;
}
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory) */
interface Memory {
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory/buffer) */
readonly buffer: ArrayBuffer;
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory/grow) */
grow(delta: number): number;
}
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module) */
interface Module {}
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table) */
interface Table {
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/length) */
readonly length: number;
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/get) */
get(index: number): any;
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/grow) */
grow(delta: number, value?: any): number;
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/set) */
set(index: number, value?: any): void;
}
interface MemoryDescriptor {
initial: number;
maximum?: number;
shared?: boolean;
}
interface ModuleExportDescriptor {
kind: ImportExportKind;
name: string;
}
interface ModuleImportDescriptor {
kind: ImportExportKind;
module: string;
name: string;
}
interface TableDescriptor {
element: TableKind;
initial: number;
maximum?: number;
}
interface WebAssemblyInstantiatedSource {
instance: Instance;
module: Module;
}
}
}
namespace WebAssembly {
interface ValueTypeMap extends Bun.WebAssembly.ValueTypeMap {}
interface GlobalDescriptor<T extends keyof ValueTypeMap = keyof ValueTypeMap>
extends Bun.WebAssembly.GlobalDescriptor<T> {}
interface MemoryDescriptor extends Bun.WebAssembly.MemoryDescriptor {}
interface ModuleExportDescriptor extends Bun.WebAssembly.ModuleExportDescriptor {}
interface ModuleImportDescriptor extends Bun.WebAssembly.ModuleImportDescriptor {}
interface TableDescriptor extends Bun.WebAssembly.TableDescriptor {}
interface WebAssemblyInstantiatedSource extends Bun.WebAssembly.WebAssemblyInstantiatedSource {}
interface LinkError extends _LinkError {}
var LinkError: {
prototype: LinkError;
new (message?: string): LinkError;
(message?: string): LinkError;
};
interface CompileError extends _CompileError {}
var CompileError: typeof globalThis extends {
onerror: any;
WebAssembly: { CompileError: infer T };
}
? T
: {
prototype: CompileError;
new (message?: string): CompileError;
(message?: string): CompileError;
};
interface RuntimeError extends _RuntimeError {}
var RuntimeError: {
prototype: RuntimeError;
new (message?: string): RuntimeError;
(message?: string): RuntimeError;
};
interface Global<T extends keyof ValueTypeMap = keyof ValueTypeMap> extends _Global<T> {}
var Global: typeof globalThis extends {
onerror: any;
WebAssembly: { Global: infer T };
}
? T
: {
prototype: Global;
new <T extends Bun.WebAssembly.ValueType = Bun.WebAssembly.ValueType>(
descriptor: GlobalDescriptor<T>,
v?: ValueTypeMap[T],
): Global<T>;
};
interface Instance extends _Instance {}
var Instance: typeof globalThis extends {
onerror: any;
WebAssembly: { Instance: infer T };
}
? T
: {
prototype: Instance;
new (module: Module, importObject?: Bun.WebAssembly.Imports): Instance;
};
interface Memory extends _Memory {}
var Memory: {
prototype: Memory;
new (descriptor: MemoryDescriptor): Memory;
};
interface Module extends _Module {}
var Module: typeof globalThis extends {
onerror: any;
WebAssembly: { Module: infer T };
}
? T
: {
prototype: Module;
new (bytes: Bun.BufferSource): Module;
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/customSections) */
customSections(moduleObject: Module, sectionName: string): ArrayBuffer[];
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/exports) */
exports(moduleObject: Module): ModuleExportDescriptor[];
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/imports) */
imports(moduleObject: Module): ModuleImportDescriptor[];
};
interface Table extends _Table {}
var Table: {
prototype: Table;
new (descriptor: TableDescriptor, value?: any): Table;
};
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/compile) */
function compile(bytes: Bun.BufferSource): Promise<Module>;
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/compileStreaming) */
function compileStreaming(source: Response | PromiseLike<Response>): Promise<Module>;
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiate) */
function instantiate(
bytes: Bun.BufferSource,
importObject?: Bun.WebAssembly.Imports,
): Promise<WebAssemblyInstantiatedSource>;
function instantiate(moduleObject: Module, importObject?: Bun.WebAssembly.Imports): Promise<Instance>;
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming) */
function instantiateStreaming(
source: Response | PromiseLike<Response>,
importObject?: Bun.WebAssembly.Imports,
): Promise<WebAssemblyInstantiatedSource>;
/** [MDN Reference](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/validate) */
function validate(bytes: Bun.BufferSource): boolean;
}
}

View File

@@ -1,38 +1,38 @@
// Script to update certdata.txt from NSS.
import { execFileSync } from 'node:child_process';
import { randomUUID } from 'node:crypto';
import { createWriteStream } from 'node:fs';
import { basename, dirname, join, relative } from 'node:path';
import { Readable } from 'node:stream';
import { pipeline } from 'node:stream/promises';
import { fileURLToPath } from 'node:url';
import { parseArgs } from 'node:util';
import { execFileSync } from "node:child_process";
import { randomUUID } from "node:crypto";
import { createWriteStream } from "node:fs";
import { basename, dirname, join, relative } from "node:path";
import { Readable } from "node:stream";
import { pipeline } from "node:stream/promises";
import { fileURLToPath } from "node:url";
import { parseArgs } from "node:util";
// Constants for NSS release metadata.
const kNSSVersion = 'version';
const kNSSDate = 'date';
const kFirefoxVersion = 'firefoxVersion';
const kFirefoxDate = 'firefoxDate';
const kNSSVersion = "version";
const kNSSDate = "date";
const kFirefoxVersion = "firefoxVersion";
const kFirefoxDate = "firefoxDate";
const __filename = fileURLToPath(import.meta.url);
const now = new Date();
const formatDate = (d) => {
const formatDate = d => {
const iso = d.toISOString();
return iso.substring(0, iso.indexOf('T'));
return iso.substring(0, iso.indexOf("T"));
};
const getCertdataURL = (version) => {
const tag = `NSS_${version.replaceAll('.', '_')}_RTM`;
const getCertdataURL = version => {
const tag = `NSS_${version.replaceAll(".", "_")}_RTM`;
const certdataURL = `https://hg.mozilla.org/projects/nss/raw-file/${tag}/lib/ckfw/builtins/certdata.txt`;
return certdataURL;
};
const normalizeTD = (text) => {
const normalizeTD = text => {
// Remove whitespace and any HTML tags.
return text?.trim().replace(/<.*?>/g, '');
return text?.trim().replace(/<.*?>/g, "");
};
const getReleases = (text) => {
const getReleases = text => {
const releases = [];
const tableRE = /<table [^>]+>([\S\s]*?)<\/table>/g;
const tableRowRE = /<tr ?[^>]*>([\S\s]*?)<\/tr>/g;
@@ -46,7 +46,7 @@ const getReleases = (text) => {
if (row.done) {
continue;
}
const headers = Array.from(row.value[1].matchAll(tableHeaderRE), (m) => m[1]);
const headers = Array.from(row.value[1].matchAll(tableHeaderRE), m => m[1]);
if (headers.length > 0) {
for (let i = 0; i < headers.length; i++) {
if (/NSS version/i.test(headers[i])) {
@@ -67,7 +67,7 @@ const getReleases = (text) => {
// Scrape releases.
row = matches.next();
while (!row.done) {
const cells = Array.from(row.value[1].matchAll(tableDataRE), (m) => m[1]);
const cells = Array.from(row.value[1].matchAll(tableDataRE), m => m[1]);
const release = {};
release[kNSSVersion] = normalizeTD(cells[columns[kNSSVersion]]);
release[kNSSDate] = new Date(normalizeTD(cells[columns[kNSSDate]]));
@@ -80,7 +80,7 @@ const getReleases = (text) => {
return releases;
};
const getLatestVersion = async (releases) => {
const getLatestVersion = async releases => {
const arrayNumberSortDescending = (x, y, i) => {
if (x[i] === undefined && y[i] === undefined) {
return 0;
@@ -89,8 +89,8 @@ const getLatestVersion = async (releases) => {
}
return (y[i] ?? 0) - (x[i] ?? 0);
};
const extractVersion = (t) => {
return t[kNSSVersion].split('.').map((n) => parseInt(n));
const extractVersion = t => {
return t[kNSSVersion].split(".").map(n => parseInt(n));
};
const releaseSorter = (x, y) => {
return arrayNumberSortDescending(extractVersion(x), extractVersion(y), 0);
@@ -102,34 +102,31 @@ const getLatestVersion = async (releases) => {
if (values.verbose) {
console.log(`Trying ${candidateURL}`);
}
const response = await fetch(candidateURL, { method: 'HEAD' });
const response = await fetch(candidateURL, { method: "HEAD" });
if (response.ok) {
return candidate[kNSSVersion];
}
}
};
const pastRelease = (r) => {
const pastRelease = r => {
return r[kNSSDate] < now;
};
const options = {
help: {
type: 'boolean',
type: "boolean",
},
file: {
short: 'f',
type: 'string',
short: "f",
type: "string",
},
verbose: {
short: 'v',
type: 'boolean',
short: "v",
type: "boolean",
},
};
const {
positionals,
values,
} = parseArgs({
const { positionals, values } = parseArgs({
allowPositionals: true,
options,
});
@@ -137,16 +134,16 @@ const {
if (values.help) {
console.log(`Usage: ${basename(__filename)} [OPTION]... [VERSION]...`);
console.log();
console.log('Updates certdata.txt to NSS VERSION (most recent release by default).');
console.log('');
console.log(' -f, --file=FILE writes a commit message reflecting the change to the');
console.log(' specified FILE');
console.log(' -v, --verbose writes progress to stdout');
console.log(' --help display this help and exit');
console.log("Updates certdata.txt to NSS VERSION (most recent release by default).");
console.log("");
console.log(" -f, --file=FILE writes a commit message reflecting the change to the");
console.log(" specified FILE");
console.log(" -v, --verbose writes progress to stdout");
console.log(" --help display this help and exit");
process.exit(0);
}
const scheduleURL = 'https://wiki.mozilla.org/NSS:Release_Versions';
const scheduleURL = "https://wiki.mozilla.org/NSS:Release_Versions";
if (values.verbose) {
console.log(`Fetching NSS release schedule from ${scheduleURL}`);
}
@@ -159,15 +156,15 @@ const scheduleText = await schedule.text();
const nssReleases = getReleases(scheduleText);
// Retrieve metadata for the NSS release being updated to.
const version = positionals[0] ?? await getLatestVersion(nssReleases);
const release = nssReleases.find((r) => {
return new RegExp(`^${version.replace('.', '\\.')}\\b`).test(r[kNSSVersion]);
const version = positionals[0] ?? (await getLatestVersion(nssReleases));
const release = nssReleases.find(r => {
return new RegExp(`^${version.replace(".", "\\.")}\\b`).test(r[kNSSVersion]);
});
if (!pastRelease(release)) {
console.warn(`Warning: NSS ${version} is not due to be released until ${formatDate(release[kNSSDate])}`);
}
if (values.verbose) {
console.log('Found NSS version:');
console.log("Found NSS version:");
console.log(release);
}
@@ -179,7 +176,7 @@ if (values.verbose) {
const checkoutDir = dirname(__filename);
const certdata = await fetch(certdataURL);
const certdataFile = join(checkoutDir, 'certdata.txt');
const certdataFile = join(checkoutDir, "certdata.txt");
if (!certdata.ok) {
console.error(`Failed to fetch ${certdataURL}: ${certdata.status}: ${certdata.statusText}`);
process.exit(-1);
@@ -191,46 +188,46 @@ await pipeline(certdata.body, createWriteStream(certdataFile));
// Run generate-root-certs.pl to generate src/crypto/root_certs.h.
if (values.verbose) {
console.log('Running generate-root-certs.pl');
console.log("Running generate-root-certs.pl");
}
const opts = { encoding: 'utf8' };
const mkCABundleTool = join(checkoutDir, 'generate-root-certs.pl');
const mkCABundleOut = execFileSync(mkCABundleTool,
values.verbose ? [ '-v' ] : [],
opts);
const opts = { encoding: "utf8" };
const mkCABundleTool = join(checkoutDir, "generate-root-certs.pl");
const mkCABundleOut = execFileSync(mkCABundleTool, values.verbose ? ["-v"] : [], opts);
if (values.verbose) {
console.log(mkCABundleOut);
}
// Determine certificates added and/or removed.
const certHeaderFile = relative(process.cwd(), join(checkoutDir, 'src', 'crypto', 'root_certs.h'));
const diff = execFileSync('git', [ 'diff-files', '-u', '--', certHeaderFile ], opts);
const certHeaderFile = relative(process.cwd(), join(checkoutDir, "src", "crypto", "root_certs.h"));
const diff = execFileSync("git", ["diff-files", "-u", "--", certHeaderFile], opts);
if (values.verbose) {
console.log(diff);
}
const certsAddedRE = /^\+\/\* (.*) \*\//gm;
const certsRemovedRE = /^-\/\* (.*) \*\//gm;
const added = [ ...diff.matchAll(certsAddedRE) ].map((m) => m[1]);
const removed = [ ...diff.matchAll(certsRemovedRE) ].map((m) => m[1]);
const added = [...diff.matchAll(certsAddedRE)].map(m => m[1]);
const removed = [...diff.matchAll(certsRemovedRE)].map(m => m[1]);
const commitMsg = [
`crypto: update root certificates to NSS ${release[kNSSVersion]}`,
'',
"",
`This is the certdata.txt[0] from NSS ${release[kNSSVersion]}, released on ${formatDate(release[kNSSDate])}.`,
'',
`This is the version of NSS that ${release[kFirefoxDate] < now ? 'shipped' : 'will ship'} in Firefox ${release[kFirefoxVersion]} on`,
"",
`This is the version of NSS that ${release[kFirefoxDate] < now ? "shipped" : "will ship"} in Firefox ${
release[kFirefoxVersion]
} on`,
`${formatDate(release[kFirefoxDate])}.`,
'',
"",
];
if (added.length > 0) {
commitMsg.push('Certificates added:');
commitMsg.push(...added.map((cert) => `- ${cert}`));
commitMsg.push('');
commitMsg.push("Certificates added:");
commitMsg.push(...added.map(cert => `- ${cert}`));
commitMsg.push("");
}
if (removed.length > 0) {
commitMsg.push('Certificates removed:');
commitMsg.push(...removed.map((cert) => `- ${cert}`));
commitMsg.push('');
commitMsg.push("Certificates removed:");
commitMsg.push(...removed.map(cert => `- ${cert}`));
commitMsg.push("");
}
commitMsg.push(`[0] ${certdataURL}`);
const delimiter = randomUUID();
@@ -239,8 +236,8 @@ const properties = [
`COMMIT_MSG<<${delimiter}`,
...commitMsg,
delimiter,
'',
].join('\n');
"",
].join("\n");
if (values.verbose) {
console.log(properties);
}

View File

@@ -269,6 +269,8 @@ LIBUS_SOCKET_DESCRIPTOR apple_no_sigpipe(LIBUS_SOCKET_DESCRIPTOR fd) {
LIBUS_SOCKET_DESCRIPTOR bsd_set_nonblocking(LIBUS_SOCKET_DESCRIPTOR fd) {
#ifdef _WIN32
/* Libuv will set windows sockets as non-blocking */
#elif defined(__APPLE__)
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK | O_CLOEXEC);
#else
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
#endif
@@ -750,6 +752,64 @@ static int bsd_do_connect(struct addrinfo *rp, int *fd)
}
LIBUS_SOCKET_DESCRIPTOR bsd_create_connect_socket(const char *host, int port, const char *source_host, int options) {
#ifdef _WIN32
// The caller (sometimes) uses NULL to indicate localhost. This works fine with getaddrinfo, but not with WSAConnectByName
if (!host) {
host = "localhost";
} else if (strcmp(host, "0.0.0.0") == 0 || strcmp(host, "::") == 0 || strcmp(host, "[::]") == 0) {
// windows disallows connecting to 0.0.0.0. To emulate POSIX behavior, we connect to localhost instead
// Also see https://docs.libuv.org/en/v1.x/tcp.html#c.uv_tcp_connect
host = "localhost";
}
// On windows we use WSAConnectByName to speed up connecting to localhost
// The other implementation also works on windows, but is slower
char port_string[16];
snprintf(port_string, 16, "%d", port);
SOCKET s = socket(AF_INET6, SOCK_STREAM, 0);
if (s == INVALID_SOCKET) {
return LIBUS_SOCKET_ERROR;
}
// https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaconnectbynamea#remarks
DWORD zero = 0;
if (SOCKET_ERROR == setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&zero, sizeof(DWORD))) {
closesocket(s);
return LIBUS_SOCKET_ERROR;
}
if (source_host) {
struct addrinfo *interface_result;
if (!getaddrinfo(source_host, NULL, NULL, &interface_result)) {
int ret = bind(s, interface_result->ai_addr, (socklen_t) interface_result->ai_addrlen);
freeaddrinfo(interface_result);
if (ret == SOCKET_ERROR) {
closesocket(s);
return LIBUS_SOCKET_ERROR;
}
}
}
SOCKADDR_STORAGE local;
SOCKADDR_STORAGE remote;
DWORD local_len = sizeof(local);
DWORD remote_len = sizeof(remote);
if (FALSE == WSAConnectByNameA(s, host, port_string, &local_len, (SOCKADDR*)&local, &remote_len, (SOCKADDR*)&remote, NULL, NULL)) {
closesocket(s);
return LIBUS_SOCKET_ERROR;
}
// See
// - https://stackoverflow.com/questions/60591081/getpeername-always-fails-with-error-code-wsaenotconn
// - https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaconnectbynamea#remarks
//
// When the WSAConnectByName function returns TRUE, the socket s is in the default state for a connected socket.
// The socket s does not enable previously set properties or options until SO_UPDATE_CONNECT_CONTEXT is set on the socket.
// Use the setsockopt function to set the SO_UPDATE_CONNECT_CONTEXT option.
//
if (SOCKET_ERROR == setsockopt( s, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0 )) {
closesocket(s);
return LIBUS_SOCKET_ERROR;
}
return s;
#else
struct addrinfo hints, *result;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
@@ -795,6 +855,7 @@ LIBUS_SOCKET_DESCRIPTOR bsd_create_connect_socket(const char *host, int port, co
freeaddrinfo(result);
return fd;
#endif
}
LIBUS_SOCKET_DESCRIPTOR bsd_create_connect_socket_unix(const char *server_path, int options) {

View File

@@ -31,7 +31,7 @@ void Bun__internal_dispatch_ready_poll(void* loop, void* poll);
#include <errno.h>
#endif
void us_loop_run_bun_tick(struct us_loop_t *loop, int64_t timeoutMs, void*);
void us_loop_run_bun_tick(struct us_loop_t *loop, int64_t timeoutMs);
/* Pointer tags are used to indicate a Bun pointer versus a uSockets pointer */
#define UNSET_BITS_49_UNTIL_64 0x0000FFFFFFFFFFFF
@@ -175,11 +175,7 @@ void us_loop_run(struct us_loop_t *loop) {
}
}
void bun_on_tick_before(void* ctx);
void bun_on_tick_after(void* ctx);
void us_loop_run_bun_tick(struct us_loop_t *loop, int64_t timeoutMs, void* tickCallbackContext) {
void us_loop_run_bun_tick(struct us_loop_t *loop, int64_t timeoutMs) {
if (loop->num_polls == 0)
return;
@@ -191,10 +187,6 @@ void us_loop_run_bun_tick(struct us_loop_t *loop, int64_t timeoutMs, void* tickC
us_loop_integrate(loop);
}
if (tickCallbackContext) {
bun_on_tick_before(tickCallbackContext);
}
/* Emit pre callback */
us_internal_loop_pre(loop);
@@ -221,10 +213,6 @@ void us_loop_run_bun_tick(struct us_loop_t *loop, int64_t timeoutMs, void* tickC
}
#endif
if (tickCallbackContext) {
bun_on_tick_after(tickCallbackContext);
}
/* Iterate ready polls, dispatching them by type */
for (loop->current_ready_poll = 0; loop->current_ready_poll < loop->num_ready_polls; loop->current_ready_poll++) {
struct us_poll_t *poll = GET_READY_POLL(loop, loop->current_ready_poll);

View File

@@ -198,7 +198,7 @@ void us_loop_free(struct us_loop_t *loop) {
void us_loop_run(struct us_loop_t *loop) {
us_loop_integrate(loop);
uv_run(loop->uv_loop, UV_RUN_NOWAIT);
uv_run(loop->uv_loop, UV_RUN_ONCE);
}
struct us_poll_t *us_create_poll(struct us_loop_t *loop, int fallthrough,
@@ -327,11 +327,11 @@ void us_internal_async_wakeup(struct us_internal_async *a) {
uv_async_send(uv_async);
}
int us_socket_get_error(int ssl, struct us_socket_t* s)
{
int us_socket_get_error(int ssl, struct us_socket_t *s) {
int error = 0;
socklen_t len = sizeof(error);
if (getsockopt(us_poll_fd((struct us_poll_t*)s), SOL_SOCKET, SO_ERROR, (char*)&error, &len) == -1) {
if (getsockopt(us_poll_fd((struct us_poll_t *)s), SOL_SOCKET, SO_ERROR,
(char *)&error, &len) == -1) {
return errno;
}
return error;

View File

@@ -46,6 +46,7 @@
#ifndef NOMINMAX
#define NOMINMAX
#endif
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <winsock2.h>
#define LIBUS_SOCKET_DESCRIPTOR SOCKET
#else
@@ -399,6 +400,9 @@ int us_raw_root_certs(struct us_cert_string_t**out);
unsigned int us_get_remote_address_info(char *buf, struct us_socket_t *s, const char **dest, int *port, int *is_ipv6);
int us_socket_get_error(int ssl, struct us_socket_t *s);
void us_socket_ref(struct us_socket_t *s);
void us_socket_unref(struct us_socket_t *s);
#ifdef __cplusplus
}
#endif

View File

@@ -387,3 +387,17 @@ unsigned int us_get_remote_address_info(char *buf, struct us_socket_t *s, const
return length;
}
void us_socket_ref(struct us_socket_t *s) {
#ifdef LIBUS_USE_LIBUV
uv_ref((uv_handle_t*)s->p.uv_p);
#endif
// do nothing if not using libuv
}
void us_socket_unref(struct us_socket_t *s) {
#ifdef LIBUS_USE_LIBUV
uv_unref((uv_handle_t*)s->p.uv_p);
#endif
// do nothing if not using libuv
}

View File

@@ -134,6 +134,8 @@ private:
/* Handle HTTP data streams */
us_socket_context_on_data(SSL, getSocketContext(), [](us_socket_t *s, char *data, int length) {
// ref the socket to make sure we process it entirely before it is closed
us_socket_ref(s);
// total overhead is about 210k down to 180k
// ~210k req/sec is the original perf with write in data
@@ -293,6 +295,10 @@ private:
/* We need to uncork in all cases, except for nullptr (closed socket, or upgraded socket) */
if (returnedSocket != nullptr) {
us_socket_t* returnedSocketPtr = (us_socket_t*) returnedSocket;
/* We don't want open sockets to keep the event loop alive between HTTP requests */
us_socket_unref(returnedSocketPtr);
/* Timeout on uncork failure */
auto [written, failed] = ((AsyncSocket<SSL> *) returnedSocket)->uncork();
if (failed) {
@@ -312,8 +318,7 @@ private:
}
}
}
return (us_socket_t *) returnedSocket;
return returnedSocketPtr;
}
/* If we upgraded, check here (differ between nullptr close and nullptr upgrade) */

View File

@@ -227,16 +227,15 @@ namespace uWS
return unsignedIntegerValue;
}
/* RFC 9110 16.3.1 Field Name Registry (TLDR; alnum + hyphen is allowed)
* [...] It MUST conform to the field-name syntax defined in Section 5.1,
* and it SHOULD be restricted to just letters, digits,
* and hyphen ('-') characters, with the first character being a letter. */
static inline bool isFieldNameByte(unsigned char x)
/* RFC 9110 5.6.2. Tokens */
static inline bool isFieldNameByte(unsigned char c)
{
return (x == '-') |
((x > '/') & (x < ':')) |
((x > '@') & (x < '[')) |
((x > 96) & (x < '{'));
return (c > 32) & (c < 127) & (c != '(') &
(c != ')') & (c != ',') & (c != '/') &
(c != ':') & (c != ';') & (c != '<') &
(c != '=') & (c != '>') & (c != '?') &
(c != '@') & (c != '[') & (c != '\\') &
(c != ']') & (c != '{') & (c != '}');
}
static inline uint64_t hasLess(uint64_t x, uint64_t n)
@@ -263,23 +262,19 @@ namespace uWS
hasMore(x, 'z');
}
static inline void *consumeFieldName(char *p)
{
for (; true; p += 8)
{
uint64_t word;
memcpy(&word, p, sizeof(uint64_t));
if (notFieldNameWord(word))
{
while (isFieldNameByte(*(unsigned char *)p))
{
*(p++) |= 0x20;
}
return (void *)p;
static inline void *consumeFieldName(char *p) {
//for (; true; p += 8) {
//uint64_t word;
//memcpy(&word, p, sizeof(uint64_t));
//if (notFieldNameWord(word)) {
while (isFieldNameByte(*(unsigned char *)p)) {
*(p++) |= 0x20;
}
word |= 0x2020202020202020ull;
memcpy(p, &word, sizeof(uint64_t));
}
return (void *)p;
//}
//word |= 0x2020202020202020ull;
//memcpy(p, &word, sizeof(uint64_t));
//}
}
/* Puts method as key, target as value and returns non-null (or nullptr on error). */

View File

@@ -1,86 +1,91 @@
/* This smoke test runs against the Crc32 example program for now, but this example will be extended for more tests */
var crc32 = (function () {
var table = new Uint32Array(256);
for (var i = 256; i--;) {
var tmp = i;
for (var k = 8; k--;) {
tmp = tmp & 1 ? 3988292384 ^ tmp >>> 1 : tmp >>> 1;
}
table[i] = tmp;
var table = new Uint32Array(256);
for (var i = 256; i--; ) {
var tmp = i;
for (var k = 8; k--; ) {
tmp = tmp & 1 ? 3988292384 ^ (tmp >>> 1) : tmp >>> 1;
}
return function (data) {
var crc = -1; // Begin with all bits set ( 0xffffffff )
for (var i = 0, l = data.length; i < l; i++) {
crc = crc >>> 8 ^ table[crc & 255 ^ data[i]];
}
return (crc ^ -1) >>> 0; // Apply binary NOT
};
table[i] = tmp;
}
return function (data) {
var crc = -1; // Begin with all bits set ( 0xffffffff )
for (var i = 0, l = data.length; i < l; i++) {
crc = (crc >>> 8) ^ table[(crc & 255) ^ data[i]];
}
return (crc ^ -1) >>> 0; // Apply binary NOT
};
})();
async function chunkedCrc32Test(array) {
console.log("Making chunked request with body size: " + array.length);
console.log("Making chunked request with body size: " + array.length);
const stream = new ReadableStream(
/*{type: "bytes"}, */ {
async start(controller) {
await 1;
controller.enqueue(array);
controller.close();
},
},
);
const stream = new ReadableStream(/*{type: "bytes"}, */{
async start(controller) {
await 1;
controller.enqueue(array);
controller.close();
},
});
const r = await fetch("http://localhost:3000", {
method: "POST",
headers: { "Content-Type": "application/octet-stream" },
body: stream,
duplex: "half",
});
const r = await fetch("http://localhost:3000", {
method: 'POST',
headers: { 'Content-Type': 'application/octet-stream' },
body: stream,
duplex: 'half',
});
/* Download the response body (it's a crc32 hash plus newline) */
const body = await r.body.getReader().read();
/* Download the response body (it's a crc32 hash plus newline) */
const body = await r.body.getReader().read();
/* Make a crc32 comparison of the two (mind the newline in one!) */
const got = new TextDecoder().decode(body.value);
/* Make a crc32 comparison of the two (mind the newline in one!) */
const got = new TextDecoder().decode(body.value);
const want = crc32(array).toString(16);
if (got.toString().slice(0, -1) !== want.toString()) {
throw new Error("failed chunked test");
}
const want = crc32(array).toString(16);
if (got.toString().slice(0, -1) !== want.toString()) {
throw new Error("failed chunked test");
}
}
async function fixedCrc32Test(array) {
console.log("Making request with body size: " + array.length);
console.log("Making request with body size: " + array.length);
/* Send it with content-length */
const res = await fetch("http://localhost:3000", { keepalive: true, headers: { 'Content-Type': 'text/plain' }, method: "POST", body: array });
/* Send it with content-length */
const res = await fetch("http://localhost:3000", {
keepalive: true,
headers: { "Content-Type": "text/plain" },
method: "POST",
body: array,
});
/* Download the response body (it's a crc32 hash plus newline) */
const body = await res.body.getReader().read();
/* Download the response body (it's a crc32 hash plus newline) */
const body = await res.body.getReader().read();
/* Make a crc32 comparison of the two (mind the newline in one!) */
const got = new TextDecoder().decode(body.value);
const want = crc32(array).toString(16);
if (got.toString().slice(0, -1) !== want.toString()) {
throw new Error("failed test");
}
/* Make a crc32 comparison of the two (mind the newline in one!) */
const got = new TextDecoder().decode(body.value);
const want = crc32(array).toString(16);
if (got.toString().slice(0, -1) !== want.toString()) {
throw new Error("failed test");
}
}
/* Maximum chunk size is less than 256mb */
const sizes = [0, 0, 32, 32, 128, 256, 1024, 65536, 1024 * 1024, 1024 * 1024 * 128, 0, 0, 32, 32];
for (let i = 0; i < sizes.length; i++) {
/* Create buffer with random data */
const array = new Uint8Array(sizes[i]);
//if (sizes[i] <= 65536) {
//self.crypto.getRandomValues(array);
//} else {
array.fill(Math.random() * 255);
//}
/* Create buffer with random data */
const array = new Uint8Array(sizes[i]);
//if (sizes[i] <= 65536) {
//self.crypto.getRandomValues(array);
//} else {
array.fill(Math.random() * 255);
//}
/* Do this for all methods */
await fixedCrc32Test(array);
await chunkedCrc32Test(array);
/* Do this for all methods */
await fixedCrc32Test(array);
await chunkedCrc32Test(array);
}
console.log("Done!");
console.log("Done!");

View File

@@ -796,9 +796,6 @@
"eslintConfig": {
"$ref": "https://json.schemastore.org/eslintrc.json"
},
"prettier": {
"$ref": "https://json.schemastore.org/prettierrc.json"
},
"stylelint": {
"$ref": "https://json.schemastore.org/stylelintrc.json"
},

View File

@@ -19,9 +19,9 @@ export enum Loader {
ts = BunLoader.ts,
}
export interface TestReference {
name: string,
byteOffset: number,
kind: 'test' | 'describe',
name: string;
byteOffset: number;
kind: "test" | "describe";
}
export type { ScanResult, TransformResponse };
@@ -221,7 +221,7 @@ export class Bun {
} else {
const fs = await import("fs");
if (typeof url === 'string' && url.startsWith('file://')) {
if (typeof url === "string" && url.startsWith("file://")) {
url = new URL(url); // fs.readFileSync cannot consume URL strings, only URL objects
}
@@ -300,7 +300,7 @@ export class Bun {
),
),
byteOffset: response.tests[i].byteOffset,
kind: testKindMap[response.tests[i].kind] as 'test' | 'describe',
kind: testKindMap[response.tests[i].kind] as "test" | "describe",
};
}
@@ -309,7 +309,11 @@ export class Bun {
return tests;
}
static transformSync(content: Uint8Array | string, file_name: string, loader?: keyof typeof Loader): TransformResponse {
static transformSync(
content: Uint8Array | string,
file_name: string,
loader?: keyof typeof Loader,
): TransformResponse {
const bb = new ByteBuffer(Bun.scratch);
bb.length = 0;
bb.index = 0;

View File

@@ -1,2 +1,2 @@
.\scripts\env.sh
.\scripts\env.ps1
ninja -Cbuild

View File

@@ -1,17 +0,0 @@
$Script1=(Join-Path $PSScriptRoot "./cross-compile-codegen.sh")
$CrossCompileCodegen=(Get-Content $Script1 -Raw)
$CrossCompileCodegen.Replace("`r`n","`n") | Set-Content $Script1 -Force -NoNewline
$Script2=(Join-Path $PSScriptRoot "../src/codegen/create_hash_table")
$CreateHashTable=(Get-Content $Script2 -Raw)
$CreateHashTable.Replace("`r`n","`n") | Set-Content $Script2 -Force -NoNewline
& 'C:\Program Files\WSL\wsl.exe' ./scripts/cross-compile-codegen.sh win32 x64 "build"
Set-Content $Script1 -Force -NoNewline -Value $CrossCompileCodegen
Set-Content $Script2 -Force -NoNewline -Value $CreateHashTable
# copy into build-release as well
Remove-Item -Path "build-release/codegen" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "build-release/js" -Recurse -Force -ErrorAction SilentlyContinue
Copy-Item -Path "build/codegen" -Destination "build-release/codegen" -Recurse -Force
Copy-Item -Path "build/js" -Destination "build-release/js" -Recurse -Force

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