mirror of
https://github.com/oven-sh/bun
synced 2026-02-16 22:01:47 +00:00
Compare commits
567 Commits
bun-v0.0.1
...
bun-v0.0.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
18f0093b18 | ||
|
|
adfaa21d03 | ||
|
|
01d1f1d258 | ||
|
|
4e775d275c | ||
|
|
035f6fe5e1 | ||
|
|
bba74499e5 | ||
|
|
b61cbb1df8 | ||
|
|
1a60d7df98 | ||
|
|
89a7e3bf2f | ||
|
|
fe1a6cee10 | ||
|
|
6a66d9f7fb | ||
|
|
fadbcca99c | ||
|
|
0b48e7272d | ||
|
|
23bdc6f792 | ||
|
|
de7274fcff | ||
|
|
b126392a8e | ||
|
|
d2a9e31fd3 | ||
|
|
6d61bcc4e1 | ||
|
|
d8e3ca4a88 | ||
|
|
351184991a | ||
|
|
14b51ef57c | ||
|
|
7a836382b3 | ||
|
|
360dec4fb9 | ||
|
|
83cf1be2b9 | ||
|
|
241525947c | ||
|
|
76a99eaa18 | ||
|
|
4bceb57ad1 | ||
|
|
c7705a6325 | ||
|
|
4f78e2c47c | ||
|
|
6789aed119 | ||
|
|
291f26cba0 | ||
|
|
a3458ce6e3 | ||
|
|
a7eb5397a4 | ||
|
|
fc03ed2969 | ||
|
|
12f1991771 | ||
|
|
57946e114c | ||
|
|
8b3463e73f | ||
|
|
3cb7dbe921 | ||
|
|
d11102d858 | ||
|
|
183911514a | ||
|
|
bc3c17ffc8 | ||
|
|
3379289024 | ||
|
|
562a8df46b | ||
|
|
68e2869d64 | ||
|
|
c6818cc55c | ||
|
|
08b3bab2ec | ||
|
|
34771aad22 | ||
|
|
109d53d461 | ||
|
|
958520f557 | ||
|
|
12c311da3f | ||
|
|
d7d9df726b | ||
|
|
a368182769 | ||
|
|
2a9fd30d36 | ||
|
|
082a944e0b | ||
|
|
e1b68665db | ||
|
|
c64ef1e2f4 | ||
|
|
3063c2e64d | ||
|
|
38f46169d9 | ||
|
|
c1aa0323dc | ||
|
|
673b755987 | ||
|
|
3d6fab6e49 | ||
|
|
d0823beef5 | ||
|
|
b0e98892e5 | ||
|
|
0006d28cbb | ||
|
|
42dcc4e217 | ||
|
|
13582981e4 | ||
|
|
d4c1bf6c67 | ||
|
|
3ef55d10ae | ||
|
|
5ce171d92c | ||
|
|
e409148941 | ||
|
|
d44abd8e4d | ||
|
|
5c38b6c355 | ||
|
|
04ecfdd794 | ||
|
|
fc59a32b63 | ||
|
|
fd57e2d9a6 | ||
|
|
303a5ea898 | ||
|
|
d502d0bcd6 | ||
|
|
2018f5020a | ||
|
|
92a7849e98 | ||
|
|
59bdb62966 | ||
|
|
eab1938012 | ||
|
|
d97bd79c86 | ||
|
|
35c05f61e5 | ||
|
|
a5181c8ed1 | ||
|
|
aa545ac0dc | ||
|
|
ac9bd094f3 | ||
|
|
becf55febc | ||
|
|
c41cc80700 | ||
|
|
20b1a27d05 | ||
|
|
a027e9b6bc | ||
|
|
3fe676e9c9 | ||
|
|
bffe8e918b | ||
|
|
92e5fe9fd5 | ||
|
|
b107ac1659 | ||
|
|
5537c03569 | ||
|
|
4ab7c82405 | ||
|
|
6e8cd2e3e5 | ||
|
|
c0c7527497 | ||
|
|
e71cb5c8c9 | ||
|
|
cdbb4cf68a | ||
|
|
204d468ad2 | ||
|
|
1844212f34 | ||
|
|
fbb0342511 | ||
|
|
92b174b315 | ||
|
|
0ba9784be2 | ||
|
|
2c50cf7284 | ||
|
|
bea0dca55d | ||
|
|
1676af9de9 | ||
|
|
3d48bdaad1 | ||
|
|
1b474d4f97 | ||
|
|
4467167f99 | ||
|
|
36ec8bb99b | ||
|
|
bc5f99dc43 | ||
|
|
4d4966592e | ||
|
|
f1fff3af7e | ||
|
|
83e553d6a9 | ||
|
|
173724b402 | ||
|
|
64d3927879 | ||
|
|
49ad70b11c | ||
|
|
0d0b769bcc | ||
|
|
fb2aa186b7 | ||
|
|
ef94826f95 | ||
|
|
d79f34e960 | ||
|
|
4ce6e4a9cb | ||
|
|
9cf2771549 | ||
|
|
daf583e4cb | ||
|
|
51e55f4b6e | ||
|
|
f30527b6d9 | ||
|
|
17b186933d | ||
|
|
fd57edceff | ||
|
|
1876c0e11a | ||
|
|
cd5c740368 | ||
|
|
e2eef2bb25 | ||
|
|
ad3c19a160 | ||
|
|
07bb25f7b1 | ||
|
|
edd0223377 | ||
|
|
34a8a623f4 | ||
|
|
f854539ea9 | ||
|
|
cd1b8ccde7 | ||
|
|
cf3f8d2bb0 | ||
|
|
f1a0e718b3 | ||
|
|
08e0a51036 | ||
|
|
8e0f21cc91 | ||
|
|
ae7843f244 | ||
|
|
b5b47e6525 | ||
|
|
e7a4f9f507 | ||
|
|
658926189f | ||
|
|
154c8372e3 | ||
|
|
a68b5eef86 | ||
|
|
65ea1e4647 | ||
|
|
f8f85430c0 | ||
|
|
d8a2eb81e3 | ||
|
|
9a9c0df6b0 | ||
|
|
0a86beccc7 | ||
|
|
2fe9791127 | ||
|
|
b856d50c3f | ||
|
|
dde2b80e1d | ||
|
|
49b954462d | ||
|
|
c51dac1282 | ||
|
|
0d002c7057 | ||
|
|
1d03e90b5c | ||
|
|
25ac773cf3 | ||
|
|
ecb069ac85 | ||
|
|
a6cf6c4069 | ||
|
|
6854d83842 | ||
|
|
4aab78f619 | ||
|
|
95d2860930 | ||
|
|
70db76a798 | ||
|
|
07bf3eb1e9 | ||
|
|
237e672e70 | ||
|
|
61d436c29d | ||
|
|
22ea3e76f9 | ||
|
|
0089d04459 | ||
|
|
26ee46ad5b | ||
|
|
417c4e0faa | ||
|
|
b6675dd0ab | ||
|
|
dff40c5220 | ||
|
|
1fd426432e | ||
|
|
97c43ef787 | ||
|
|
a546e56669 | ||
|
|
4b52192974 | ||
|
|
fb10e0c4cb | ||
|
|
a44cb9708f | ||
|
|
c7fc08056a | ||
|
|
12ba37e43a | ||
|
|
928346b842 | ||
|
|
b81c895e1d | ||
|
|
d434e5aeac | ||
|
|
2250db41b4 | ||
|
|
826db9021e | ||
|
|
ad61279621 | ||
|
|
5ce1b36130 | ||
|
|
a1f17f70eb | ||
|
|
a0f086ba85 | ||
|
|
8d095a235f | ||
|
|
ff1417421b | ||
|
|
00fb04f309 | ||
|
|
a3cc17fbe6 | ||
|
|
fd27d403d7 | ||
|
|
6d29e314a0 | ||
|
|
902e438e6c | ||
|
|
096d668d83 | ||
|
|
49c5c32714 | ||
|
|
9a70d8daa2 | ||
|
|
79eb8d9d78 | ||
|
|
221b280856 | ||
|
|
933378ab80 | ||
|
|
bd51d194cf | ||
|
|
1e27c7d8ce | ||
|
|
7d554ed175 | ||
|
|
e72d765961 | ||
|
|
9ce38b86ab | ||
|
|
05bdda7b07 | ||
|
|
d68f18c77a | ||
|
|
ae6349e573 | ||
|
|
0541cff2ad | ||
|
|
e69f8c36d2 | ||
|
|
e7f191c08b | ||
|
|
6a2372b0b2 | ||
|
|
0592515639 | ||
|
|
a6c4bba6c2 | ||
|
|
5691bf385b | ||
|
|
a149f0abb9 | ||
|
|
eae7051111 | ||
|
|
adb6be05d1 | ||
|
|
4e889c7b47 | ||
|
|
2ed6605cc3 | ||
|
|
42c264bf7b | ||
|
|
fe6564b533 | ||
|
|
f6923f21b1 | ||
|
|
edfc61889c | ||
|
|
08c8ca18a7 | ||
|
|
9e4f16ac8b | ||
|
|
03ece0568d | ||
|
|
2dcb465d50 | ||
|
|
c93655c717 | ||
|
|
6f6510169e | ||
|
|
cfe159f636 | ||
|
|
213f361551 | ||
|
|
3582941791 | ||
|
|
a3cd9347e6 | ||
|
|
449c8b5f36 | ||
|
|
1f7af3754d | ||
|
|
72df6b9be2 | ||
|
|
044c0cfdc3 | ||
|
|
3c43f65234 | ||
|
|
bd2d284c53 | ||
|
|
ffea9c010b | ||
|
|
44351b57f7 | ||
|
|
4bbb938de8 | ||
|
|
437270e0af | ||
|
|
09b7f4c95d | ||
|
|
38f83c50c4 | ||
|
|
2f06dc5755 | ||
|
|
d6b66e2155 | ||
|
|
309298fa42 | ||
|
|
a0a2fa964b | ||
|
|
0c769d0f61 | ||
|
|
1b90619890 | ||
|
|
0ea34216de | ||
|
|
53374ac54a | ||
|
|
6355ac219e | ||
|
|
384ad96637 | ||
|
|
0361b0df70 | ||
|
|
a1b8c20c3f | ||
|
|
de01d581c1 | ||
|
|
f1bda194e0 | ||
|
|
a84b62452c | ||
|
|
e039ba5130 | ||
|
|
e67dd8947b | ||
|
|
2d6a4a4956 | ||
|
|
f394581ed8 | ||
|
|
33b0c89e7c | ||
|
|
4e3aa3c289 | ||
|
|
58b196c583 | ||
|
|
3dc53c3d13 | ||
|
|
4f2c1cfe85 | ||
|
|
6e16b3cf84 | ||
|
|
9f0ab479b0 | ||
|
|
884b5e13ee | ||
|
|
7d4aab4cf1 | ||
|
|
6bb0c03d8d | ||
|
|
797c94b0e9 | ||
|
|
e63fbcefe9 | ||
|
|
dcc29d3db6 | ||
|
|
be66c01829 | ||
|
|
21b9884606 | ||
|
|
fd6d93292c | ||
|
|
9000165718 | ||
|
|
54b313cc5a | ||
|
|
2461c11536 | ||
|
|
f17345ffe4 | ||
|
|
4908a63f61 | ||
|
|
da7de899e1 | ||
|
|
44108d6a26 | ||
|
|
c7fb978b7b | ||
|
|
0db94d94d6 | ||
|
|
92e489760d | ||
|
|
decee7616f | ||
|
|
deafd3d0d4 | ||
|
|
b9bbd819be | ||
|
|
b956ea5a5e | ||
|
|
cf2e81b036 | ||
|
|
bf2732599c | ||
|
|
10696680ff | ||
|
|
7e159cb5cd | ||
|
|
74cda61c88 | ||
|
|
9dfe57a3f7 | ||
|
|
f10dcd780c | ||
|
|
bee7efb5d9 | ||
|
|
0039b53d21 | ||
|
|
9f86acbe58 | ||
|
|
bbc1bcbed1 | ||
|
|
3ed824fe0f | ||
|
|
fe24b96d61 | ||
|
|
4b6d8a152f | ||
|
|
e21b9afdf2 | ||
|
|
901d7d8759 | ||
|
|
4b618f9ad1 | ||
|
|
0f7bc76f39 | ||
|
|
6d997ab201 | ||
|
|
8f7f4ae72f | ||
|
|
c85b5f6a87 | ||
|
|
ba5f9887fb | ||
|
|
9e3e9a2d6d | ||
|
|
88a5e2d34d | ||
|
|
afc346d6f1 | ||
|
|
4dd398ca7a | ||
|
|
756bfc9077 | ||
|
|
f646250a91 | ||
|
|
24c567086f | ||
|
|
05b1696df7 | ||
|
|
0baa3b511e | ||
|
|
d793088575 | ||
|
|
9aa7f9ed18 | ||
|
|
e7f6cf12a5 | ||
|
|
e2ba468924 | ||
|
|
85760c0a4c | ||
|
|
0db7af6166 | ||
|
|
5e3d1dd4b5 | ||
|
|
6eb9a36a22 | ||
|
|
e88e9401f1 | ||
|
|
829b4287dd | ||
|
|
2bf7b5a7ab | ||
|
|
1c83f3091c | ||
|
|
dfd08e7c55 | ||
|
|
3b28af17db | ||
|
|
5a03dfb9a4 | ||
|
|
fa1aa301e8 | ||
|
|
ae7b91efe2 | ||
|
|
6d9ccd9b8e | ||
|
|
0d79435ce2 | ||
|
|
4ee2fdf1c6 | ||
|
|
cd273daa1b | ||
|
|
c2e9d49f69 | ||
|
|
38a9c92eec | ||
|
|
1d0f442718 | ||
|
|
1e8babe185 | ||
|
|
69d3b5ca60 | ||
|
|
a493c18193 | ||
|
|
5370ea71c0 | ||
|
|
0afec7739b | ||
|
|
a7173d54ce | ||
|
|
3b10cfae80 | ||
|
|
bd14ad9e6e | ||
|
|
9507cd8ed6 | ||
|
|
dfe74cb5c4 | ||
|
|
00e7b7c3d5 | ||
|
|
d2be50bf4d | ||
|
|
f0f3d6d4eb | ||
|
|
21d918921a | ||
|
|
55095edee6 | ||
|
|
6a7deab74d | ||
|
|
7db27f11d0 | ||
|
|
3ebb4feb98 | ||
|
|
e8dab9bfcf | ||
|
|
dc3eee44a9 | ||
|
|
9e8463af33 | ||
|
|
dd2bdd09db | ||
|
|
0eb3c1d393 | ||
|
|
cb6a1b7225 | ||
|
|
38c73788e1 | ||
|
|
2c89122ce9 | ||
|
|
2eae013ebf | ||
|
|
1247a9c93d | ||
|
|
5c6dd19826 | ||
|
|
9d0ee5c5cd | ||
|
|
3affc2a2d8 | ||
|
|
02bdaa6d10 | ||
|
|
aee263d050 | ||
|
|
7ac4abf8a0 | ||
|
|
139622e0b8 | ||
|
|
aaa4aaf53f | ||
|
|
73c27a9a25 | ||
|
|
82bf89a946 | ||
|
|
f4a4e793aa | ||
|
|
cdabcfd9d0 | ||
|
|
ac7a96b088 | ||
|
|
6932f3d543 | ||
|
|
222027991f | ||
|
|
5bb5091fe0 | ||
|
|
c8127d0ae6 | ||
|
|
8764fa6d4e | ||
|
|
86b7b5b8d8 | ||
|
|
127426f506 | ||
|
|
09cc970b9e | ||
|
|
03f7c5be1f | ||
|
|
4ecf513662 | ||
|
|
76b450386f | ||
|
|
38a54898a3 | ||
|
|
147d1f3951 | ||
|
|
d47419f471 | ||
|
|
367f9c9674 | ||
|
|
f9a906873e | ||
|
|
4be8aaeab8 | ||
|
|
5fdaad9a2f | ||
|
|
5855fb7cc6 | ||
|
|
f226f52200 | ||
|
|
db24a27e61 | ||
|
|
f8297aee4d | ||
|
|
b267aace71 | ||
|
|
b4bd8e4169 | ||
|
|
fdda1078f8 | ||
|
|
88e7e12a50 | ||
|
|
4cdc8939ab | ||
|
|
ec256209a8 | ||
|
|
74db7809eb | ||
|
|
5dac4e6108 | ||
|
|
e51155d8e6 | ||
|
|
2bb7f71b9c | ||
|
|
2f8be4f13f | ||
|
|
8e9d85f10f | ||
|
|
70bae801dc | ||
|
|
37ffe4501c | ||
|
|
13f6297312 | ||
|
|
f9dfa226a5 | ||
|
|
0da19a25cf | ||
|
|
3b92a867e2 | ||
|
|
1ada4a2c67 | ||
|
|
97ad21dc68 | ||
|
|
54dc9cfc8b | ||
|
|
1ed51e8866 | ||
|
|
9e0511995a | ||
|
|
62d51f7d2e | ||
|
|
4f9558dd71 | ||
|
|
86109dcfd0 | ||
|
|
adf22db8b6 | ||
|
|
eb3473125c | ||
|
|
b3894994c0 | ||
|
|
e1306be4be | ||
|
|
002d46d0c4 | ||
|
|
018ba2c83b | ||
|
|
66ed7c1f30 | ||
|
|
a113603f10 | ||
|
|
6f6d62d915 | ||
|
|
ff8393ce32 | ||
|
|
8b209aecf9 | ||
|
|
a515a2d039 | ||
|
|
d0fec462c9 | ||
|
|
20e2040e7e | ||
|
|
538f73b2fa | ||
|
|
a0fb04d6e5 | ||
|
|
44497ef384 | ||
|
|
5fb38b92d9 | ||
|
|
4737588aac | ||
|
|
a5d3ce4e96 | ||
|
|
66b29654c0 | ||
|
|
940570af59 | ||
|
|
bdfb5a91b1 | ||
|
|
29b986684d | ||
|
|
e48a0877ef | ||
|
|
22837d69b7 | ||
|
|
af306b523b | ||
|
|
ba20fd7566 | ||
|
|
6d1330d601 | ||
|
|
f3be0c79c2 | ||
|
|
10c01af692 | ||
|
|
a68a1983cf | ||
|
|
90a647fb72 | ||
|
|
3cbf209d5b | ||
|
|
bee45c4fdc | ||
|
|
61202cb464 | ||
|
|
0091944161 | ||
|
|
78cd857bf6 | ||
|
|
4fe1b4df1c | ||
|
|
2a1235c9db | ||
|
|
4bb41b95a8 | ||
|
|
f78f4854a4 | ||
|
|
ff01dfa03d | ||
|
|
638b204d1e | ||
|
|
58e88c4aed | ||
|
|
8433919342 | ||
|
|
8150b9aeba | ||
|
|
01601fc8a7 | ||
|
|
7b24042d5f | ||
|
|
2177dda242 | ||
|
|
0585c86390 | ||
|
|
528caab47c | ||
|
|
b150df34e0 | ||
|
|
da80c3b309 | ||
|
|
e8804bd80f | ||
|
|
2300886008 | ||
|
|
57ed3c89a2 | ||
|
|
1a284a1c94 | ||
|
|
f12dd51c00 | ||
|
|
e00c1e99d6 | ||
|
|
39323b46ba | ||
|
|
9dff80aeee | ||
|
|
9f7d05bab4 | ||
|
|
53c0a4b568 | ||
|
|
8f460a9be3 | ||
|
|
204b07f46b | ||
|
|
a48a02bade | ||
|
|
2326a1e105 | ||
|
|
c4dc6d9bff | ||
|
|
6213a73e6f | ||
|
|
9c109b744f | ||
|
|
42c1d54b3f | ||
|
|
5e634cd612 | ||
|
|
79c7fe0f7a | ||
|
|
8e86d2cf1d | ||
|
|
4e12a4c013 | ||
|
|
e869cdca9f | ||
|
|
ab565f1a3c | ||
|
|
90cd3bf4cb | ||
|
|
9752ee8819 | ||
|
|
9f1e0660dd | ||
|
|
7c05bb7d1d | ||
|
|
bb0faacf06 | ||
|
|
9ae35ec581 | ||
|
|
b1ca1eb228 | ||
|
|
832502555c | ||
|
|
1176a07c93 | ||
|
|
3770102843 | ||
|
|
cf7c80d42d | ||
|
|
84632571c7 | ||
|
|
af1061e47a | ||
|
|
e1ce0e8467 | ||
|
|
468c475359 | ||
|
|
8902a19bb4 | ||
|
|
f4e72be58f | ||
|
|
c20b5414c4 | ||
|
|
1a0438b3b1 | ||
|
|
da2f85ba4b | ||
|
|
bc65e40313 | ||
|
|
a188c7d791 | ||
|
|
f2cccdd1fb | ||
|
|
6621de709e | ||
|
|
98e9b93b7e | ||
|
|
3aef65597b | ||
|
|
c98e007ff7 | ||
|
|
3350e63004 | ||
|
|
d71b37e292 | ||
|
|
1c7485e58c | ||
|
|
872428de89 | ||
|
|
93441babd8 | ||
|
|
1328285bbc | ||
|
|
9912a4ce98 | ||
|
|
d5186ee663 | ||
|
|
9e2910365a | ||
|
|
3be2571a31 | ||
|
|
6352e95d0f | ||
|
|
b6a72f7d72 | ||
|
|
b923134023 | ||
|
|
6e82fa0dab | ||
|
|
9511bf94d5 | ||
|
|
03983ac24e |
14
.dockerignore
Normal file
14
.dockerignore
Normal file
@@ -0,0 +1,14 @@
|
||||
node_modules
|
||||
**/node_modules
|
||||
src/javascript/jsc/WebKit/LayoutTests
|
||||
zig-out
|
||||
zig-build
|
||||
**/*.o
|
||||
**/*.a
|
||||
|
||||
examples
|
||||
|
||||
**/.next
|
||||
.git
|
||||
src/javascript/jsc/WebKit/WebKitBuild
|
||||
**/CMakeCache.txt
|
||||
16
.gitignore
vendored
16
.gitignore
vendored
@@ -30,7 +30,6 @@ cover
|
||||
coverage
|
||||
coverv
|
||||
*.trace
|
||||
bench
|
||||
github
|
||||
out.*
|
||||
out
|
||||
@@ -65,6 +64,17 @@ release/
|
||||
sign.*.json
|
||||
packages/debug-*
|
||||
packages/bun-cli/postinstall.js
|
||||
packages/bun-*/bin/*
|
||||
packages/bun-*/bun
|
||||
packages/bun-*/bun-profile
|
||||
packages/bun-*/debug-bun
|
||||
packages/bun-*/*.o
|
||||
packages/bun-cli/postinstall.js
|
||||
|
||||
packages/bun-cli/bin/*
|
||||
packages/bun-cli/bin/*
|
||||
bun-test-scratch
|
||||
misctools/fetch
|
||||
|
||||
src/deps/libiconv
|
||||
src/deps/openssl
|
||||
src/tests.zig
|
||||
*.blob
|
||||
18
.gitmodules
vendored
18
.gitmodules
vendored
@@ -3,13 +3,25 @@
|
||||
# url = https://github.com/Hejsil/zig-clap
|
||||
[submodule "src/deps/picohttpparser"]
|
||||
path = src/deps/picohttpparser
|
||||
url = https://github.com/h2o/picohttpparser/
|
||||
url = https://github.com/h2o/picohttpparser.git
|
||||
ignore = dirty
|
||||
[submodule "src/javascript/jsc/WebKit"]
|
||||
path = src/javascript/jsc/WebKit
|
||||
url = git@github.com:/Jarred-Sumner/WebKit
|
||||
url = https://github.com/Jarred-Sumner/WebKit.git
|
||||
ignore = dirty
|
||||
[submodule "src/deps/mimalloc"]
|
||||
path = src/deps/mimalloc
|
||||
url = https://github.com/microsoft/mimalloc
|
||||
url = https://github.com/microsoft/mimalloc.git
|
||||
ignore = dirty
|
||||
[submodule "src/deps/zlib"]
|
||||
path = src/deps/zlib
|
||||
url = https://github.com/cloudflare/zlib.git
|
||||
ignore = dirty
|
||||
[submodule "src/deps/libarchive"]
|
||||
path = src/deps/libarchive
|
||||
url = https://github.com/libarchive/libarchive.git
|
||||
ignore = dirty
|
||||
[submodule "src/deps/s2n-tls"]
|
||||
path = src/deps/s2n-tls
|
||||
url = https://github.com/Jarred-Sumner/s2n-tls
|
||||
ignore = dirty
|
||||
|
||||
174
.vscode/launch.json
vendored
174
.vscode/launch.json
vendored
@@ -4,14 +4,46 @@
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Transpile small",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"args": [
|
||||
// "/Users/jarred/Desktop/webpack4.js"
|
||||
// "/Users/jarred/Code/bun/examples/css-stress-test/nexty/node_modules/next/dist/build/utils.js"
|
||||
"./dotenv-load-check.ts"
|
||||
],
|
||||
"cwd": "${workspaceFolder}/examples/css-stress-test",
|
||||
"name": "fetch debug",
|
||||
"program": "${workspaceFolder}/misctools/fetch",
|
||||
"args": ["https://api.github.com/repos/hanford/trends/tarball"],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "bun create debug",
|
||||
"program": "bun-debug",
|
||||
"args": ["create", "hanford/trends", "foo"],
|
||||
"cwd": "/tmp/",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "bun run debug",
|
||||
"program": "bun-debug",
|
||||
"args": ["paoskdpoasdk"],
|
||||
"cwd": "/tmp/",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "bun a debug",
|
||||
"program": "bun-debug",
|
||||
"args": ["create", "https://github.com/ahfarmer/calculator", "--force"],
|
||||
"cwd": "/tmp/",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "bun routes",
|
||||
"program": "bun-debug",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}/integration/apps/routing",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
@@ -32,7 +64,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": ".bun",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": [
|
||||
"./examples/hello-next/node_modules.server.bun"
|
||||
// "--origin=https://localhost:9000/"
|
||||
@@ -44,7 +76,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Discord",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": [
|
||||
"discord"
|
||||
// "--origin=https://localhost:9000/"
|
||||
@@ -69,7 +101,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Dev Launch",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": [
|
||||
"./simple.css",
|
||||
"--resolve=dev",
|
||||
@@ -79,6 +111,15 @@
|
||||
"cwd": "${workspaceFolder}/src/test/fixtures",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Linux Launch",
|
||||
"program": "${workspaceFolder}/packages/debug-bun-cli-linux-x64/bin/bun-debug",
|
||||
"args": ["--origin=http://jarred-desktop.local:3000/"],
|
||||
"cwd": "${workspaceFolder}/examples/hello-next",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
|
||||
{
|
||||
"type": "lldb",
|
||||
@@ -94,7 +135,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Demo Serve",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
// "args": ["--serve", "--origin=http://localhost:3000"],
|
||||
"args": ["dev", "--origin=http://localhost:3000"],
|
||||
"cwd": "${workspaceFolder}/examples/hello-next",
|
||||
@@ -114,7 +155,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Demo Lazy Build",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": [
|
||||
"./src/index.tsx",
|
||||
"--resolve=lazy",
|
||||
@@ -128,7 +169,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Demo Build",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": [
|
||||
"./src/index.tsx",
|
||||
"--resolve=dev",
|
||||
@@ -142,10 +183,28 @@
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Fixture serve",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}/src/test/fixtures",
|
||||
"name": "Dazzle serve",
|
||||
"program": "bun-debug",
|
||||
"args": ["--origin=http://localhost:5000", "--disable-hmr"],
|
||||
"cwd": "/Users/jarred/Build/lattice/apps/dazzle",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Bun",
|
||||
"program": "bun-debug",
|
||||
"args": ["bun", "--use=next"],
|
||||
"cwd": "/Users/jarred/Build/lattice/apps/dazzle",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "unicode check",
|
||||
"args": ["--disable-hmr"],
|
||||
"program": "bun-debug",
|
||||
"cwd": "/Users/jarred/Build/app994",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
|
||||
@@ -153,7 +212,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Demo .bun",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": ["bun", "--use=bun-framework-next"],
|
||||
"cwd": "${workspaceFolder}/examples/hello-next",
|
||||
"console": "internalConsole"
|
||||
@@ -162,7 +221,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "PNPM .bun",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": ["bun", "./pages/index.js"],
|
||||
"cwd": "/Users/jarred/Build/pnpm-bun/packages/app",
|
||||
"console": "internalConsole"
|
||||
@@ -172,7 +231,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "PNPM serve",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": [],
|
||||
"cwd": "/Users/jarred/Build/pnpm-bun/packages/app",
|
||||
"console": "internalConsole"
|
||||
@@ -181,7 +240,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Mixed case resolve",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": [
|
||||
"build",
|
||||
"./index.js",
|
||||
@@ -196,7 +255,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Build .bun lotta-modules",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": ["bun", "./index.js", "--platform=browser"],
|
||||
"cwd": "${workspaceFolder}/examples/lotta-modules/",
|
||||
"console": "internalConsole"
|
||||
@@ -205,7 +264,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Dev CRA",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": ["dev", "--platform=browser"],
|
||||
"cwd": "${workspaceFolder}/examples/hello-create-react-app/",
|
||||
"console": "internalConsole"
|
||||
@@ -214,7 +273,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Fragment",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}/src/test/fixtures",
|
||||
"console": "internalConsole"
|
||||
@@ -223,7 +282,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Context Bun Bug",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": ["bun", "./code.js"],
|
||||
"cwd": "/Users/jarred/Build/context/www",
|
||||
"console": "internalConsole"
|
||||
@@ -232,16 +291,43 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Context Bun",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": ["bun", "--use=next"],
|
||||
"cwd": "/Users/jarred/Build/context/www",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Bun-hello",
|
||||
"program": "bun-debug",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}/packages/bun-hello",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Integration Test Dev",
|
||||
"program": "bun-debug",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}/integration/snippets",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Integration Test Dev (no hmr)",
|
||||
"program": "bun-debug",
|
||||
"args": ["--disable-hmr"],
|
||||
"cwd": "${workspaceFolder}/integration/snippets",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Fixtures Dev",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "a",
|
||||
"args": ["dev"],
|
||||
"cwd": "${workspaceFolder}/src/test/fixtures",
|
||||
"console": "internalConsole"
|
||||
@@ -260,7 +346,7 @@
|
||||
|
||||
"request": "launch",
|
||||
"name": "Context Dev",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": [],
|
||||
"cwd": "/Users/jarred/Build/context/www",
|
||||
"console": "internalConsole"
|
||||
@@ -279,16 +365,16 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Debug Dev",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": ["dev"],
|
||||
"cwd": "${workspaceFolder}/examples/hello-next/bun-framework-next",
|
||||
"cwd": "${workspaceFolder}/examples/hello-next",
|
||||
"console": "internalConsole"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Type-only import",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": [
|
||||
"bun",
|
||||
"./src/test/fixtures/type-only-import.ts",
|
||||
@@ -301,7 +387,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Dev lotta-modules",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": ["dev", "./index.js", "--platform=browser"],
|
||||
"cwd": "${workspaceFolder}/examples/lotta-modules/",
|
||||
"console": "internalConsole"
|
||||
@@ -310,7 +396,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Demo Build .bun",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": [
|
||||
"bun",
|
||||
// "./index.js",
|
||||
@@ -325,7 +411,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "PNPM Resolve symlink",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": ["--resolve=dev", "test-pnpm.js", "--platform=browser"],
|
||||
"cwd": "${workspaceFolder}/examples/css-stress-test",
|
||||
"console": "internalConsole"
|
||||
@@ -334,7 +420,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Demo Print .bun",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "bun-debug",
|
||||
"args": ["./node_modules.bun"],
|
||||
"cwd": "${workspaceFolder}/examples/simple-react",
|
||||
"console": "internalConsole"
|
||||
@@ -363,7 +449,7 @@
|
||||
// "type": "lldb",
|
||||
// "request": "launch",
|
||||
// "name": "Dev Launch (other)",
|
||||
// "program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
// "program": "bun-debug",
|
||||
// "args": ["./simple.jsx", "--resolve=disable"],
|
||||
// "cwd": "${workspaceFolder}/src/test/fixtures",
|
||||
// "console": "internalConsole"
|
||||
@@ -372,7 +458,7 @@
|
||||
// "type": "lldb",
|
||||
// "request": "launch",
|
||||
// "name": "Dev Launch",
|
||||
// "program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
// "program": "bun-debug",
|
||||
// "preLaunchTask": "build",
|
||||
// "args": [
|
||||
// "--resolve=disable",
|
||||
@@ -387,7 +473,7 @@
|
||||
// "type": "lldb",
|
||||
// "request": "launch",
|
||||
// "name": "Dev Launch",
|
||||
// "program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
// "program": "bun-debug",
|
||||
// "preLaunchTask": "build",
|
||||
// "args": [
|
||||
// "--resolve=dev",
|
||||
@@ -404,7 +490,7 @@
|
||||
// "type": "lldb",
|
||||
// "request": "launch",
|
||||
// "name": "Dev Launch",
|
||||
// "program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
// "program": "bun-debug",
|
||||
// "preLaunchTask": "build",
|
||||
// "args": [
|
||||
// "--resolve=dev",
|
||||
@@ -421,7 +507,7 @@
|
||||
// "type": "lldb",
|
||||
// "request": "launch",
|
||||
// "name": "Dev Launch",
|
||||
// "program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
// "program": "bun-debug",
|
||||
// // "preLaunchTask": "build",
|
||||
// "args": [
|
||||
// "--resolve=dev",
|
||||
@@ -440,7 +526,7 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Rome",
|
||||
// "program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
// "program": "bun-debug",
|
||||
"program": "${workspaceFolder}/build/macos-x86_64/bun",
|
||||
// "preLaunchTask": "build",
|
||||
"args": [
|
||||
@@ -462,8 +548,8 @@
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Rome Dev",
|
||||
// "program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
"program": "${workspaceFolder}/build/debug/macos-x86_64/bun",
|
||||
// "program": "bun-debug",
|
||||
"program": "bun-debug",
|
||||
// "preLaunchTask": "build",
|
||||
"args": [
|
||||
"--resolve=dev",
|
||||
|
||||
29
.vscode/settings.json
vendored
29
.vscode/settings.json
vendored
@@ -3,15 +3,38 @@
|
||||
"search.quickOpen.includeSymbols": false,
|
||||
"search.seedWithNearestWord": true,
|
||||
"search.smartCase": true,
|
||||
"search.exclude": {
|
||||
"src/javascript/jsc/WebKit/**/*": true
|
||||
},
|
||||
"search.exclude": {},
|
||||
"search.followSymlinks": false,
|
||||
"search.useIgnoreFiles": true,
|
||||
"zig.buildOnSave": false,
|
||||
"[zig]": {
|
||||
"editor.defaultFormatter": "tiehuis.zig"
|
||||
},
|
||||
"lldb.verboseLogging": true,
|
||||
"zig.beforeDebugCmd": "make build-unit ${file} ${filter} ${bin}",
|
||||
"zig.testCmd": "make test ${file} ${filter} ${bin}",
|
||||
"files.exclude": {
|
||||
"**/.git": true,
|
||||
"**/.svn": true,
|
||||
"**/.hg": true,
|
||||
"**/CVS": true,
|
||||
"**/.DS_Store": true,
|
||||
"**/Thumbs.db": true,
|
||||
"**/*.xcworkspacedata": true,
|
||||
"**/*.xcscheme": true,
|
||||
"**/*.pem": true,
|
||||
"**/*.xcodeproj": true,
|
||||
|
||||
"integration/snapshots": true,
|
||||
"integration/snapshots-no-hmr": true,
|
||||
"src/javascript/jsc/WebKit": true,
|
||||
"src/deps/libarchive": true,
|
||||
"src/deps/mimalloc": true,
|
||||
"src/deps/s2n-tls": true,
|
||||
"src/deps/openssl": true,
|
||||
"src/deps/zlib": true,
|
||||
"integration/snippets/package-json-exports/_node_modules_copy": true
|
||||
},
|
||||
"C_Cpp.files.exclude": {
|
||||
"**/.vscode": true,
|
||||
"src/javascript/jsc/WebKit/JSTests": true,
|
||||
|
||||
52
Dockerfile-zig
Normal file
52
Dockerfile-zig
Normal file
@@ -0,0 +1,52 @@
|
||||
FROM ubuntu:latest
|
||||
|
||||
RUN apt-get update && apt-get install --no-install-recommends -y wget gnupg2 curl lsb-release wget software-properties-common
|
||||
RUN curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -
|
||||
|
||||
RUN wget https://apt.llvm.org/llvm.sh --no-check-certificate
|
||||
RUN chmod +x llvm.sh
|
||||
RUN ./llvm.sh 12
|
||||
|
||||
RUN apt-get update && apt-get install --no-install-recommends -y \
|
||||
ca-certificates \
|
||||
curl \
|
||||
gnupg2 \
|
||||
software-properties-common \
|
||||
cmake \
|
||||
build-essential \
|
||||
git \
|
||||
libssl-dev \
|
||||
ruby \
|
||||
liblld-12-dev \
|
||||
libclang-12-dev \
|
||||
nodejs \
|
||||
gcc \
|
||||
g++ \
|
||||
npm \
|
||||
clang-12 \
|
||||
clang-format-12 \
|
||||
libc++-12-dev \
|
||||
libc++abi-12-dev \
|
||||
lld-12 \
|
||||
libicu-dev
|
||||
|
||||
RUN update-alternatives --install /usr/bin/ld ld /usr/bin/lld-12 90 && \
|
||||
update-alternatives --install /usr/bin/cc cc /usr/bin/clang-12 90 && \
|
||||
update-alternatives --install /usr/bin/cpp cpp /usr/bin/clang++-12 90 && \
|
||||
update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-12 90
|
||||
|
||||
|
||||
ENV CC=clang-12
|
||||
ENV CXX=clang++-12
|
||||
|
||||
# Compile zig
|
||||
RUN mkdir -p /home/ubuntu/zig; cd /home/ubuntu; git clone https://github.com/jarred-sumner/zig.git; cd /home/ubuntu/zig && git checkout jarred/zig-sloppy-with-small-structs && cmake . -DCMAKE_BUILD_TYPE=Release && make -j$(nproc)
|
||||
|
||||
ENV PATH="/home/ubuntu/zig:$PATH"
|
||||
|
||||
RUN npm install -g esbuild
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
921
Makefile
921
Makefile
@@ -1,135 +1,270 @@
|
||||
SHELL := /bin/bash # Use bash syntax to be consistent
|
||||
|
||||
OS_NAME := $(shell uname -s | tr '[:upper:]' '[:lower:]')
|
||||
ARCH_NAME_DENORAMLZIED_1 := $(shell uname -m)
|
||||
ARCH_NAME_DENORAMLZIED_2 := $(shell tr '[_]' '[--]' <<< $(ARCH_NAME_DENORAMLZIED_1))
|
||||
ARCH_NAME_DENORAMLZIED_3 := $(shell sed s/x86-64/x64/ <<< $(ARCH_NAME_DENORAMLZIED_2))
|
||||
ARCH_NAME := $(shell sed s/arm64/aarch64/ <<< $(ARCH_NAME_DENORAMLZIED_3))
|
||||
TRIPLET := $(OS_NAME)-$(ARCH_NAME)
|
||||
PACKAGE_DIR := packages/bun-cli-$(TRIPLET)
|
||||
DEBUG_PACKAGE_DIR := packages/debug-bun-cli-$(TRIPLET)
|
||||
BIN_DIR := $(PACKAGE_DIR)/bin
|
||||
RELEASE_BIN := $(BIN_DIR)/bun
|
||||
DEBUG_BIN := $(DEBUG_PACKAGE_DIR)/bin
|
||||
BUILD_ID := $(shell cat ./build-id)
|
||||
PACKAGE_JSON_VERSION := 0.0.$(BUILD_ID)
|
||||
BUN_BUILD_TAG := bun-v$(PACKAGE_JSON_VERSION)
|
||||
ARCH_NAME_RAW := $(shell uname -m)
|
||||
BUN_AUTO_UPDATER_REPO = Jarred-Sumner/bun-releases-for-updater
|
||||
|
||||
bun: vendor build-obj bun-link-lld-release
|
||||
make-lazy = $(eval $1 = $$(eval $1 := $(value $(1)))$$($1))
|
||||
|
||||
vendor: api node-fallbacks runtime_js fallback_decoder bun_error mimalloc picohttp jsc
|
||||
MARCH_NATIVE =
|
||||
|
||||
build-obj:
|
||||
zig build obj -Drelease-fast
|
||||
ARCH_NAME :=
|
||||
ifeq ($(ARCH_NAME_RAW),arm64)
|
||||
ARCH_NAME = aarch64
|
||||
BREW_PREFIX_PATH = /opt/homebrew
|
||||
else
|
||||
ARCH_NAME = x64
|
||||
BREW_PREFIX_PATH = /usr/local
|
||||
MARCH_NATIVE = -march=native
|
||||
endif
|
||||
|
||||
sign-macos-x64:
|
||||
gon sign.macos-x64.json
|
||||
TRIPLET = $(OS_NAME)-$(ARCH_NAME)
|
||||
PACKAGE_NAME = bun-$(TRIPLET)
|
||||
PACKAGES_REALPATH = $(realpath packages)
|
||||
PACKAGE_DIR = $(PACKAGES_REALPATH)/$(PACKAGE_NAME)
|
||||
DEBUG_PACKAGE_DIR = $(PACKAGES_REALPATH)/debug-$(PACKAGE_NAME)
|
||||
RELEASE_BUN = $(PACKAGE_DIR)/bun
|
||||
DEBUG_BIN = $(DEBUG_PACKAGE_DIR)/
|
||||
DEBUG_BUN = $(DEBUG_BIN)/bun-debug
|
||||
BUILD_ID = $(shell cat ./build-id)
|
||||
PACKAGE_JSON_VERSION = 0.0.$(BUILD_ID)
|
||||
BUN_BUILD_TAG = bun-v$(PACKAGE_JSON_VERSION)
|
||||
BUN_RELEASE_BIN = $(PACKAGE_DIR)/bun
|
||||
PRETTIER ?= $(shell which prettier || echo "./node_modules/.bin/prettier")
|
||||
|
||||
sign-macos-aarch64:
|
||||
gon sign.macos-aarch64.json
|
||||
NPM_CLIENT = $(shell which npm)
|
||||
ZIG ?= $(shell which zig || echo -e "error: Missing zig. Please make sure zig is in PATH. Or set ZIG=/path/to-zig-executable")
|
||||
|
||||
release-macos: all-js build-obj jsc-bindings-mac bun-link-lld-release
|
||||
# We must use the same compiler version for the JavaScriptCore bindings and JavaScriptCore
|
||||
# If we don't do this, strange memory allocation failures occur.
|
||||
# This is easier to happen than you'd expect.
|
||||
CC = $(shell which clang-12 || which clang)
|
||||
CXX = $(shell which clang++-12 || which clang++)
|
||||
|
||||
all-js: runtime_js fallback_decoder bun_error node-fallbacks
|
||||
# macOS sed is different
|
||||
SED = $(shell which gsed || which sed)
|
||||
|
||||
bin-dir:
|
||||
@echo $(BIN_DIR)
|
||||
DEPS_DIR = $(shell pwd)/src/deps
|
||||
CPUS ?= $(shell nproc)
|
||||
USER ?= $(echo $USER)
|
||||
|
||||
api:
|
||||
npm install; ./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
|
||||
OPENSSL_VERSION = OpenSSL_1_1_1l
|
||||
LIBICONV_PATH ?= $(BREW_PREFIX_PATH)/opt/libiconv/lib/libiconv.a
|
||||
|
||||
node-fallbacks:
|
||||
@cd src/node-fallbacks; npm install; npm run --silent build
|
||||
OPENSSL_LINUX_DIR = $(DEPS_DIR)/openssl/openssl-OpenSSL_1_1_1l
|
||||
|
||||
fallback_decoder:
|
||||
@esbuild --target=esnext --bundle src/fallback.ts --format=iife --platform=browser --minify > src/fallback.out.js
|
||||
LIBCRYPTO_PREFIX_DIR = $(BREW_PREFIX_PATH)/opt/openssl@1.1
|
||||
LIBCRYPTO_STATIC_LIB ?= $(LIBCRYPTO_PREFIX_DIR)/lib/libcrypto.a
|
||||
LIBCRYPTO_INCLUDE_DIR = $(LIBCRYPTO_PREFIX_DIR)/include
|
||||
|
||||
runtime_js:
|
||||
@NODE_ENV=production esbuild --define:process.env.NODE_ENV="production" --target=esnext --bundle src/runtime/index.ts --format=iife --platform=browser --global-name=BUN_RUNTIME --minify --external:/bun:* > src/runtime.out.js; cat src/runtime.footer.js >> src/runtime.out.js
|
||||
|
||||
bun_error:
|
||||
@cd packages/bun-error; npm install; npm run --silent build
|
||||
|
||||
jsc: jsc-build jsc-bindings
|
||||
jsc-build: jsc-build-mac jsc-copy-headers
|
||||
jsc-bindings: jsc-bindings-headers jsc-bindings-mac
|
||||
|
||||
jsc-bindings-headers:
|
||||
mkdir -p src/JavaScript/jsc/bindings-obj/
|
||||
zig build headers
|
||||
|
||||
bump:
|
||||
expr $(BUILD_ID) + 1 > build-id
|
||||
ifeq ($(OS_NAME),linux)
|
||||
LIBCRYPTO_STATIC_LIB =
|
||||
LIBICONV_PATH = $(DEPS_DIR)/libiconv.a
|
||||
endif
|
||||
|
||||
|
||||
build_postinstall:
|
||||
@esbuild --bundle --format=cjs --platform=node --define:BUN_VERSION="\"$(PACKAGE_JSON_VERSION)\"" packages/bun-cli/scripts/postinstall.ts > packages/bun-cli/postinstall.js
|
||||
|
||||
write-package-json-version-cli: build_postinstall
|
||||
jq -S --raw-output '.version = "${PACKAGE_JSON_VERSION}"' packages/bun-cli/package.json > packages/bun-cli/package.json.new
|
||||
mv packages/bun-cli/package.json.new packages/bun-cli/package.json
|
||||
# Linux needs to have libcrypto 1.1.1 installed
|
||||
# download-openssl-linux:
|
||||
# mkdir -p $(DEPS_DIR)/openssl
|
||||
# wget https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_1_1_1l.zip
|
||||
# unzip -o OpenSSL_1_1_1l.zip -d $(DEPS_DIR)/openssl
|
||||
# rm OpenSSL_1_1_1l.zip
|
||||
|
||||
write-package-json-version:
|
||||
jq -S --raw-output '.version = "${PACKAGE_JSON_VERSION}"' $(PACKAGE_DIR)/package.json > $(PACKAGE_DIR)/package.json.new
|
||||
mv $(PACKAGE_DIR)/package.json.new $(PACKAGE_DIR)/package.json
|
||||
# build-openssl-linux:
|
||||
# cd $(OPENSSL_LINUX_DIR); \
|
||||
# ./config -d -fPIC \
|
||||
# no-md2 no-rc5 no-rfc3779 no-sctp no-ssl-trace no-zlib \
|
||||
# no-hw no-mdc2 no-seed no-idea enable-ec_nistp_64_gcc_128 no-camellia \
|
||||
# no-bf no-ripemd no-dsa no-ssl2 no-ssl3 no-capieng \
|
||||
# -DSSL_FORBID_ENULL -DOPENSSL_NO_DTLS1 -DOPENSSL_NO_HEARTBEATS; \
|
||||
# make -j $(CPUS) depend; \
|
||||
# make -j $(CPUS); \
|
||||
# make -j $(CPUS) install_sw; \
|
||||
# cp libcrypto.a $(DEPS_DIR)/libcrypto.a
|
||||
|
||||
tag:
|
||||
git tag $(BUN_BUILD_TAG)
|
||||
git push --tags
|
||||
build-iconv-linux:
|
||||
cd src/deps/libiconv/libiconv-1.16; ./configure --enable-static; make -j 12; cp ./lib/.libs/libiconv.a $(DEPS_DIR)/libiconv.a
|
||||
|
||||
prepare-release: tag release-create write-package-json-version-cli write-package-json-version
|
||||
BUN_TMP_DIR := /tmp/make-bun
|
||||
BUN_DEPLOY_DIR = /tmp/bun-v$(PACKAGE_JSON_VERSION)/$(PACKAGE_NAME)
|
||||
|
||||
release-create:
|
||||
gh release create --title "Bun v$(PACKAGE_JSON_VERSION)" "$(BUN_BUILD_TAG)"
|
||||
DEFAULT_USE_BMALLOC := 1
|
||||
# ifeq ($(OS_NAME),linux)
|
||||
# DEFAULT_USE_BMALLOC = 0
|
||||
# endif
|
||||
|
||||
release-cli-push:
|
||||
cd packages/bun-cli && npm pack --pack-destination /tmp/
|
||||
gh release upload $(BUN_BUILD_TAG) --clobber /tmp/bun-cli-$(PACKAGE_JSON_VERSION).tgz
|
||||
npm publish /tmp/bun-cli-$(PACKAGE_JSON_VERSION).tgz
|
||||
USE_BMALLOC ?= DEFAULT_USE_BMALLOC
|
||||
|
||||
release-mac-push: write-package-json-version
|
||||
cd $(PACKAGE_DIR) && npm pack --pack-destination /tmp/
|
||||
gh release upload $(BUN_BUILD_TAG) --clobber /tmp/bun-cli-$(TRIPLET)-$(PACKAGE_JSON_VERSION).tgz
|
||||
npm publish /tmp/bun-cli-$(TRIPLET)-$(PACKAGE_JSON_VERSION).tgz
|
||||
JSC_BASE_DIR ?= ${HOME}/webkit-build
|
||||
|
||||
DEFAULT_JSC_LIB :=
|
||||
|
||||
ifeq ($(OS_NAME),linux)
|
||||
DEFAULT_JSC_LIB = $(JSC_BASE_DIR)/lib
|
||||
endif
|
||||
|
||||
ifeq ($(OS_NAME),darwin)
|
||||
DEFAULT_JSC_LIB = src/deps
|
||||
endif
|
||||
|
||||
JSC_LIB ?= $(DEFAULT_JSC_LIB)
|
||||
|
||||
JSC_INCLUDE_DIR ?= $(JSC_BASE_DIR)/include
|
||||
ZLIB_INCLUDE_DIR ?= $(DEPS_DIR)/zlib
|
||||
ZLIB_LIB_DIR ?= $(DEPS_DIR)/zlib
|
||||
|
||||
JSC_FILES := $(JSC_LIB)/libJavaScriptCore.a $(JSC_LIB)/libWTF.a $(JSC_LIB)/libbmalloc.a
|
||||
|
||||
DEFAULT_LINKER_FLAGS =
|
||||
|
||||
JSC_BUILD_STEPS :=
|
||||
ifeq ($(OS_NAME),linux)
|
||||
JSC_BUILD_STEPS += jsc-check
|
||||
DEFAULT_LINKER_FLAGS= -lcrypto -pthread -ldl
|
||||
endif
|
||||
ifeq ($(OS_NAME),darwin)
|
||||
JSC_BUILD_STEPS += jsc-build-mac jsc-copy-headers
|
||||
endif
|
||||
|
||||
|
||||
jsc-copy-headers:
|
||||
find src/JavaScript/jsc/WebKit/WebKitBuild/Release/JavaScriptCore/Headers/JavaScriptCore/ -name "*.h" -exec cp {} src/JavaScript/jsc/WebKit/WebKitBuild/Release/JavaScriptCore/PrivateHeaders/JavaScriptCore \;
|
||||
STRIP ?= $(shell which llvm-strip || which llvm-strip-12 || echo "Missing llvm-strip. Please pass it in the STRIP environment var"; exit 1;)
|
||||
|
||||
jsc-build-mac-compile:
|
||||
cd src/javascript/jsc/WebKit && ICU_INCLUDE_DIRS="$(HOMEBREW_PREFIX)opt/icu4c/include" ./Tools/Scripts/build-jsc --jsc-only --cmakeargs="-DENABLE_STATIC_JSC=ON -DCMAKE_BUILD_TYPE=relwithdebinfo"
|
||||
HOMEBREW_PREFIX ?= $(BREW_PREFIX_PATH)
|
||||
|
||||
jsc-build-linux-compile:
|
||||
cd src/javascript/jsc/WebKit && ./Tools/Scripts/build-jsc --jsc-only --cmakeargs="-DENABLE_STATIC_JSC=ON -DCMAKE_BUILD_TYPE=relwithdebinfo
|
||||
s2n-ubuntu-deps:
|
||||
# https://github.com/aws/s2n-tls/blob/main/codebuild/spec/buildspec_ubuntu.yml#L50
|
||||
sudo apt-get install -y --no-install-recommends indent \
|
||||
iproute2 \
|
||||
kwstyle \
|
||||
lcov \
|
||||
libssl-dev \
|
||||
m4 \
|
||||
make \
|
||||
net-tools \
|
||||
nettle-bin \
|
||||
nettle-dev \
|
||||
pkg-config \
|
||||
psmisc \
|
||||
python3-pip \
|
||||
shellcheck \
|
||||
sudo \
|
||||
tcpdump \
|
||||
unzip \
|
||||
valgrind \
|
||||
zlib1g-dev \
|
||||
zlib \
|
||||
cmake \
|
||||
tox \
|
||||
libtool \
|
||||
ninja-build
|
||||
|
||||
s2n-linux:
|
||||
cd $(DEPS_DIR)/s2n-tls; \
|
||||
make clean; \
|
||||
rm -rf build; \
|
||||
CC=$(CC) CXX=$(CXX) cmake . -Bbuild -GNinja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DBUILD_SHARED_LIBS=OFF \
|
||||
-DBENCHMARK=0; \
|
||||
CC=$(CC) CXX=$(CXX) cmake --build ./build -j$(CPUS); \
|
||||
CC=$(CC) CXX=$(CXX) CTEST_PARALLEL_LEVEL=$(CPUS) ninja -C build;
|
||||
cp $(DEPS_DIR)/s2n-tls/build/lib/libs2n.a $(DEPS_DIR)/libs2n.a
|
||||
|
||||
jsc-build-mac: jsc-build-mac-compile jsc-build-mac-copy
|
||||
s2n-linux-debug:
|
||||
# https://github.com/aws/s2n-tls/blob/main/codebuild/spec/buildspec_ubuntu.yml#L50
|
||||
sudo apt-get install -y --no-install-recommends indent \
|
||||
iproute2 \
|
||||
kwstyle \
|
||||
lcov \
|
||||
libssl-dev \
|
||||
m4 \
|
||||
make \
|
||||
net-tools \
|
||||
nettle-bin \
|
||||
nettle-dev \
|
||||
pkg-config \
|
||||
psmisc \
|
||||
python3-pip \
|
||||
shellcheck \
|
||||
sudo \
|
||||
tcpdump \
|
||||
unzip \
|
||||
valgrind \
|
||||
zlib1g-dev \
|
||||
zlibc \
|
||||
cmake \
|
||||
tox \
|
||||
libtool \
|
||||
ninja-build
|
||||
|
||||
jsc-build-mac-copy:
|
||||
cp src/JavaScript/jsc/WebKit/WebKitBuild/Release/lib/libJavaScriptCore.a src/deps/libJavaScriptCore.a
|
||||
cp src/JavaScript/jsc/WebKit/WebKitBuild/Release/lib/libWTF.a src/deps/libWTF.a
|
||||
cp src/JavaScript/jsc/WebKit/WebKitBuild/Release/lib/libbmalloc.a src/deps/libbmalloc.a
|
||||
|
||||
JSC_FILES := src/deps/libJavaScriptCore.a \
|
||||
src/deps/libWTF.a \
|
||||
src/deps/libbmalloc.a
|
||||
cd $(DEPS_DIR)/s2n-tls; \
|
||||
make clean; \
|
||||
rm -rf build; \
|
||||
CC=$(CC) CXX=$(CXX) cmake . -Bbuild -GNinja \
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
-DBUILD_SHARED_LIBS=OFF \
|
||||
-DBENCHMARK=0; \
|
||||
CC=$(CC) CXX=$(CXX) cmake --build ./build -j$(CPUS); \
|
||||
CC=$(CC) CXX=$(CXX) CTEST_PARALLEL_LEVEL=$(CPUS) ninja -C build;
|
||||
cp $(DEPS_DIR)/s2n-tls/build/lib/libs2n.a $(DEPS_DIR)/libs2n.a
|
||||
|
||||
HOMEBREW_PREFIX := $(shell brew --prefix)/
|
||||
|
||||
SRC_DIR := src/javascript/jsc/bindings
|
||||
OBJ_DIR := src/javascript/jsc/bindings-obj
|
||||
SRC_FILES := $(wildcard $(SRC_DIR)/*.cpp)
|
||||
OBJ_FILES := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES))
|
||||
INCLUDE_DIRS := -Isrc/JavaScript/jsc/WebKit/WebKitBuild/Release/JavaScriptCore/PrivateHeaders \
|
||||
MAC_INCLUDE_DIRS := -Isrc/javascript/jsc/WebKit/WebKitBuild/Release/JavaScriptCore/PrivateHeaders \
|
||||
-Isrc/javascript/jsc/WebKit/WebKitBuild/Release/WTF/Headers \
|
||||
-Isrc/javascript/jsc/WebKit/WebKitBuild/Release/ICU/Headers \
|
||||
-Isrc/JavaScript/jsc/WebKit/WebKitBuild/Release/ \
|
||||
-Isrc/JavaScript/jsc/bindings/ \
|
||||
-Isrc/javascript/jsc/WebKit/WebKitBuild/Release/ \
|
||||
-Isrc/javascript/jsc/bindings/ \
|
||||
-Isrc/javascript/jsc/WebKit/Source/bmalloc
|
||||
|
||||
CLANG_FLAGS := $(INCLUDE_DIRS) \
|
||||
-std=gnu++1z \
|
||||
-stdlib=libc++ \
|
||||
LINUX_INCLUDE_DIRS := -I$(JSC_INCLUDE_DIR) \
|
||||
-Isrc/javascript/jsc/bindings/
|
||||
|
||||
INCLUDE_DIRS :=
|
||||
|
||||
ifeq ($(OS_NAME),linux)
|
||||
INCLUDE_DIRS += $(LINUX_INCLUDE_DIRS)
|
||||
endif
|
||||
|
||||
ifeq ($(OS_NAME),darwin)
|
||||
INCLUDE_DIRS += $(MAC_INCLUDE_DIRS)
|
||||
endif
|
||||
|
||||
|
||||
|
||||
MACOS_ICU_FILES = $(HOMEBREW_PREFIX)/opt/icu4c/lib/libicudata.a \
|
||||
$(HOMEBREW_PREFIX)/opt/icu4c/lib/libicui18n.a \
|
||||
$(HOMEBREW_PREFIX)/opt/icu4c/lib/libicuuc.a
|
||||
|
||||
MACOS_ICU_INCLUDE = $(HOMEBREW_PREFIX)/opt/icu4c/include
|
||||
|
||||
ICU_FLAGS :=
|
||||
|
||||
# TODO: find a way to make this more resilient
|
||||
# Ideally, we could just look up the linker search paths
|
||||
LIB_ICU_PATH ?= /usr/lib/x86_64-linux-gnu
|
||||
|
||||
ifeq ($(OS_NAME),linux)
|
||||
ICU_FLAGS += $(LIB_ICU_PATH)/libicuuc.a $(LIB_ICU_PATH)/libicudata.a $(LIB_ICU_PATH)/libicui18n.a
|
||||
endif
|
||||
|
||||
ifeq ($(OS_NAME),darwin)
|
||||
ICU_FLAGS += -l icucore \
|
||||
$(MACOS_ICU_FILES) \
|
||||
-I$(MACOS_ICU_INCLUDE)
|
||||
endif
|
||||
|
||||
|
||||
|
||||
CLANG_FLAGS = $(INCLUDE_DIRS) \
|
||||
-std=gnu++17 \
|
||||
-DSTATICALLY_LINKED_WITH_JavaScriptCore=1 \
|
||||
-DSTATICALLY_LINKED_WITH_WTF=1 \
|
||||
-DSTATICALLY_LINKED_WITH_BMALLOC=1 \
|
||||
-DBUILDING_WITH_CMAKE=1 \
|
||||
-DNDEBUG=1 \
|
||||
-DNOMINMAX \
|
||||
@@ -137,71 +272,585 @@ CLANG_FLAGS := $(INCLUDE_DIRS) \
|
||||
-g \
|
||||
-DENABLE_INSPECTOR_ALTERNATE_DISPATCHERS=0 \
|
||||
-DBUILDING_JSCONLY__ \
|
||||
-DASSERT_ENABLED=0\
|
||||
-DDU_DISABLE_RENAMING=1
|
||||
-DASSERT_ENABLED=0 \
|
||||
-fPIE
|
||||
|
||||
# This flag is only added to webkit builds on Apple platforms
|
||||
# It has something to do with ICU
|
||||
ifeq ($(OS_NAME), darwin)
|
||||
CLANG_FLAGS += -DDU_DISABLE_RENAMING=1 \
|
||||
-mmacosx-version-min=10.11
|
||||
endif
|
||||
|
||||
|
||||
|
||||
ARCHIVE_FILES_WITHOUT_LIBCRYPTO = src/deps/mimalloc/libmimalloc.a \
|
||||
src/deps/zlib/libz.a \
|
||||
src/deps/libarchive.a \
|
||||
src/deps/libs2n.a \
|
||||
src/deps/picohttpparser.o \
|
||||
|
||||
ARCHIVE_FILES = $(ARCHIVE_FILES_WITHOUT_LIBCRYPTO) src/deps/libcrypto.a
|
||||
|
||||
PLATFORM_LINKER_FLAGS =
|
||||
|
||||
ifeq ($(OS_NAME), linux)
|
||||
PLATFORM_LINKER_FLAGS = -lstdc++fs \
|
||||
-lc \
|
||||
-Wl,-z,now \
|
||||
-Wl,--as-needed \
|
||||
-Wl,-z,stack-size=12800000 \
|
||||
-Wl,-z,notext \
|
||||
-ffunction-sections \
|
||||
-fdata-sections \
|
||||
-Wl,--gc-sections
|
||||
endif
|
||||
|
||||
|
||||
BUN_LLD_FLAGS = $(OBJ_FILES) \
|
||||
${ICU_FLAGS} \
|
||||
${JSC_FILES} \
|
||||
$(ARCHIVE_FILES) \
|
||||
$(LIBICONV_PATH) \
|
||||
$(CLANG_FLAGS) \
|
||||
$(DEFAULT_LINKER_FLAGS) \
|
||||
$(PLATFORM_LINKER_FLAGS)
|
||||
|
||||
|
||||
bun: vendor identifier-cache build-obj bun-link-lld-release bun-codesign-release-local
|
||||
|
||||
|
||||
vendor-without-check: api analytics node-fallbacks runtime_js fallback_decoder bun_error mimalloc picohttp zlib s2n libarchive
|
||||
|
||||
|
||||
libarchive:
|
||||
cd src/deps/libarchive; \
|
||||
(make clean || echo ""); \
|
||||
(./build/clean.sh || echo ""); \
|
||||
./build/autogen.sh; \
|
||||
./configure --disable-shared --enable-static --with-pic --disable-bsdtar --disable-bsdcat --disable-rpath --enable-posix-regex-lib --without-xml2 --without-expat --without-openssl --without-iconv --without-zlib; \
|
||||
make -j${CPUS}; \
|
||||
cp ./.libs/libarchive.a $(DEPS_DIR)/libarchive.a;
|
||||
|
||||
tgz:
|
||||
$(ZIG) build-exe -Drelease-fast --main-pkg-path $(shell pwd) ./misctools/tgz.zig $(DEPS_DIR)/zlib/libz.a $(DEPS_DIR)/libarchive.a $(LIBICONV_PATH) -lc
|
||||
|
||||
tgz-debug:
|
||||
$(ZIG) build-exe --main-pkg-path $(shell pwd) ./misctools/tgz.zig $(DEPS_DIR)/zlib/libz.a $(DEPS_DIR)/libarchive.a $(LIBICONV_PATH) -lc
|
||||
|
||||
vendor: require init-submodules vendor-without-check
|
||||
|
||||
zlib:
|
||||
cd src/deps/zlib; cmake .; make;
|
||||
|
||||
require:
|
||||
@echo "Checking if the required utilities are available..."
|
||||
@cmake --version >/dev/null 2>&1 || (echo -e "ERROR: cmake is required."; exit 1)
|
||||
@esbuild --version >/dev/null 2>&1 || (echo -e "ERROR: esbuild is required."; exit 1)
|
||||
@npm --version >/dev/null 2>&1 || (echo -e "ERROR: npm is required."; exit 1)
|
||||
@which aclocal > /dev/null || (echo -e "ERROR: automake is required. Install on mac with:\n\n brew install automake"; exit 1)
|
||||
@which glibtoolize > /dev/null || (echo -e "ERROR: libtool is required. Install on mac with:\n\n brew install libtool"; exit 1)
|
||||
@which ninja > /dev/null || (echo -e "ERROR: Ninja is required. Install on mac with:\n\n brew install ninja"; exit 1)
|
||||
@stat $(LIBICONV_PATH) >/dev/null 2>&1 || (echo -e "ERROR: libiconv is required. Please run:\n\n brew install libiconv"; exit 1)
|
||||
@stat $(LIBCRYPTO_STATIC_LIB) >/dev/null 2>&1 || (echo -e "ERROR: OpenSSL 1.1 is required. Please run:\n\n brew install openssl@1.1"; exit 1)
|
||||
@echo "You have the dependencies installed! Woo"
|
||||
|
||||
init-submodules:
|
||||
git submodule update --init --recursive --progress --depth=1
|
||||
|
||||
build-obj:
|
||||
$(ZIG) build obj -Drelease-fast
|
||||
|
||||
sign-macos-x64:
|
||||
gon sign.macos-x64.json
|
||||
|
||||
sign-macos-aarch64:
|
||||
gon sign.macos-aarch64.json
|
||||
|
||||
cls:
|
||||
@echo "\n\n---\n\n"
|
||||
|
||||
release: all-js build-obj jsc-bindings-mac cls bun-link-lld-release release-bin-entitlements
|
||||
|
||||
jsc-check:
|
||||
@ls $(JSC_BASE_DIR) >/dev/null 2>&1 || (echo "Failed to access WebKit build. Please compile the WebKit submodule using the Dockerfile at $(shell pwd)/src/javascript/WebKit/Dockerfile and then copy from /output in the Docker container to $(JSC_BASE_DIR). You can override the directory via JSC_BASE_DIR. \n\n DOCKER_BUILDKIT=1 docker build -t bun-webkit $(shell pwd)/src/javascript/jsc/WebKit -f $(shell pwd)/src/javascript/jsc/WebKit/Dockerfile --progress=plain\n\n docker container create bun-webkit\n\n # Get the container ID\n docker container ls\n\n docker cp DOCKER_CONTAINER_ID_YOU_JUST_FOUND:/output $(JSC_BASE_DIR)" && exit 1)
|
||||
@ls $(JSC_INCLUDE_DIR) >/dev/null 2>&1 || (echo "Failed to access WebKit include directory at $(JSC_INCLUDE_DIR)." && exit 1)
|
||||
@ls $(JSC_LIB) >/dev/null 2>&1 || (echo "Failed to access WebKit lib directory at $(JSC_LIB)." && exit 1)
|
||||
|
||||
all-js: runtime_js fallback_decoder bun_error node-fallbacks
|
||||
|
||||
|
||||
api:
|
||||
$(NPM_CLIENT) install; ./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) --write src/api/schema.js
|
||||
$(PRETTIER) --write src/api/schema.d.ts
|
||||
|
||||
node-fallbacks:
|
||||
@cd src/node-fallbacks; $(NPM_CLIENT) install; npm run --silent build
|
||||
|
||||
fallback_decoder:
|
||||
@esbuild --target=esnext --bundle src/fallback.ts --format=iife --platform=browser --minify > src/fallback.out.js
|
||||
|
||||
runtime_js:
|
||||
@NODE_ENV=production esbuild --define:process.env.NODE_ENV="production" --target=esnext --bundle src/runtime/index.ts --format=iife --platform=browser --global-name=BUN_RUNTIME --minify --external:/bun:* > src/runtime.out.js; cat src/runtime.footer.js >> src/runtime.out.js
|
||||
|
||||
runtime_js_dev:
|
||||
@NODE_ENV=development esbuild --define:process.env.NODE_ENV="development" --target=esnext --bundle src/runtime/index.ts --format=iife --platform=browser --global-name=BUN_RUNTIME --external:/bun:* > src/runtime.out.js; cat src/runtime.footer.js >> src/runtime.out.js
|
||||
|
||||
bun_error:
|
||||
@cd packages/bun-error; $(NPM_CLIENT) install; npm run --silent build
|
||||
|
||||
generate-install-script:
|
||||
@rm -f $(PACKAGES_REALPATH)/bun/install.js
|
||||
@esbuild --log-level=error --define:BUN_VERSION="\"$(PACKAGE_JSON_VERSION)\"" --define:process.env.NODE_ENV="\"production\"" --platform=node --format=cjs $(PACKAGES_REALPATH)/bun/install.ts > $(PACKAGES_REALPATH)/bun/install.js
|
||||
|
||||
fetch:
|
||||
cd misctools; $(ZIG) build-obj -Drelease-fast ./fetch.zig -fcompiler-rt -lc --main-pkg-path ../
|
||||
$(CXX) ./misctools/fetch.o -g -O3 -o ./misctools/fetch $(DEFAULT_LINKER_FLAGS) -lc \
|
||||
src/deps/mimalloc/libmimalloc.a \
|
||||
src/deps/zlib/libz.a \
|
||||
src/deps/libarchive.a \
|
||||
src/deps/libs2n.a \
|
||||
src/deps/picohttpparser.o \
|
||||
$(LIBCRYPTO_STATIC_LIB)
|
||||
|
||||
fetch-debug:
|
||||
cd misctools; $(ZIG) build-obj ./fetch.zig -fcompiler-rt -lc --main-pkg-path ../
|
||||
$(CXX) ./misctools/fetch.o -g -o ./misctools/fetch $(DEFAULT_LINKER_FLAGS) -lc \
|
||||
src/deps/mimalloc/libmimalloc.a \
|
||||
src/deps/zlib/libz.a \
|
||||
src/deps/libarchive.a \
|
||||
src/deps/libs2n.a \
|
||||
src/deps/picohttpparser.o \
|
||||
$(LIBCRYPTO_STATIC_LIB)
|
||||
|
||||
s2n-mac:
|
||||
cd $(DEPS_DIR)/s2n-tls; \
|
||||
make clean; \
|
||||
CC=$(CC) CXX=$(CXX) cmake . -Bbuild -GNinja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DBUILD_SHARED_LIBS=OFF \
|
||||
-DLibCrypto_INCLUDE_DIR=$(LIBCRYPTO_INCLUDE_DIR) \
|
||||
-DLibCrypto_STATIC_LIBRARY=$(LIBCRYPTO_STATIC_LIB) \
|
||||
-DLibCrypto_LIBRARY=$(LIBCRYPTO_STATIC_LIB) \
|
||||
-DCMAKE_PREFIX_PATH=$(LIBCRYPTO_PREFIX_DIR); \
|
||||
CC=$(CC) CXX=$(CXX) cmake --build ./build -j$(CPUS); \
|
||||
CC=$(CC) CXX=$(CXX) CTEST_PARALLEL_LEVEL=$(CPUS) ninja -C build
|
||||
cp $(DEPS_DIR)/s2n-tls/build/lib/libs2n.a $(DEPS_DIR)/libs2n.a
|
||||
unlink $(DEPS_DIR)/libcrypto.a || echo "";
|
||||
ln $(LIBCRYPTO_STATIC_LIB) $(DEPS_DIR)/libcrypto.a || echo "";
|
||||
|
||||
s2n-mac-debug:
|
||||
cd $(DEPS_DIR)/s2n-tls; \
|
||||
make clean; \
|
||||
CC=$(CC) CXX=$(CXX) cmake . -Bbuild -GNinja \
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
-DBUILD_SHARED_LIBS=OFF \
|
||||
-DLibCrypto_INCLUDE_DIR=$(LIBCRYPTO_INCLUDE_DIR) \
|
||||
-DLibCrypto_STATIC_LIBRARY=$(LIBCRYPTO_STATIC_LIB) \
|
||||
-DLibCrypto_LIBRARY=$(LIBCRYPTO_STATIC_LIB) \
|
||||
-DCMAKE_PREFIX_PATH=$(LIBCRYPTO_PREFIX_DIR); \
|
||||
CC=$(CC) CXX=$(CXX) cmake --build ./build -j$(CPUS); \
|
||||
CC=$(CC) CXX=$(CXX) CTEST_PARALLEL_LEVEL=$(CPUS) ninja -C build test
|
||||
cp $(DEPS_DIR)/s2n-tls/build/lib/libs2n.a $(DEPS_DIR)/libs2n.a
|
||||
unlink $(DEPS_DIR)/libcrypto.a || echo "";
|
||||
ln $(LIBCRYPTO_STATIC_LIB) $(DEPS_DIR)/libcrypto.a || echo "";
|
||||
|
||||
libcrypto_path:
|
||||
@echo ${LIBCRYPTO_STATIC_LIB}
|
||||
|
||||
bun-codesign-debug:
|
||||
bun-codesign-release-local:
|
||||
|
||||
|
||||
ifeq ($(OS_NAME),darwin)
|
||||
s2n: s2n-mac
|
||||
|
||||
|
||||
# Hardened runtime will not work with debugging
|
||||
bun-codesign-debug:
|
||||
codesign --entitlements $(realpath entitlements.plist) --force --timestamp --sign "$(CODESIGN_IDENTITY)" -vvvv --deep --strict $(DEBUG_BUN)
|
||||
|
||||
bun-codesign-release-local:
|
||||
codesign --entitlements $(realpath entitlements.plist) --options runtime --force --timestamp --sign "$(CODESIGN_IDENTITY)" -vvvv --deep --strict $(RELEASE_BUN)
|
||||
codesign --entitlements $(realpath entitlements.plist) --options runtime --force --timestamp --sign "$(CODESIGN_IDENTITY)" -vvvv --deep --strict $(PACKAGE_DIR)/bun-profile
|
||||
|
||||
|
||||
endif
|
||||
|
||||
jsc: jsc-build jsc-bindings
|
||||
jsc-build: $(JSC_BUILD_STEPS)
|
||||
jsc-bindings: jsc-bindings-headers jsc-bindings-mac
|
||||
|
||||
jsc-bindings-headers:
|
||||
rm -f /tmp/build-jsc-headers src/javascript/jsc/bindings/headers.zig
|
||||
touch src/javascript/jsc/bindings/headers.zig
|
||||
mkdir -p src/javascript/jsc/bindings-obj/
|
||||
$(ZIG) build headers-obj
|
||||
$(CXX) $(PLATFORM_LINKER_FLAGS) -g $(DEBUG_BIN)/headers.o -W -o /tmp/build-jsc-headers $(DEFAULT_LINKER_FLAGS) -lc $(ARCHIVE_FILES);
|
||||
/tmp/build-jsc-headers
|
||||
$(ZIG) translate-c src/javascript/jsc/bindings/headers.h > src/javascript/jsc/bindings/headers.zig
|
||||
$(ZIG) run misctools/headers-cleaner.zig -lc
|
||||
$(SED) -i '/pub const __darwin/d' src/javascript/jsc/bindings/headers.zig || echo "";
|
||||
$(SED) -i '/pub const __builtin/d' src/javascript/jsc/bindings/headers.zig || echo "";
|
||||
$(SED) -i '/pub const int/d' src/javascript/jsc/bindings/headers.zig || echo "";
|
||||
$(SED) -i '/pub const uint/d' src/javascript/jsc/bindings/headers.zig || echo "";
|
||||
$(SED) -i '/pub const intmax/d' src/javascript/jsc/bindings/headers.zig || echo "";
|
||||
$(SED) -i '/pub const uintmax/d' src/javascript/jsc/bindings/headers.zig || echo "";
|
||||
$(SED) -i '/pub const max_align_t/{N;N;N;d;}' src/javascript/jsc/bindings/headers.zig
|
||||
$(SED) -i '/pub const ZigErrorCode/d' src/javascript/jsc/bindings/headers.zig
|
||||
$(SED) -i '/pub const JSClassRef/d' src/javascript/jsc/bindings/headers.zig
|
||||
$(ZIG) fmt src/javascript/jsc/bindings/headers.zig
|
||||
|
||||
|
||||
bump:
|
||||
expr $(BUILD_ID) + 1 > build-id
|
||||
|
||||
|
||||
identifier-cache:
|
||||
$(ZIG) run src/js_lexer/identifier_data.zig
|
||||
|
||||
tag:
|
||||
git tag $(BUN_BUILD_TAG)
|
||||
git push --tags
|
||||
|
||||
prepare-release: tag release-create
|
||||
|
||||
release-create-auto-updater:
|
||||
|
||||
release-create:
|
||||
gh release create --title "Bun v$(PACKAGE_JSON_VERSION)" "$(BUN_BUILD_TAG)"
|
||||
gh release create --repo=$(BUN_AUTO_UPDATER_REPO) --title "Bun v$(PACKAGE_JSON_VERSION)" "$(BUN_BUILD_TAG)" -n "See https://github.com/Jarred-Sumner/bun/releases/tag/$(BUN_BUILD_TAG) for release notes. Using the install script or bun upgrade is the recommended way to install Bun. Join Bun's Discord to get access https://bun.sh/discord"
|
||||
|
||||
release-bin-entitlements:
|
||||
|
||||
release-bin-generate-zip:
|
||||
release-bin-codesign:
|
||||
|
||||
ifeq ($(OS_NAME),darwin)
|
||||
# Without this, JIT will fail on aarch64
|
||||
# strip will remove the entitlements.plist
|
||||
# which, in turn, will break JIT
|
||||
release-bin-entitlements:
|
||||
codesign --entitlements $(realpath entitlements.plist) --options runtime --force --timestamp --sign "$(CODESIGN_IDENTITY)" -vvvv --deep --strict $(PACKAGE_DIR)/bun
|
||||
codesign --entitlements $(realpath entitlements.plist) --options runtime --force --timestamp --sign "$(CODESIGN_IDENTITY)" -vvvv --deep --strict $(PACKAGE_DIR)/bun-profile
|
||||
|
||||
|
||||
# macOS expects a specific directory structure for the zip file
|
||||
# ditto lets us generate it similarly to right clicking "Compress" in Finder
|
||||
release-bin-generate-zip:
|
||||
dot_clean -vnm /tmp/bun-$(PACKAGE_JSON_VERSION)/bun-$(TRIPLET)
|
||||
cd /tmp/bun-$(PACKAGE_JSON_VERSION)/bun-$(TRIPLET) && \
|
||||
codesign --entitlements $(realpath entitlements.plist) --options runtime --force --timestamp --sign "$(CODESIGN_IDENTITY)" -vvvv --deep --strict bun
|
||||
ditto -ck --rsrc --sequesterRsrc --keepParent /tmp/bun-$(PACKAGE_JSON_VERSION)/bun-$(TRIPLET) $(BUN_DEPLOY_ZIP)
|
||||
|
||||
release-bin-codesign:
|
||||
xcrun notarytool submit --wait $(BUN_DEPLOY_ZIP) --keychain-profile "bun"
|
||||
|
||||
else
|
||||
|
||||
release-bin-generate-zip:
|
||||
cd /tmp/bun-$(PACKAGE_JSON_VERSION)/ && zip -r bun-$(TRIPLET).zip bun-$(TRIPLET)
|
||||
|
||||
|
||||
endif
|
||||
|
||||
|
||||
BUN_DEPLOY_ZIP = /tmp/bun-$(PACKAGE_JSON_VERSION)/bun-$(TRIPLET).zip
|
||||
|
||||
|
||||
release-bin-generate-copy:
|
||||
rm -rf /tmp/bun-$(PACKAGE_JSON_VERSION)/bun-$(TRIPLET) $(BUN_DEPLOY_ZIP)
|
||||
mkdir -p /tmp/bun-$(PACKAGE_JSON_VERSION)/bun-$(TRIPLET)
|
||||
cp $(BUN_RELEASE_BIN) /tmp/bun-$(PACKAGE_JSON_VERSION)/bun-$(TRIPLET)/bun
|
||||
|
||||
release-bin-generate: release-bin-generate-copy release-bin-generate-zip
|
||||
|
||||
|
||||
release-bin-check:
|
||||
test $(shell eval $(BUN_RELEASE_BIN) --version) = $(PACKAGE_JSON_VERSION)
|
||||
|
||||
release-bin-without-push: test-all release-bin-check release-bin-generate release-bin-codesign
|
||||
release-bin: release-bin-without-push release-bin-push
|
||||
|
||||
release-bin-push:
|
||||
gh release upload $(BUN_BUILD_TAG) --clobber $(BUN_DEPLOY_ZIP)
|
||||
gh release upload $(BUN_BUILD_TAG) --clobber $(BUN_DEPLOY_ZIP) --repo $(BUN_AUTO_UPDATER_REPO)
|
||||
|
||||
dev-obj:
|
||||
$(ZIG) build obj
|
||||
|
||||
dev-obj-linux:
|
||||
$(ZIG) build obj -Dtarget=x86_64-linux-gnu
|
||||
|
||||
dev: mkdir-dev dev-obj bun-link-lld-debug bun-codesign-debug
|
||||
|
||||
mkdir-dev:
|
||||
mkdir -p $(DEBUG_PACKAGE_DIR)/bin
|
||||
|
||||
test-install:
|
||||
cd integration/scripts && $(NPM_CLIENT) install
|
||||
|
||||
test-all: test-install test-with-hmr test-no-hmr test-create-next test-create-react test-bun-run
|
||||
test-all-mac: test-install test-with-hmr-mac test-no-hmr-mac test-create-next-mac test-create-react-mac test-bun-run-mac
|
||||
|
||||
copy-test-node-modules:
|
||||
rm -rf integration/snippets/package-json-exports/node_modules || echo "";
|
||||
cp -r integration/snippets/package-json-exports/_node_modules_copy integration/snippets/package-json-exports/node_modules || echo "";
|
||||
kill-bun:
|
||||
-killall -9 bun bun-debug
|
||||
|
||||
test-dev-create-next:
|
||||
BUN_BIN=$(DEBUG_BUN) bash integration/apps/bun-create-next.sh
|
||||
|
||||
test-dev-create-react:
|
||||
BUN_BIN=$(DEBUG_BUN) bash integration/apps/bun-create-react.sh
|
||||
|
||||
test-create-next:
|
||||
BUN_BIN=$(RELEASE_BUN) bash integration/apps/bun-create-next.sh
|
||||
|
||||
test-bun-run:
|
||||
cd integration/apps && BUN_BIN=$(RELEASE_BUN) bash ./bun-run-check.sh
|
||||
|
||||
test-create-react:
|
||||
BUN_BIN=$(RELEASE_BUN) bash integration/apps/bun-create-react.sh
|
||||
|
||||
test-with-hmr: kill-bun copy-test-node-modules
|
||||
BUN_BIN=$(RELEASE_BUN) node integration/scripts/browser.js
|
||||
|
||||
test-no-hmr: kill-bun copy-test-node-modules
|
||||
-killall bun -9;
|
||||
DISABLE_HMR="DISABLE_HMR" BUN_BIN=$(RELEASE_BUN) node integration/scripts/browser.js
|
||||
|
||||
test-create-next-mac:
|
||||
BUN_BIN=$(MAC_BUN) bash integration/apps/bun-create-next.sh
|
||||
|
||||
test-bun-run-mac:
|
||||
cd integration/apps && BUN_BIN=$(MAC_BUN) bash ./bun-run-check.sh
|
||||
|
||||
test-create-react-mac:
|
||||
BUN_BIN=$(MAC_BUN) bash integration/apps/bun-create-react.sh
|
||||
|
||||
test-with-hmr-mac: kill-bun copy-test-node-modules
|
||||
BUN_BIN=$(MAC_BUN) node integration/scripts/browser.js
|
||||
|
||||
test-no-hmr-mac: kill-bun copy-test-node-modules
|
||||
-killall bun -9;
|
||||
DISABLE_HMR="DISABLE_HMR" BUN_BIN=$(MAC_BUN) node integration/scripts/browser.js
|
||||
|
||||
test-dev-with-hmr: copy-test-node-modules
|
||||
-killall bun-debug -9;
|
||||
BUN_BIN=$(DEBUG_BUN) node integration/scripts/browser.js
|
||||
|
||||
test-dev-no-hmr: copy-test-node-modules
|
||||
-killall bun-debug -9;
|
||||
DISABLE_HMR="DISABLE_HMR" BUN_BIN=$(DEBUG_BUN) node integration/scripts/browser.js
|
||||
|
||||
test-dev-bun-run:
|
||||
cd integration/apps && BUN_BIN=$(DEBUG_BUN) bash bun-run-check.sh
|
||||
|
||||
test-dev-all: test-dev-with-hmr test-dev-no-hmr test-dev-create-next test-dev-create-react test-dev-bun-run
|
||||
test-dev-bunjs:
|
||||
|
||||
test-dev: test-dev-with-hmr
|
||||
|
||||
jsc-copy-headers:
|
||||
find src/javascript/jsc/WebKit/WebKitBuild/Release/JavaScriptCore/Headers/JavaScriptCore/ -name "*.h" -exec cp {} src/javascript/jsc/WebKit/WebKitBuild/Release/JavaScriptCore/PrivateHeaders/JavaScriptCore/ \;
|
||||
|
||||
jsc-build-mac-compile:
|
||||
cd src/javascript/jsc/WebKit && ICU_INCLUDE_DIRS="$(HOMEBREW_PREFIX)opt/icu4c/include" ./Tools/Scripts/build-jsc --jsc-only --cmakeargs="-DENABLE_STATIC_JSC=ON -DCMAKE_BUILD_TYPE=relwithdebinfo -DUSE_PTHREAD_JIT_PERMISSIONS_API=1"
|
||||
|
||||
jsc-build-linux-compile:
|
||||
cd src/javascript/jsc/WebKit && ./Tools/Scripts/build-jsc --jsc-only --cmakeargs="-DENABLE_STATIC_JSC=ON -DCMAKE_BUILD_TYPE=relwithdebinfo -DUSE_THIN_ARCHIVES=OFF"
|
||||
|
||||
jsc-build-mac: jsc-build-mac-compile jsc-build-mac-copy
|
||||
|
||||
jsc-build-linux: jsc-build-linux-compile jsc-build-mac-copy
|
||||
|
||||
jsc-build-mac-copy:
|
||||
cp src/javascript/jsc/WebKit/WebKitBuild/Release/lib/libJavaScriptCore.a src/deps/libJavaScriptCore.a
|
||||
cp src/javascript/jsc/WebKit/WebKitBuild/Release/lib/libWTF.a src/deps/libWTF.a
|
||||
cp src/javascript/jsc/WebKit/WebKitBuild/Release/lib/libbmalloc.a src/deps/libbmalloc.a
|
||||
|
||||
clean-bindings:
|
||||
rm -rf $(OBJ_DIR)/*.o
|
||||
|
||||
clean: clean-bindings
|
||||
rm src/deps/*.a src/deps/*.o
|
||||
(cd src/deps/mimalloc && make clean) || echo "";
|
||||
(cd src/deps/libarchive && make clean) || echo "";
|
||||
(cd src/deps/s2n-tls && make clean) || echo "";
|
||||
(cd src/deps/picohttp && make clean) || echo "";
|
||||
(cd src/deps/zlib && make clean) || echo "";
|
||||
|
||||
jsc-bindings-mac: $(OBJ_FILES)
|
||||
|
||||
|
||||
MACOS_ICU_FILES := $(HOMEBREW_PREFIX)opt/icu4c/lib/libicudata.a \
|
||||
$(HOMEBREW_PREFIX)opt/icu4c/lib/libicui18n.a \
|
||||
$(HOMEBREW_PREFIX)opt/icu4c/lib/libicuuc.a
|
||||
|
||||
MACOS_ICU_INCLUDE := $(HOMEBREW_PREFIX)opt/icu4c/include
|
||||
|
||||
MACOS_ICU_FLAGS := -l icucore \
|
||||
$(MACOS_ICU_FILES) \
|
||||
-I$(MACOS_ICU_INCLUDE)
|
||||
|
||||
BUN_LLD_FLAGS := $(OBJ_FILES) \
|
||||
${MACOS_ICU_FLAGS} \
|
||||
${JSC_FILES} \
|
||||
src/deps/picohttpparser.o \
|
||||
src/deps/mimalloc/libmimalloc.a \
|
||||
$(CLANG_FLAGS) \
|
||||
-fpie \
|
||||
|
||||
mimalloc:
|
||||
cd src/deps/mimalloc; cmake .; make;
|
||||
|
||||
bun-link-lld-debug:
|
||||
clang++ $(BUN_LLD_FLAGS) \
|
||||
$(CXX) $(BUN_LLD_FLAGS) \
|
||||
-g \
|
||||
$(DEBUG_BIN)/bun-debug.o \
|
||||
-Wl,-dead_strip \
|
||||
-ftls-model=local-exec \
|
||||
-flto \
|
||||
-o $(DEBUG_BIN)/bun-debug
|
||||
-W \
|
||||
-o $(DEBUG_BIN)/bun-debug \
|
||||
|
||||
|
||||
bun-relink-copy:
|
||||
cp /tmp/bun-$(PACKAGE_JSON_VERSION).o $(BUN_RELEASE_BIN).o
|
||||
|
||||
bun-relink: bun-relink-copy bun-link-lld-release
|
||||
|
||||
|
||||
bun-link-lld-release:
|
||||
clang++ $(BUN_LLD_FLAGS) \
|
||||
$(BIN_DIR)/bun.o \
|
||||
-o $(BIN_DIR)/bun \
|
||||
-Wl,-dead_strip \
|
||||
-ftls-model=local-exec \
|
||||
-flto \
|
||||
-O3
|
||||
rm $(BIN_DIR)/bun.o
|
||||
|
||||
bun-link-lld-release-aarch64:
|
||||
clang++ $(BUN_LLD_FLAGS) \
|
||||
build/macos-aarch64/bun.o \
|
||||
-o build/macos-aarch64/bun \
|
||||
-Wl,-dead_strip \
|
||||
-ftls-model=local-exec \
|
||||
$(CXX) $(BUN_LLD_FLAGS) \
|
||||
$(BUN_RELEASE_BIN).o \
|
||||
-o $(BUN_RELEASE_BIN) \
|
||||
-W \
|
||||
-flto \
|
||||
-ftls-model=initial-exec \
|
||||
-O3
|
||||
cp $(BUN_RELEASE_BIN) $(BUN_RELEASE_BIN)-profile
|
||||
-$(STRIP) $(BUN_RELEASE_BIN)
|
||||
|
||||
mv $(BUN_RELEASE_BIN).o /tmp/bun-$(PACKAGE_JSON_VERSION).o
|
||||
|
||||
# We do this outside of build.zig for performance reasons
|
||||
# The C compilation stuff with build.zig is really slow and we don't need to run this as often as the rest
|
||||
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
|
||||
clang++ -c -o $@ $< \
|
||||
$(CXX) -c -o $@ $< \
|
||||
$(CLANG_FLAGS) \
|
||||
-O1
|
||||
-O1 \
|
||||
-w
|
||||
|
||||
sizegen:
|
||||
clang++ src/javascript/jsc/headergen/sizegen.cpp -o /tmp/sizegen $(CLANG_FLAGS) -O1
|
||||
/tmp/sizegen > src/javascript/jsc/bindings/sizes.zig
|
||||
$(CXX) src/javascript/jsc/headergen/sizegen.cpp -o $(BUN_TMP_DIR)/sizegen $(CLANG_FLAGS) -O1
|
||||
$(BUN_TMP_DIR)/sizegen > src/javascript/jsc/bindings/sizes.zig
|
||||
|
||||
picohttp:
|
||||
clang -O3 -g -c src/deps/picohttpparser.c -Isrc/deps -o src/deps/picohttpparser.o; cd ../../
|
||||
$(CC) $(MARCH_NATIVE) -O3 -g -fPIE -c src/deps/picohttpparser/picohttpparser.c -Isrc/deps -o src/deps/picohttpparser.o; cd ../../
|
||||
|
||||
analytics:
|
||||
./node_modules/.bin/peechy --schema src/analytics/schema.peechy --zig src/analytics/analytics_schema.zig
|
||||
$(ZIG) fmt src/analytics/analytics_schema.zig
|
||||
|
||||
analytics-features:
|
||||
@cd misctools; $(ZIG) run --main-pkg-path ../ ./features.zig
|
||||
|
||||
find-unused-zig-files:
|
||||
@bash ./misctools/find-unused-zig.sh
|
||||
|
||||
generate-unit-tests:
|
||||
@bash ./misctools/generate-test-file.sh
|
||||
|
||||
fmt-all:
|
||||
find src -name "*.zig" -exec $(ZIG) fmt {} \;
|
||||
|
||||
unit-tests: generate-unit-tests run-unit-tests
|
||||
|
||||
|
||||
|
||||
ifeq (test, $(firstword $(MAKECMDGOALS)))
|
||||
testpath := $(firstword $(wordlist 2, $(words $(MAKECMDGOALS)), $(MAKECMDGOALS)))
|
||||
testfilter := $(wordlist 3, $(words $(MAKECMDGOALS)), $(MAKECMDGOALS))
|
||||
testbinpath := zig-out/bin/test
|
||||
testbinpath := $(lastword $(testfilter))
|
||||
|
||||
ifeq ($(if $(patsubst /%,,$(testbinpath)),,yes),yes)
|
||||
testfilterflag := --test-filter "$(filter-out $(testbinpath), $(testfilter))"
|
||||
|
||||
endif
|
||||
|
||||
ifneq ($(if $(patsubst /%,,$(testbinpath)),,yes),yes)
|
||||
testbinpath := zig-out/bin/test
|
||||
ifneq ($(strip $(testfilter)),)
|
||||
testfilterflag := --test-filter "$(testfilter)"
|
||||
endif
|
||||
endif
|
||||
|
||||
testname := $(shell basename $(testpath))
|
||||
|
||||
|
||||
$(eval $(testname):;@true)
|
||||
|
||||
ifeq ($(words $(testfilter)), 0)
|
||||
testfilterflag := --test-name-prefix "$(testname): "
|
||||
endif
|
||||
|
||||
ifeq ($(testfilterflag), undefined)
|
||||
testfilterflag := --test-name-prefix "$(testname): "
|
||||
endif
|
||||
|
||||
|
||||
endif
|
||||
|
||||
ifeq (build-unit, $(firstword $(MAKECMDGOALS)))
|
||||
testpath := $(firstword $(wordlist 2, $(words $(MAKECMDGOALS)), $(MAKECMDGOALS)))
|
||||
testfilter := $(wordlist 3, $(words $(MAKECMDGOALS)), $(MAKECMDGOALS))
|
||||
testbinpath := zig-out/bin/test
|
||||
testbinpath := $(lastword $(testfilter))
|
||||
|
||||
ifeq ($(if $(patsubst /%,,$(testbinpath)),,yes),yes)
|
||||
testfilterflag := --test-filter "$(filter-out $(testbinpath), $(testfilter))"
|
||||
|
||||
endif
|
||||
|
||||
ifneq ($(if $(patsubst /%,,$(testbinpath)),,yes),yes)
|
||||
testbinpath := zig-out/bin/test
|
||||
ifneq ($(strip $(testfilter)),)
|
||||
testfilterflag := --test-filter "$(testfilter)"
|
||||
endif
|
||||
endif
|
||||
|
||||
testname := $(shell basename $(testpath))
|
||||
|
||||
|
||||
$(eval $(testname):;@true)
|
||||
$(eval $(testfilter):;@true)
|
||||
$(eval $(testpath):;@true)
|
||||
|
||||
ifeq ($(words $(testfilter)), 0)
|
||||
testfilterflag := --test-name-prefix "$(testname): "
|
||||
endif
|
||||
|
||||
ifeq ($(testfilterflag), undefined)
|
||||
testfilterflag := --test-name-prefix "$(testname): "
|
||||
endif
|
||||
|
||||
|
||||
|
||||
endif
|
||||
|
||||
build-unit:
|
||||
@rm -rf zig-out/bin/$(testname)
|
||||
@mkdir -p zig-out/bin
|
||||
zig test $(realpath $(testpath)) \
|
||||
$(testfilterflag) \
|
||||
--pkg-begin picohttp $(DEPS_DIR)/picohttp.zig --pkg-end \
|
||||
--pkg-begin clap $(DEPS_DIR)/zig-clap/clap.zig --pkg-end \
|
||||
--main-pkg-path $(shell pwd) \
|
||||
--test-no-exec \
|
||||
-fPIC \
|
||||
-femit-bin=zig-out/bin/$(testname) \
|
||||
-fcompiler-rt \
|
||||
-lc -lc++ \
|
||||
--cache-dir /tmp/zig-cache-bun-$(testname)-$(basename $(lastword $(testfilter))) \
|
||||
-fallow-shlib-undefined \
|
||||
-L$(LIBCRYPTO_PREFIX_DIR)/lib \
|
||||
-lcrypto -lssl \
|
||||
$(ARCHIVE_FILES_WITHOUT_LIBCRYPTO) $(ICU_FLAGS) && \
|
||||
cp zig-out/bin/$(testname) $(testbinpath)
|
||||
|
||||
run-unit:
|
||||
@zig-out/bin/$(testname) -- fake
|
||||
|
||||
|
||||
test: build-unit run-unit
|
||||
|
||||
integration-test-dev:
|
||||
USE_EXISTING_PROCESS=true TEST_SERVER_URL=http://localhost:3000 node integration/scripts/browser.js
|
||||
|
||||
copy-install:
|
||||
cp src/cli/install.sh ../bun.sh/docs/install.html
|
||||
|
||||
620
README.md
620
README.md
@@ -6,6 +6,7 @@ Bun is a new:
|
||||
- JavaScript & CSS bundler
|
||||
- Development server with 60fps Hot Module Reloading (& WIP support for React Fast Refresh)
|
||||
- JavaScript Runtime Environment (powered by JavaScriptCore, what WebKit/Safari uses)
|
||||
- Task runner for package.json scripts
|
||||
|
||||
All in one fast & easy-to-use tool. Instead of 1,000 node_modules for development, you only need Bun.
|
||||
|
||||
@@ -14,18 +15,56 @@ All in one fast & easy-to-use tool. Instead of 1,000 node_modules for develo
|
||||
## Install:
|
||||
|
||||
```
|
||||
# Global install is recommended so bun appears in your $PATH
|
||||
npm install -g bun-cli
|
||||
curl -fsSL https://bun.sh/install | bash
|
||||
```
|
||||
|
||||
### Getting started
|
||||
## Benchmarks
|
||||
|
||||
**CSS**: [Bun is 14x faster](./bench/hot-module-reloading/css-stress-test) than Next.js at hot reloading CSS. TODO: compare Vite
|
||||
|
||||
**JavaScript**: TODO
|
||||
|
||||
## Using Bun as a task runner
|
||||
|
||||
Instead of waiting 170ms for your npm client to start for each task, you wait 6ms for Bun.
|
||||
|
||||
To use bun as a task runner, run `bun run` instead of `npm run`.
|
||||
|
||||
```bash
|
||||
# Instead of "npm run clean"
|
||||
bun run clean
|
||||
|
||||
# This also works
|
||||
bun clean
|
||||
```
|
||||
|
||||
Assuming a package.json with a `"clean"` command in `"scripts"`:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "myapp",
|
||||
"scripts": {
|
||||
"clean": "rm -rf dist out node_modules"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Note: `bun run` is not an npm client, it won't install packages.
|
||||
|
||||
## Using Bun with Next.js
|
||||
|
||||
In your project folder root (where `package.json` is):
|
||||
To create a new Next.js app with Bun:
|
||||
|
||||
```bash
|
||||
npm install -D bun-framework-next
|
||||
bun create next ./app
|
||||
cd app
|
||||
bun
|
||||
```
|
||||
|
||||
To use an existing Next.js app with Bun:
|
||||
|
||||
```bash
|
||||
npm install bun-framework-next
|
||||
bun bun --use next
|
||||
bun
|
||||
```
|
||||
@@ -39,7 +78,8 @@ Here's what doesn't work yet:
|
||||
- locales, zones, `assetPrefix` (workaround: change `--origin \"http://localhsot:3000/assetPrefixInhere\"`)
|
||||
- `next/image` is polyfilled to a regular `<img src>` tag.
|
||||
- `proxy` and anything else in `next.config.js`
|
||||
- API, catch-all & catch-all fallback routes. Dynamic routes _are_ supported.
|
||||
- API routes, middleware (middleware is easier to support though! similar SSR API)
|
||||
- styled-jsx (technically not Next.js but often used with it)
|
||||
|
||||
When using Next.js, Bun automatically reads configuration from `.env.local`, `.env.development` and `.env` (in that order). `process.env.NEXT_PUBLIC_` and `process.env.NEXT_` automatically are replaced via `--define`.
|
||||
|
||||
@@ -71,17 +111,24 @@ If `public/index.html` exists, it becomes the default page instead of a 404 page
|
||||
|
||||
#### Using Bun with Create React App
|
||||
|
||||
To use Bun with `create-react-app`, there are two changes you will need to make in `public/index.html`:
|
||||
|
||||
1. Replace `%PUBLIC_URL%` with `/`
|
||||
2. Insert `<script type="module" async src="/src/index.js">` just before `</body>`
|
||||
|
||||
These changes are (sadly) necessary until Bun supports parsing & transpiling HTML.
|
||||
|
||||
In your project folder root (where `package.json` is):
|
||||
To create new a React app:
|
||||
|
||||
```bash
|
||||
bun bun ./src/index.js
|
||||
bun create react ./app
|
||||
cd app
|
||||
bun
|
||||
```
|
||||
|
||||
To use an existing React app:
|
||||
|
||||
```bash
|
||||
# To enable React Fast Refresh, ensure "react-refresh" is installed
|
||||
npm install -D react-refresh
|
||||
|
||||
# Generate a bundle for your entry point(s)
|
||||
bun bun ./src/index.js # jsx, tsx, ts also work. can be multiple files
|
||||
|
||||
# Start the dev server
|
||||
bun
|
||||
```
|
||||
|
||||
@@ -125,7 +172,7 @@ Bun is a project with incredibly large scope, and it's early days.
|
||||
|
||||
| Feature | In |
|
||||
| ---------------------------------------------------------------------------------------------------------------------- | -------------- |
|
||||
| Symlinks | Resolver |
|
||||
| ~Symlinks~ | Resolver |
|
||||
| [Finish Fast Refresh](https://github.com/Jarred-Sumner/bun/issues/18) | JSX Transpiler |
|
||||
| Source Maps | JavaScript |
|
||||
| Source Maps | CSS |
|
||||
@@ -139,7 +186,6 @@ Bun is a project with incredibly large scope, and it's early days.
|
||||
| Sharing `.bun` files | Bun |
|
||||
| [Finish fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) | Bun.js |
|
||||
| [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/setTimeout) | Bun.js |
|
||||
| `bun run` command | Bun.js |
|
||||
|
||||
<sup>JS Transpiler == JavaScript Transpiler</sup><br/>
|
||||
<sup>TS Transpiler == TypeScript Transpiler</sup><br/>
|
||||
@@ -173,6 +219,9 @@ Currently, Bun implements the following loaders:
|
||||
| .ts | TypeScript + JavaScript | .js |
|
||||
| .tsx | TypeScript + JSX + JavaScript | .js |
|
||||
| .mjs | JavaScript | .js |
|
||||
| .cjs | JavaScript | .js |
|
||||
| .mts | TypeScript | .js |
|
||||
| .cts | TypeScript | .js |
|
||||
| .css | CSS | .css |
|
||||
| .env | Env | N/A |
|
||||
| .\* | file | string |
|
||||
@@ -405,12 +454,425 @@ type Router = {
|
||||
|
||||
To use a framework, you pass `bun bun --use package-name`.
|
||||
|
||||
Your framework's package.json `name` should start with `bun-framework-`. This is so that people can type something like `bun bun --use next` and it will check `bun-framework-next` first. This is similar to how Babel plugins tend to start with `babel-plugin-`.
|
||||
Your framework's `package.json` `name` should start with `bun-framework-`. This is so that people can type something like `bun bun --use next` and it will check `bun-framework-next` first. This is similar to how Babel plugins tend to start with `babel-plugin-`.
|
||||
|
||||
For developing frameworks, you can also do `bun bun --use ./relative-path-to-framework`.
|
||||
|
||||
If you're interested in adding a framework integration, please reach out. There's a lot here and it's not entirely documented yet.
|
||||
|
||||
# FAQ
|
||||
|
||||
##### When running bun on an M1 (or Apple Silicon), if you see a message like this:
|
||||
|
||||
> [1] 28447 killed bun create next ./test
|
||||
|
||||
It most likely means you're running bun's x64 version on Apple Silicon. This happens if bun is running via Rosetta. Rosetta is unable to emulate AVX2 instructions, which Bun indirectly uses.
|
||||
|
||||
The fix is to ensure you installed a version of Bun built for Apple Silicon.
|
||||
|
||||
##### error: Unexpected
|
||||
|
||||
If you see an error like this:
|
||||
|
||||

|
||||
|
||||
It usually means the max number of open file descriptors is being explicitly set to a low number. By default, Bun requests the max number of file descriptors available (which on macOS, is something like 32,000). But, if you previously ran into ulimit issues with e.g. Chokidar, someone on The Internet may have advised you to run `ulimit -n 8096`.
|
||||
|
||||
That advice unfortunately **lowers** the hard limit to `8096`. This can be a problem in large repositories or projects with lots of dependencies. Chokidar (and other watchers) don't seem to call `setrlimit`, which means they're reliant on the (much lower) soft limit.
|
||||
|
||||
To fix this issue:
|
||||
|
||||
1. Remove any scripts that call `ulimit -n` and restart your shell.
|
||||
2. Try agin, and if the error still occurs, try setting `ulimit -n` to an absurdly high number, such as `ulimit -n 65542`
|
||||
3. Try again, and if that still doesn't fix it, open an issue
|
||||
|
||||
# Reference
|
||||
|
||||
### `bun run`
|
||||
|
||||
`bun run` is a fast `package.json` scripts runner. Instead of waiting 170ms for your npm client to start every time, you wait 6ms for Bun.
|
||||
|
||||
By default, `bun run` prints the script that will be invoked:
|
||||
|
||||
```bash
|
||||
bun run clean
|
||||
$ rm -rf node_modules/.cache dist
|
||||
```
|
||||
|
||||
You can disable that with `--silent`
|
||||
|
||||
```bash
|
||||
bun run --silent clean
|
||||
```
|
||||
|
||||
To print a list of `scripts`, `bun run` without additional args:
|
||||
|
||||
```bash
|
||||
# This command
|
||||
bun run
|
||||
|
||||
# Prints this
|
||||
hello-create-react-app scripts:
|
||||
|
||||
bun run start
|
||||
react-scripts start
|
||||
|
||||
bun run build
|
||||
react-scripts build
|
||||
|
||||
bun run test
|
||||
react-scripts test
|
||||
|
||||
bun run eject
|
||||
react-scripts eject
|
||||
|
||||
4 scripts
|
||||
```
|
||||
|
||||
`bun run` automatically loads environment variables from `.env` into the shell/task. `.env` files are loaded with the same priority as the rest of Bun, so that means:
|
||||
|
||||
1. `.env.local` is first
|
||||
2. if (`$NODE_ENV` === `"production"`) `.env.production` else `.env.development`
|
||||
3. `.env`
|
||||
|
||||
If something is unexpected there, you can run `bun run env` to get a list of environment variables.
|
||||
|
||||
The default shell it uses is `bash`, but if that's not found, it tries `sh` and if still not found, it tries `zsh`. This is not configurable right now, but if you care file an issue.
|
||||
|
||||
`bun run` automatically adds any parent `node_modules/.bin` to `$PATH` and if no scripts match, it will load that binary instead. That means you can run executables from packages too.
|
||||
|
||||
```bash
|
||||
# If you use Relay
|
||||
bun run relay-compiler
|
||||
|
||||
# You can also do this, but:
|
||||
# - It will only lookup packages in `node_modules/.bin` instead of `$PATH`
|
||||
# - It will start Bun's dev server if the script name doesn't exist (`bun` starts the dev server by default)
|
||||
bun relay-compiler
|
||||
```
|
||||
|
||||
To pass additional flags through to the task or executable, there are two ways:
|
||||
|
||||
```bash
|
||||
# Explicit: include "--" and anything after will be added. This is the recommended way because it is more reliable.
|
||||
bun run relay-compiler -- -–help
|
||||
|
||||
# Implicit: if you do not include "--", anything *after* the script name will be passed through
|
||||
# Bun flags are parsed first, which means e.g. `bun run relay-compiler --help` will print Bun's help instead of relay-compiler's help.
|
||||
bun run relay-compiler --schema foo.graphql
|
||||
```
|
||||
|
||||
`bun run` supports lifecycle hooks like `post${task}` and `pre{task}`. If they exist, they will run matching the behavior of npm clients. If the `pre${task}` fails, the next task will not be run. There is currently no flag to skip these lifecycle tasks if they exist, if you want that file an issue.
|
||||
|
||||
### `bun create`
|
||||
|
||||
`bun create` is a fast way to create a new project from a template.
|
||||
|
||||
At the time of writing, `bun create react app` runs ~11x faster on my local computer than `yarn create react-app app`. `bun create` currently does no caching (though your npm client does)
|
||||
|
||||
#### Usage
|
||||
|
||||
Create a new Next.js project:
|
||||
|
||||
```bash
|
||||
bun create next ./app
|
||||
```
|
||||
|
||||
Create a new React project:
|
||||
|
||||
```bash
|
||||
bun create react ./app
|
||||
```
|
||||
|
||||
Create from a GitHub repo:
|
||||
|
||||
```bash
|
||||
bun create ahfarmer/calculator ./app
|
||||
```
|
||||
|
||||
To see a list of examples, run:
|
||||
|
||||
```bash
|
||||
bun create
|
||||
```
|
||||
|
||||
Format:
|
||||
|
||||
```bash
|
||||
bun create github-user/repo-name destination
|
||||
bun create local-example-or-remote-example destination
|
||||
bun create /absolute/path/to-template-folder destination
|
||||
bun create https://github.com/github-user/repo-name destination
|
||||
bun create github.com/github-user/repo-name destination
|
||||
```
|
||||
|
||||
Note: you don't need `bun create` to use Bun. You don't need any configuration at all. This command exists to make it a little easier.
|
||||
|
||||
##### Local templates
|
||||
|
||||
If you have your own boilerplate you prefer using, copy it into `$HOME/.bun-create/my-boilerplate-name`.
|
||||
|
||||
Before checking Bun's examples folder, `bun create` checks for a local folder matching the input in:
|
||||
|
||||
- `$BUN_CREATE_DIR/`
|
||||
- `$HOME/.bun-create/`
|
||||
- `$(pwd)/.bun-create/`
|
||||
|
||||
If a folder exists in any of those folders with the input, bun will use that instead of a remote template.
|
||||
|
||||
To create a local template, run:
|
||||
|
||||
```bash
|
||||
mkdir -p $HOME/.bun-create/new-template-name
|
||||
echo '{"name":"new-template-name"}' > $HOME/.bun-create/new-template-name/package.json
|
||||
```
|
||||
|
||||
This lets you run:
|
||||
|
||||
```bash
|
||||
bun create new-template-name ./app
|
||||
```
|
||||
|
||||
Now your new template should appear when you run:
|
||||
|
||||
```bash
|
||||
bun create
|
||||
```
|
||||
|
||||
Warning: unlike with remote templates, **bun will delete the entire destination folder if it already exists.**
|
||||
|
||||
##### Flags
|
||||
|
||||
| Flag | Description |
|
||||
| ------------ | -------------------------------------- |
|
||||
| --npm | Use `npm` for tasks & install |
|
||||
| --yarn | Use `yarn` for tasks & install |
|
||||
| --pnpm | Use `pnpm` for tasks & install |
|
||||
| --force | Overwrite existing files |
|
||||
| --no-install | Skip installing `node_modules` & tasks |
|
||||
| --no-git | Don't initialize a git repository |
|
||||
| --open | Start & open in-browser after finish |
|
||||
|
||||
| Environment Variables | Description |
|
||||
| --------------------- | ------------------------------------------------------------------------------------------------------ |
|
||||
| GITHUB_API_DOMAIN | If you're using a GitHub enterprise or a proxy, you can change what the endpoint requests to GitHub go |
|
||||
| GITHUB_API_TOKEN | This lets `bun create` work with private repositories or if you get rate-limited |
|
||||
|
||||
By default, `bun create` will cancel if there are existing files it would overwrite and its a remote template. You can pass `--force` to disable this behavior.
|
||||
|
||||
##### Publishing a new template
|
||||
|
||||
Clone this repository and a new folder in `examples/` with your new template. The `package.json` must have a `name` that starts with `@bun-examples/`. Do not worry about publishing it, that will happen automaticallly after the PR is merged.
|
||||
|
||||
Make sure to include a `.gitignore` that includes `node_modules` so that `node_modules` aren't checked in to git when people download the template.
|
||||
|
||||
##### Testing your new template
|
||||
|
||||
To test your new template, add it as a local template or pass the absolute path.
|
||||
|
||||
```bash
|
||||
bun create /path/to/my/new/template destination-dir
|
||||
```
|
||||
|
||||
Warning: **This will always delete everything in destination-dir**.
|
||||
|
||||
##### Config
|
||||
|
||||
The `bun-create` section of `package.json` is automatically removed from the `package.json` on disk. This lets you add create-only steps without waiting for an extra package to install.
|
||||
|
||||
There are currently two options:
|
||||
|
||||
- `postinstall`
|
||||
- `preinstall`
|
||||
|
||||
They can be an array of strings or one string. An array of steps will be executed in order.
|
||||
|
||||
Here is an example:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "@bun-examples/next",
|
||||
"version": "0.0.31",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"next": "11.1.2",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-is": "^17.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^17.0.19",
|
||||
"bun-framework-next": "^0.0.0-21",
|
||||
"typescript": "^4.3.5"
|
||||
},
|
||||
"bun-create": {
|
||||
"postinstall": ["bun bun --use next"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
By default, all commands run inside the environment exposed by the auto-detected npm client. This incurs a significant performance penalty, something like 150ms spent waiting for the npm client to start on each invocation.
|
||||
|
||||
Any command that starts with `"bun "` will be run without npm, relying on the first `bun` binary in `$PATH`.
|
||||
|
||||
##### How `bun create` works
|
||||
|
||||
When you run `bun create ${template} ${destination}`, here's what happens:
|
||||
|
||||
IF remote template
|
||||
|
||||
1. GET `registry.npmjs.org/@bun-examples/${template}/latest` and parse it
|
||||
2. GET `registry.npmjs.org/@bun-examples/${template}/-/${template}-${latestVersion}.tgz`
|
||||
3. Decompress & extract `${template}-${latestVersion}.tgz` into `${destination}`
|
||||
|
||||
- If there are files that would overwrite, warn and exit unless `--force` is passed
|
||||
|
||||
IF github repo
|
||||
|
||||
1. Download the tarball from GitHub's API
|
||||
2. Decompress & extract into `${destination}`
|
||||
|
||||
- If there are files that would overwrite, warn and exit unless `--force` is passed
|
||||
|
||||
ELSE IF local template
|
||||
|
||||
1. Open local template folder
|
||||
2. Delete destination directory recursively
|
||||
3. Copy files recursively using the fastest system calls available (on macOS `fcopyfile` and Linux, `copy_file_range`). Do not copy or traverse into `node_modules` folder if exists (this alone makes it faster than `cp`)
|
||||
|
||||
4. Parse the `package.json` (again!), update `name` to be `${basename(destination)}`, remove the `bun-create` section from the `package.json` and save the updated `package.json` to disk.
|
||||
- IF Next.js is detected, add `bun-framework-next` to the list of dependencies
|
||||
- IF Create React App is detected, add the entry point in /src/index.{js,jsx,ts,tsx} to `public/index.html`
|
||||
- IF Relay is detected, add `bun-macro-relay` so that Relay works
|
||||
5. Auto-detect the npm client, preferring `pnpm`, `yarn` (v1), and lastly `npm`
|
||||
6. Run any tasks defined in `"bun-create": { "preinstall" }` with the npm client
|
||||
7. Run `${npmClient} install` unless `--no-install` is passed OR no dependencies are in package.json
|
||||
8. Run any tasks defined in `"bun-create": { "preinstall" }` with the npm client
|
||||
9. Run `git init; git add -A .; git commit -am "Initial Commit";`
|
||||
|
||||
- Rename `gitignore` to `.gitignore`. NPM automatically removes `.gitignore` files from appearing in packages.
|
||||
- If there are dependencies, this runs in a separate thread concurrently while node_modules are being installed
|
||||
- Using libgit2 if available was tested and performed 3x slower in microbenchmarks
|
||||
|
||||
10. Done
|
||||
|
||||
`misctools/publish-examples.js` publishes all examples to npm.
|
||||
|
||||
### `bun bun`
|
||||
|
||||
Run `bun bun ./path-to.js` to generate a `node_modules.bun` file containing all imported dependencies (recursively).
|
||||
|
||||
**Why bundle?**
|
||||
|
||||
- For browsers, loading entire apps without bundling dependencies is typically slow. With a fast bundler & transpiler, the bottleneck eventually becomes the web browser's ability to run many network requests concurrently. There are many workarounds for this. `<link rel="modulepreload">`, HTTP/3, etc but none are more effective than bundling. If you have reproducible evidence to the contrary, feel free to submit an issue. It would be better if bundling wasn't necessary.
|
||||
- On the server, bundling reduces the number of filesystem lookups to load JavaScript. While filesystem lookups are faster than HTTP requests, there's still overhead.
|
||||
|
||||
**What is `.bun`?**
|
||||
|
||||
The `.bun` file contains:
|
||||
|
||||
- all the bundled source code
|
||||
- all the bundled source code metadata
|
||||
- project metadata & configuration
|
||||
|
||||
Here are some of the questions `.bun` files answer:
|
||||
|
||||
- when I import `react/index.js`, where in the `.bun` is the code for that? (not resolving, just the code)
|
||||
- what modules of a package are used?
|
||||
- what framework is used? (e.g. Next.js)
|
||||
- where is the routes directory?
|
||||
- how big is each imported dependency?
|
||||
- what is the hash of the bundle's contents? (for etags)
|
||||
- what is the name & version of every npm package exported in this bundle?
|
||||
- what modules from which packages are used in this project? ("project" defined as all the entry points used to generate the .bun)
|
||||
|
||||
All in one file.
|
||||
|
||||
It's a little like a build cache, but designed for reuse. I hope people will eventually check it into version control so their coworkers don't have to run `npm install` as often.
|
||||
|
||||
##### Position-independent code
|
||||
|
||||
From a design perspective, the most important part of the `.bun` format is how code is organized. Each module is exported by a hash like this:
|
||||
|
||||
```js
|
||||
// preact/dist/preact.module.js
|
||||
export var $eb6819b = $$m({
|
||||
"preact/dist/preact.module.js": (module, exports) => {
|
||||
var n, l, u, i, t, o, r, f, e = {}, c = [], s = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
|
||||
// ... rest of code
|
||||
```
|
||||
|
||||
This makes bundled modules [position-independent](https://en.wikipedia.org/wiki/Position-independent_code). In theory, one could import only the exact modules in-use without reparsing code and without generating a new bundle. One bundle can dynamically become many bundles comprising only the modules in use on the webpage. Thanks to the metadata with the byte offsets, a web server can send each module to browsers [zero-copy](https://en.wikipedia.org/wiki/Zero-copy) using [sendfile](https://man7.org/linux/man-pages/man2/sendfile.2.html). Bun itself is not quite this smart yet, but these optimizations would be useful in production and potentially very useful for React Server Components.
|
||||
|
||||
To see the schema inside, have a look at [`JavascriptBundleContainer`](./src/api/schema.d.ts#:~:text=export%20interface-,JavascriptBundleContainer,-%7B). You can find JavaScript bindings to read the metadata in [src/api/schema.js](./src/api/schema.js). This is not really an API yet. It's missing the part where it gets the binary data from the bottom of the file. Someday, I want this to be usable by other tools too.
|
||||
|
||||
**Where is the code?**
|
||||
|
||||
`.bun` files are marked as executable.
|
||||
|
||||
To print out the code, run `./node_modules.bun` in your terminal or run `bun ./path-to-node_modules.bun`.
|
||||
|
||||
Here is a copy-pastable example:
|
||||
|
||||
```bash
|
||||
./node_modules.bun > node_modules.js
|
||||
```
|
||||
|
||||
This works because every `.bun` file starts with this:
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bun
|
||||
```
|
||||
|
||||
To deploy to production with Bun, you'll want to get the code from the `.bun` file and stick that somewhere your web server can find it (or if you're using Vercel or a Rails app, in a `public` folder).
|
||||
|
||||
Note that `.bun` is a binary file format, so just opening it in VSCode or vim might render strangely.
|
||||
|
||||
**Advanced**
|
||||
|
||||
By default, `bun bun` only bundles external dependencies that are `import`ed or `require`d in either app code or another external dependency. An "external depenendency" is defined as, "A JavaScript-like file that has `/node_modules/` in the resolved file path and a corresponding `package.json`".
|
||||
|
||||
To force bun to bundle packages which are not located in a `node_modules` folder (i.e. the final, resolved path following all symlinks), add a `bun` section to the root project's `package.json` with `alwaysBundle` set to an array of package names to always bundle. Here's an example:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "my-package-name-in-here",
|
||||
"bun": {
|
||||
"alwaysBundle": ["@mybigcompany/my-workspace-package"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Bundled dependencies are not eligible for Hot Module Reloading. The code is served to browsers & Bun.js verbatim. But, in the future, it may be sectioned off into only parts of the bundle being used. That's possible in the current version of the `.bun` file (so long as you know which files are necessary), but it's not implemented yet. Longer-term, it will include all `import` and `export` of each module inside.
|
||||
|
||||
**What is the module ID hash?**
|
||||
|
||||
The `$eb6819b` hash used here:
|
||||
|
||||
```js
|
||||
export var $eb6819b = $$m({
|
||||
```
|
||||
|
||||
Is generated like this:
|
||||
|
||||
1. Murmur3 32 bit hash of `package.name@package.version`. This is the hash uniquely identifying the npm package.
|
||||
2. Wyhash 64 of the `package.hash` + `package_path`. `package_path` means "relative to the root of the npm package, where is the module imported?". For example, if you imported `react/jsx-dev-runtime.js`, the `package_path` is `jsx-dev-runtime.js`. `react-dom/cjs/react-dom.development.js` would be `cjs/react-dom.development.js`
|
||||
3. Truncate the hash generated above to a `u32`
|
||||
|
||||
The implementation details of this module ID hash will vary between versions of Bun. The important part is the metadata contains the module IDs, the package paths, and the package hashes so it shouldn't really matter in practice if other tooling wants to make use of any of this.
|
||||
|
||||
### `bun completions`
|
||||
|
||||
This command installs completions for `zsh` and/or `fish`. It's run automatically on every `bun upgrade` and on install. It reads from `$SHELL` to determine which shell to install for. It tries several common shell completion directories for your shell and OS.
|
||||
|
||||
If you want to copy the completions manually, run `bun completions > path-to-file`. If you know the completions directory to install them to, run `bun completions /path/to/directory`.
|
||||
|
||||
### Environment variables
|
||||
|
||||
- `GOMAXPROCS`: For `bun bun`, this sets the maximum number of threads to use. If you're experiencing an issue with `bun bun`, try setting `GOMAXPROCS=1` to force bun to run single-threaded
|
||||
- `DISABLE_BUN_ANALYTICS=1` this disables Bun's analytics. Bun records bundle timings (so we can answer with data, "is bun getting faster?") and feature usage (e.g. "are people actually using macros?"). The request body size is about 60 bytes, so it's not a lot of data
|
||||
- `TMPDIR`: Before `bun bun` completes, it stores the new `.bun` in `$TMPDIR`. If unset, `TMPDIR` defaults to the platform-specific temporary directory (on Linux, `/tmp` and on macOS `/private/tmp`)
|
||||
|
||||
# Credits
|
||||
|
||||
- While written in Zig instead of Go, Bun's JS transpiler, CSS lexer, and node module resolver source code is based off of @evanw's esbuild project. @evanw did a fantastic job with esbuild.
|
||||
@@ -440,6 +902,10 @@ Bun also statically links these libraries:
|
||||
- `libicu`, which can be found here: https://github.com/unicode-org/icu/blob/main/icu4c/LICENSE
|
||||
- [`picohttp`](https://github.com/h2o/picohttpparser), which is dual-licensed under the Perl License or the MIT License
|
||||
- [`mimalloc`](https://github.com/microsoft/mimalloc), which is MIT licensed
|
||||
- [`zlib-cloudflare`](https://github.com/cloudflare/zlib), which is zlib licensed
|
||||
- [`s2n-tls`](https://github.com/aws/s2n-tls), which is MIT licensed
|
||||
- [`libarchive`](https://github.com/libarchive/libarchive), which has [several licenses](https://github.com/libarchive/libarchive/blob/master/COPYING)
|
||||
- [`libiconv`](https://www.gnu.org/software/libiconv/), which is LGPL2. It's a dependency of libarchive.
|
||||
|
||||
For compatibiltiy reasons, these NPM packages are embedded into Bun's binary and injected if imported.
|
||||
|
||||
@@ -469,25 +935,129 @@ For compatibiltiy reasons, these NPM packages are embedded into Bun's binary and
|
||||
|
||||
Estimated: 30-90 minutes :(
|
||||
|
||||
## macOS
|
||||
|
||||
Install LLVM 12 and homebrew dependencies:
|
||||
|
||||
```bash
|
||||
brew install llvm@12 coreutils libtool cmake libiconv automake openssl@1.1 ninja gnu-sed pkg-config
|
||||
```
|
||||
|
||||
Bun (& the version of Zig) need LLVM 12 and Clang 12 (clang is part of LLVM). Weird build & runtime errors will happen otherwise.
|
||||
|
||||
Make sure LLVM 12 is in your `$PATH`:
|
||||
|
||||
```bash
|
||||
which clang-12
|
||||
```
|
||||
|
||||
If it is not, you will have to run this to link it:
|
||||
|
||||
```bash
|
||||
export PATH=$(brew --prefix llvm@12)/bin:$PATH
|
||||
export LDFLAGS="$LDFLAGS -L$(brew --prefix llvm@12)/lib"
|
||||
export CPPFLAGS="$CPPFLAGS -I$(brew --prefix llvm@12)/include"
|
||||
```
|
||||
|
||||
On fish that looks like `fish_add_path (brew --prefix llvm@12)/bin`
|
||||
|
||||
Compile Zig:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/jarred-sumner/zig
|
||||
cd zig
|
||||
git checkout jarred/zig-sloppy-with-small-structs
|
||||
cmake . -DCMAKE_PREFIX_PATH=$(brew --prefix llvm) -DZIG_STATIC_LLVM=ON -DCMAKE_BUILD_TYPE=Release && make -j 16
|
||||
cmake . -DCMAKE_PREFIX_PATH=$(brew --prefix llvm@12) -DZIG_STATIC_LLVM=ON -DCMAKE_BUILD_TYPE=Release && make -j 16
|
||||
```
|
||||
|
||||
Note that `brew install zig` won't work. Bun uses a build of Zig with a couple patches.
|
||||
|
||||
You'll want to make sure `zig` is in `$PATH`. The `zig` binary wil be in the same folder as the newly-cloned `zig` repo. If you use fish, you can run `fish_add_path (pwd)`.
|
||||
|
||||
In `bun`:
|
||||
|
||||
```bash
|
||||
# If you omit --depth=1, `git submodule update` will take 17.5 minutes on 1gbps internet, mostly due to WebKit.
|
||||
git submodule update --init --recursive --progress --depth=1
|
||||
make vendor
|
||||
zig build headers
|
||||
make jsc-bindings-mac
|
||||
zig build -Drelease-fast
|
||||
make vendor jsc identifier-cache dev
|
||||
```
|
||||
|
||||
Verify it worked:
|
||||
|
||||
```bash
|
||||
make test-dev-all
|
||||
```
|
||||
|
||||
Note that `brew install zig` won't work. Bun uses a build of Zig with a couple patches.
|
||||
|
||||
Additionally, you'll need `cmake`, `npm` and `esbuild` installed globally.
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
If you see an error when compiling `libarchive`, run this:
|
||||
|
||||
```bash
|
||||
brew install pkg-config
|
||||
```
|
||||
|
||||
If you see an error about missing files on `zig build obj`, make sure you built the headers
|
||||
|
||||
## Linux
|
||||
|
||||
A Dockerfile with the exact version of Zig used is availble at `Dockerfile.zig`. This installs all the system dependencies you'll need excluding JavaScriptCore, but doesn't currently compile Bun in one command. If you're having trouble compiling Zig, it might be helpful to look at.
|
||||
|
||||
Compile Zig:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/jarred-sumner/zig
|
||||
cd zig
|
||||
git checkout jarred/zig-sloppy-with-small-structs
|
||||
cmake . -DCMAKE_BUILD_TYPE=Release && make -j $(nproc)
|
||||
```
|
||||
|
||||
Compile JavaScriptCore:
|
||||
|
||||
```bash
|
||||
# This will take a few minutes, depending on how fast your internet is
|
||||
git submodule update --init --recursive --progress --depth=1
|
||||
|
||||
# This will take 10-30 minutes, depending on how many cores your CPU has
|
||||
DOCKER_BUILDKIT=1 docker build -t bun-webkit $(pwd)/src/javascript/jsc/WebKit -f $(pwd)/src/javascript/jsc/WebKit/Dockerfile --progress=plain
|
||||
docker container create bun-webkit
|
||||
|
||||
# Find the docker container ID manually. If you know a better way, please submit a PR!
|
||||
docker container ls
|
||||
|
||||
docker cp DOCKER_CONTAINER_ID_YOU_JUST_FOUND:/output $HOME/webkit-build
|
||||
```
|
||||
|
||||
Compile Bun:
|
||||
|
||||
```bash
|
||||
make vendor dev
|
||||
```
|
||||
|
||||
Verify it worked:
|
||||
|
||||
```bash
|
||||
make test-dev-all
|
||||
```
|
||||
|
||||
Run bun:
|
||||
|
||||
```bash
|
||||
packages/debug-bun-cli-darwin-x64/bin/bun-debug
|
||||
```
|
||||
|
||||
## vscode-zig
|
||||
|
||||
You will want to install the fork of `vscode-zig` so you get a `Run test` and a `Debug test` button.
|
||||
|
||||
To do that:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/jarred-sumner/vscode-zig
|
||||
cd vscode-zig
|
||||
yarn install
|
||||
yarn vsce package && code --install-extension ./zig-0.2.5.vsix
|
||||
```
|
||||
|
||||
<a target="_blank" href="https://github.com/jarred-sumner/vscode-zig"><img src="https://pbs.twimg.com/media/FBZsKHlUcAYDzm5?format=jpg&name=large"></a>
|
||||
|
||||
5
bench/hot-module-reloading/css-stress-test/.gitignore
vendored
Normal file
5
bench/hot-module-reloading/css-stress-test/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
bun
|
||||
next
|
||||
src/*.mov
|
||||
src/*.blob
|
||||
|
||||
77
bench/hot-module-reloading/css-stress-test/Makefile
Normal file
77
bench/hot-module-reloading/css-stress-test/Makefile
Normal file
@@ -0,0 +1,77 @@
|
||||
SLEEP_INTERVAL ?= 32
|
||||
SCREEN_WIDTH ?= $(shell system_profiler -json SPDisplaysDataType 2>/dev/null | jq -r '.. | objects | select(.spdisplays_main) | ._spdisplays_pixels | split(" ")[0]')
|
||||
SCREEN_HEIGHT ?= $(shell system_profiler -json SPDisplaysDataType 2>/dev/null | jq -r '.. | objects | select(.spdisplays_main) | ._spdisplays_pixels | split(" ")[2]')
|
||||
PROJECT ?= bun
|
||||
PACKAGE_NAME ?= bun-cli
|
||||
RUN_COUNT ?= 128
|
||||
ENDPOINT ?= /
|
||||
|
||||
ifeq ($(PROJECT),bun)
|
||||
PACKAGE_NAME := bun-cli
|
||||
endif
|
||||
|
||||
ifeq ($(PROJECT),next)
|
||||
PACKAGE_NAME := next
|
||||
endif
|
||||
|
||||
generate:
|
||||
@killall -9 bun next node || echo ""
|
||||
PROJECT=$(PROJECT) SCREEN_WIDTH=$(SCREEN_WIDTH) SCREEN_HEIGHT=$(SCREEN_HEIGHT) ENDPOINT=$(ENDPOINT) node browser.js
|
||||
|
||||
generate-css-in-js:
|
||||
@killall -9 bun next node || echo ""
|
||||
PROJECT=$(PROJECT) SCREEN_WIDTH=$(SCREEN_WIDTH) SCREEN_HEIGHT=$(SCREEN_HEIGHT) ENDPOINT=/css-in-js node browser.js
|
||||
loop:
|
||||
cp src/colors.css.0 src/colors.css
|
||||
sleep 3
|
||||
osascript -e 'tell application "System Events" to tell process "Chromium"' \
|
||||
-e 'set frontmost to true' \
|
||||
-e 'if windows is not {} then perform action "AXRaise" of item 1 of windows' \
|
||||
-e 'end tell'
|
||||
sleep 0.5
|
||||
cd src; zig run -Drelease-fast ../color-looper.zig -- ./colors.css:0 $(SLEEP_INTERVAL)
|
||||
cp src/colors.css.blob $(PROJECT)/colors.css.blob
|
||||
|
||||
loop-emotion:
|
||||
cp src/css-in-js-styles.0 src/css-in-js-styles.tsx
|
||||
sleep 3
|
||||
osascript -e 'tell application "System Events" to tell process "Chromium"' \
|
||||
-e 'set frontmost to true' \
|
||||
-e 'if windows is not {} then perform action "AXRaise" of item 1 of windows' \
|
||||
-e 'end tell'
|
||||
sleep 0.5
|
||||
cd src; zig run -Drelease-fast ../color-looper.emotion.zig -- ./css-in-js-styles.tsx:0 $(SLEEP_INTERVAL)
|
||||
cp src/css-in-js-styles.tsx.blob $(PROJECT)/css-in-js-styles.blob
|
||||
|
||||
process_video:
|
||||
rm -rf $(FRAMES_DIR); mkdir -p $(FRAMES_DIR); ffmpeg -i src/colors.css.mov -vf fps=120,format=gray $(FRAMES_DIR)/%d.tif
|
||||
|
||||
FRAMES_DIR ?= $(shell mkdir -p ./$(PROJECT)/frames; realpath ./$(PROJECT)/frames)
|
||||
|
||||
TIF_FILES := $(wildcard $(FRAMES_DIR)/*.tif)
|
||||
TXT_FILES := $(wildcard $(FRAMES_DIR)/*.txt)
|
||||
|
||||
OBJ_FILES := $(patsubst $(SRC_DIR)/%.tif,$(OBJ_DIR)/%.txt,$(TIF_FILES))
|
||||
TRIM_FILES := $(patsubst $(SRC_DIR)/%.txt,$(OBJ_DIR)/%.trim,$(TXT_FILES))
|
||||
|
||||
frames: $(OBJ_FILES)
|
||||
|
||||
|
||||
$(FRAMES_DIR)/%.txt: $(FRAMES_DIR)/%.tif
|
||||
tesseract -l eng $< $@
|
||||
|
||||
trim: $(TRIM_FILES) cleanup print
|
||||
|
||||
|
||||
|
||||
$(FRAMES_DIR)/%.trim: $(FRAMES_DIR)/%.txt
|
||||
(grep "Ran:" $< || echo "\n") >> $(PROJECT)/frames.all
|
||||
|
||||
cleanup:
|
||||
sed 's/^Ran: *//' $(PROJECT)/frames.all | tr -d ' ' | sort | uniq > $(PROJECT)/frames.all.clean
|
||||
|
||||
print:
|
||||
PACKAGE_NAME=$(PACKAGE_NAME) SLEEP_INTERVAL=$(SLEEP_INTERVAL) PROJECT=$(PROJECT) OUTFILE=timings/$(PACKAGE_NAME) node read-frames.js
|
||||
|
||||
print-emotion:
|
||||
PACKAGE_NAME=$(PACKAGE_NAME) SLEEP_INTERVAL=$(SLEEP_INTERVAL) PROJECT=$(PROJECT) OUTFILE=timings/emotion_$(PACKAGE_NAME) node read-frames.js
|
||||
62
bench/hot-module-reloading/css-stress-test/README.md
Normal file
62
bench/hot-module-reloading/css-stress-test/README.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# CSS Stress Test
|
||||
|
||||
This benchmarks bundler performance for CSS hot reloading.
|
||||
|
||||
## Results
|
||||
|
||||
Bun is 14x faster than Next.js at hot reloading CSS.
|
||||
|
||||
```
|
||||
Bun v0.0.34
|
||||
Saving every 16ms
|
||||
|
||||
Frame time:
|
||||
50th percentile: 22.2ms
|
||||
75th percentile: 23.9ms
|
||||
90th percentile: 25.3ms
|
||||
95th percentile: 43.6ms
|
||||
99th percentile: 49.1ms
|
||||
Rendered frames: 922 / 1024 (90%)
|
||||
```
|
||||
|
||||
```
|
||||
Next.js v11.1.2
|
||||
Saving every 16ms
|
||||
|
||||
Frame time:
|
||||
50th percentile: 312ms
|
||||
75th percentile: 337.6ms
|
||||
90th percentile: 387.7ms
|
||||
95th percentile: 446.9ms
|
||||
99th percentile: 591.7ms
|
||||
Rendered frames: 64 / 1024 (6%)
|
||||
```
|
||||
|
||||
## How it works
|
||||
|
||||
It times pixels instead of builds. `color-looper.zig` writes color updates and the timestamp to a css file, while simultaneously screen recording a non-headless Chromium instance. After it finishes, it OCRs the video frames and verifies the scanned timestamps against the actual data. This data measures (1) how long each update took from saving to disk up to the pixels visible on the screen and (2) what % of frames were rendered.
|
||||
|
||||
The intent is to be as accurate as possible. Measuring times reported client-side is simpler, but lower accuracy since those times may not correspond to pixels on the screen and do not start from when the data was written to disk (at best, they measure when the filesystem watcher detected the update, but often not that either). `color-looper.zig` must run separately from `browser.js` or the results will be innaccurate.
|
||||
|
||||
It works like this:
|
||||
|
||||
1. `browser.js` loads either Bun or Next.js and a Chromium instance opened to the correct webpage
|
||||
2. `color-looper.zig` updates [`./src/colors.css`](./src/colors.css) in a loop up to `1024` times (1024 is arbitrary), sleeping every `16`ms or `32`ms (a CLI arg you can pass it). The `var(--timestamp)` CSS variable contains the UTC timestamp with precision of milliseconds and one extra decimal point
|
||||
3. `color-looper.zig` automatically records the screen via `screencapture` (builtin on macOS) and saves it, along with a `BigUint64Array` containing all the expected timestamps. When it's done, it writes to a designated file on disk which `browser.js` picks up as the signal to close the browser.
|
||||
4. `ffmpeg` converts each frame into a black and white `.tif` file, which `tesseract` then OCRs
|
||||
5. Various cleanup scripts extract the timestamp from each of those OCR'd frames into a single file
|
||||
6. Using the OCR'd data, `./read-frames.js` calculates the 50th, 75th, 90th, 95th, and 99th percentile frame time, along with how many frames were skipped. Frame time is the metric here that matters here because that's how much time elapsed between each update. It includes the artificial sleep interval, so it will not be faster than the sleep interval.
|
||||
|
||||
The script `run.sh` runs all the commands necessary to do this work unattended. It takes awhile though. The slow part is OCR'ing all the frames.
|
||||
|
||||
To run this, you need:
|
||||
|
||||
- `zig`
|
||||
- `bun-cli`
|
||||
- `node`
|
||||
- `tesseract`
|
||||
- `screencapture` (macOS builtin)
|
||||
- `ffmpeg`
|
||||
- `puppeteer` (from the package.json)
|
||||
|
||||
You will need to run `bun bun --use next` first, with `next@11.1.2`. It will only run on macOS due to the dependencies on `screencapture`, how it detects screen resolution (so that Chromium is maximized), and how it auto-focuses Chromium (apple script)
|
||||
118
bench/hot-module-reloading/css-stress-test/browser.js
Normal file
118
bench/hot-module-reloading/css-stress-test/browser.js
Normal file
@@ -0,0 +1,118 @@
|
||||
const puppeteer = require("puppeteer");
|
||||
const http = require("http");
|
||||
const path = require("path");
|
||||
const url = require("url");
|
||||
const fs = require("fs");
|
||||
const child_process = require("child_process");
|
||||
const serverURL = process.env.TEST_SERVER_URL || "http://localhost:8080";
|
||||
|
||||
if (process.env.PROJECT === "bun") {
|
||||
const bunFlags = [`--origin=${serverURL}`].filter(Boolean);
|
||||
const bunExec = process.env.BUN_BIN || "bun";
|
||||
const bunProcess = child_process.spawn(bunExec, bunFlags, {
|
||||
cwd: process.cwd(),
|
||||
stdio: "ignore",
|
||||
env: {
|
||||
...process.env,
|
||||
DISABLE_BUN_ANALYTICS: "1",
|
||||
},
|
||||
|
||||
shell: false,
|
||||
});
|
||||
console.log("$", bunExec, bunFlags.join(" "));
|
||||
const isDebug = bunExec.endsWith("-debug");
|
||||
|
||||
// bunProcess.stderr.pipe(process.stderr);
|
||||
// bunProcess.stdout.pipe(process.stdout);
|
||||
bunProcess.once("error", (err) => {
|
||||
console.error("❌ bun error", err);
|
||||
process.exit(1);
|
||||
});
|
||||
process.on("beforeExit", () => {
|
||||
bunProcess?.kill(0);
|
||||
});
|
||||
} else if (process.env.PROJECT === "next") {
|
||||
const bunProcess = child_process.spawn(
|
||||
"./node_modules/.bin/next",
|
||||
["--port", "8080"],
|
||||
{
|
||||
cwd: process.cwd(),
|
||||
stdio: "ignore",
|
||||
env: {
|
||||
...process.env,
|
||||
},
|
||||
|
||||
shell: false,
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
const delay = new Promise((resolve, reject) => {
|
||||
const watcher = fs.watch(path.resolve(process.cwd(), "src/colors.css.blob"));
|
||||
watcher.once("change", () => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 1000);
|
||||
});
|
||||
});
|
||||
|
||||
async function main() {
|
||||
const browser = await puppeteer.launch({
|
||||
headless: false,
|
||||
waitForInitialPage: true,
|
||||
args: [
|
||||
`--window-size=${parseInt(process.env.SCREEN_WIDTH || "1024", 10) / 2},${
|
||||
parseInt(process.env.SCREEN_HEIGHT || "1024", 10) / 2
|
||||
}`,
|
||||
],
|
||||
defaultViewport: {
|
||||
width: parseInt(process.env.SCREEN_WIDTH || "1024", 10) / 2,
|
||||
height: parseInt(process.env.SCREEN_HEIGHT || "1024", 10) / 2,
|
||||
},
|
||||
});
|
||||
const promises = [];
|
||||
let allTestsPassed = true;
|
||||
|
||||
async function runPage(key) {
|
||||
var page;
|
||||
|
||||
try {
|
||||
console.log("Opening page");
|
||||
page = await browser.newPage();
|
||||
|
||||
console.log(`Navigating to "http://localhost:8080/"`);
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
await page.goto("http://localhost:8080/", { waitUntil: "load" });
|
||||
break;
|
||||
} catch (exception) {
|
||||
if (!exception.toString().includes("ERR_CONNECTION_REFUSED")) break;
|
||||
}
|
||||
}
|
||||
|
||||
await page.bringToFront();
|
||||
|
||||
await delay;
|
||||
|
||||
// runner.stdout.pipe(process.stdout);
|
||||
// runner.stderr.pipe(process.stderr);
|
||||
var didResolve = false;
|
||||
|
||||
console.log(`Completed. Done.`);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
} finally {
|
||||
await page.close();
|
||||
await browser.close();
|
||||
}
|
||||
}
|
||||
|
||||
return runPage();
|
||||
}
|
||||
|
||||
main().catch((error) =>
|
||||
setTimeout(() => {
|
||||
throw error;
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,11 @@
|
||||
SLEEP_INTERVAL=16 PROJECT=bun node read-frames.js
|
||||
bun
|
||||
--------------------------------------------------
|
||||
CSS HMR FRAME TIME
|
||||
|
||||
50th percentile: 22.2ms
|
||||
75th percentile: 23.9ms
|
||||
90th percentile: 25.3ms
|
||||
95th percentile: 43.6ms
|
||||
99th percentile: 49.1ms
|
||||
Rendered frames: 922 / 1024 (90%)
|
||||
@@ -0,0 +1,11 @@
|
||||
SLEEP_INTERVAL=24 PROJECT=bun node read-frames.js
|
||||
bun
|
||||
--------------------------------------------------
|
||||
CSS HMR FRAME TIME
|
||||
|
||||
50th percentile: 33.4ms
|
||||
75th percentile: 34.5ms
|
||||
90th percentile: 35.8ms
|
||||
95th percentile: 65.5ms
|
||||
99th percentile: 87.9ms
|
||||
Rendered frames: 937 / 1024 (92%)
|
||||
@@ -0,0 +1,11 @@
|
||||
SLEEP_INTERVAL=32 PROJECT=bun node read-frames.js
|
||||
bun
|
||||
--------------------------------------------------
|
||||
CSS HMR FRAME TIME
|
||||
|
||||
50th percentile: 40.7ms
|
||||
75th percentile: 42.3ms
|
||||
90th percentile: 43.5ms
|
||||
95th percentile: 76.4ms
|
||||
99th percentile: 118.8ms
|
||||
Rendered frames: 958 / 1024 (94%)
|
||||
@@ -0,0 +1,11 @@
|
||||
SLEEP_INTERVAL=8 PROJECT=bun node read-frames.js
|
||||
bun
|
||||
--------------------------------------------------
|
||||
CSS HMR FRAME TIME
|
||||
|
||||
50th percentile: 20ms
|
||||
75th percentile: 24.4ms
|
||||
90th percentile: 41ms
|
||||
95th percentile: 53.9ms
|
||||
99th percentile: 90.4ms
|
||||
Rendered frames: 475 / 1024 (46%)
|
||||
@@ -0,0 +1,218 @@
|
||||
const std = @import("std");
|
||||
|
||||
pub const Counter = extern struct {
|
||||
timestamp: usize,
|
||||
percent: f64,
|
||||
rotate: u32,
|
||||
color_values: [8 * 3]u32,
|
||||
};
|
||||
|
||||
const RUN_COUNT = 1024;
|
||||
|
||||
var counters: [RUN_COUNT]Counter = undefined;
|
||||
|
||||
pub const Blob = extern struct {
|
||||
run_count: u32,
|
||||
interval: u64,
|
||||
};
|
||||
|
||||
pub var all_timestamps: [RUN_COUNT + 1]usize = undefined;
|
||||
|
||||
// usage:
|
||||
// ./file-path:0 10
|
||||
// 1 2 3
|
||||
|
||||
// 1. file path
|
||||
// 2. Byte offset in file
|
||||
// 3. ms update interval
|
||||
var color_buf: [8096 + SIMULATE_LONG_FILE.len]u8 = undefined;
|
||||
|
||||
pub fn main() anyerror!void {
|
||||
var allocator = std.heap.c_allocator;
|
||||
var timer = try std.time.Timer.start();
|
||||
|
||||
var args = std.mem.span(try std.process.argsAlloc(allocator));
|
||||
|
||||
var basepath_with_colon: []u8 = args[args.len - 2];
|
||||
var basepath: []u8 = "";
|
||||
var position_str: []u8 = "";
|
||||
if (std.mem.lastIndexOfScalar(u8, basepath_with_colon, ':')) |colon| {
|
||||
basepath = basepath_with_colon[0..colon];
|
||||
position_str = basepath_with_colon[colon + 1 ..];
|
||||
}
|
||||
var position = try std.fmt.parseInt(u32, position_str, 10);
|
||||
const filepath = try std.fs.path.resolve(allocator, &.{basepath});
|
||||
var file = try std.fs.openFileAbsolute(filepath, .{ .write = true });
|
||||
var ms = @truncate(u64, (try std.fmt.parseInt(u128, args[args.len - 1], 10)) * std.time.ns_per_ms);
|
||||
std.debug.assert(ms > 0);
|
||||
// std.debug.assert(std.math.isFinite(position));
|
||||
var prng = std.rand.DefaultPrng.init(0);
|
||||
var stdout = std.io.getStdOut();
|
||||
var log = stdout.writer();
|
||||
var colors = std.mem.zeroes([4][3]u32);
|
||||
var progress_bar: f64 = 0.0;
|
||||
var destination_count: f64 = 18.0;
|
||||
|
||||
// Randomize initial colors
|
||||
colors[0][0] = prng.random.int(u32);
|
||||
colors[0][1] = prng.random.int(u32);
|
||||
colors[0][2] = prng.random.int(u32);
|
||||
|
||||
colors[1][0] = prng.random.int(u32);
|
||||
colors[1][1] = prng.random.int(u32);
|
||||
colors[1][2] = prng.random.int(u32);
|
||||
|
||||
colors[2][0] = prng.random.int(u32);
|
||||
colors[2][1] = prng.random.int(u32);
|
||||
colors[2][2] = prng.random.int(u32);
|
||||
|
||||
colors[3][0] = prng.random.int(u32);
|
||||
colors[3][1] = prng.random.int(u32);
|
||||
colors[3][2] = prng.random.int(u32);
|
||||
var rotate: u32 = 0;
|
||||
var counter: usize = 0;
|
||||
const video = std.fmt.allocPrint(allocator, "{s}.mov", .{filepath}) catch unreachable;
|
||||
std.fs.deleteFileAbsolute(video) catch {};
|
||||
var screen_recorder_argv = [_][]const u8{ "screencapture", "-v", video };
|
||||
|
||||
var recorder = try std.ChildProcess.init(&screen_recorder_argv, allocator);
|
||||
recorder.stdin_behavior = .Pipe;
|
||||
try recorder.spawn();
|
||||
std.time.sleep(std.time.ns_per_s);
|
||||
var wrote: []u8 = undefined;
|
||||
while (counter < RUN_COUNT) {
|
||||
colors[0][0] += 1;
|
||||
colors[0][1] += 1;
|
||||
colors[0][2] += 1;
|
||||
colors[1][0] += 1;
|
||||
colors[1][1] += 1;
|
||||
colors[1][2] += 1;
|
||||
colors[2][0] += 1;
|
||||
colors[2][1] += 1;
|
||||
colors[2][2] += 1;
|
||||
colors[3][0] += 1;
|
||||
colors[3][1] += 1;
|
||||
colors[3][2] += 1;
|
||||
rotate += 1;
|
||||
const fmtd: []const u8 = comptime brk: {
|
||||
break :brk (
|
||||
\\
|
||||
\\import {{ Global }} from "@emotion/react";
|
||||
\\export function CSSInJSStyles() {{
|
||||
\\ return (
|
||||
\\ <Global
|
||||
\\ styles={{`
|
||||
\\:root {{
|
||||
\\ --timestamp: "{d}";
|
||||
\\ --interval: "{s}";
|
||||
\\ --progress-bar: {d}%;
|
||||
\\ --spinner-1-muted: rgb({d}, {d}, {d});
|
||||
\\ --spinner-1-primary: rgb({d}, {d}, {d});
|
||||
\\ --spinner-2-muted: rgb({d}, {d}, {d});
|
||||
\\ --spinner-2-primary: rgb({d}, {d}, {d});
|
||||
\\ --spinner-3-muted: rgb({d}, {d}, {d});
|
||||
\\ --spinner-3-primary: rgb({d}, {d}, {d});
|
||||
\\ --spinner-4-muted: rgb({d}, {d}, {d});
|
||||
\\ --spinner-4-primary: rgb({d}, {d}, {d});
|
||||
\\ --spinner-rotate: {d}deg;
|
||||
\\}}
|
||||
++ SIMULATE_LONG_FILE ++
|
||||
\\ `}}
|
||||
\\ />
|
||||
\\ );
|
||||
\\}}
|
||||
\\
|
||||
);
|
||||
};
|
||||
|
||||
counters[counter].timestamp = @truncate(u64, @intCast(u128, std.time.nanoTimestamp()) / (std.time.ns_per_ms / 10));
|
||||
counters[counter].rotate = rotate % 360;
|
||||
counters[counter].percent = std.math.mod(f64, std.math.round(((progress_bar + 1.0) / destination_count) * 1000) / 1000, 100) catch 0;
|
||||
counters[counter].color_values[0] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[0][0] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[1] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[0][1] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[2] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[0][2] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[3] = (colors[0][0] + 1) % 256;
|
||||
counters[counter].color_values[4] = (colors[0][1] + 1) % 256;
|
||||
counters[counter].color_values[5] = (colors[0][2] + 1) % 256;
|
||||
counters[counter].color_values[6] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[1][0] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[7] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[1][1] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[8] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[1][2] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[9] = (colors[1][0] + 1) % 256;
|
||||
counters[counter].color_values[10] = (colors[1][1] + 1) % 256;
|
||||
counters[counter].color_values[11] = (colors[1][2] + 1) % 256;
|
||||
counters[counter].color_values[12] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[2][0] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[13] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[2][1] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[14] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[2][2] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[15] = (colors[2][0] + 1) % 256;
|
||||
counters[counter].color_values[16] = (colors[2][1] + 1) % 256;
|
||||
counters[counter].color_values[17] = (colors[2][2] + 1) % 256;
|
||||
counters[counter].color_values[18] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[3][0] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[19] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[3][1] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[20] = @floatToInt(u32, std.math.round(@intToFloat(f64, ((colors[3][2] + 1) % 256)) * 0.8));
|
||||
counters[counter].color_values[21] = (colors[3][0] + 1) % 256;
|
||||
counters[counter].color_values[22] = (colors[3][1] + 1) % 256;
|
||||
counters[counter].color_values[23] = (colors[3][2] + 1) % 256;
|
||||
|
||||
file = try std.fs.createFileAbsolute(filepath, .{ .truncate = true });
|
||||
wrote = try std.fmt.bufPrint(&color_buf, fmtd, .{
|
||||
counters[counter].timestamp,
|
||||
args[args.len - 1],
|
||||
counters[counter].percent,
|
||||
counters[counter].color_values[0],
|
||||
counters[counter].color_values[1],
|
||||
counters[counter].color_values[2],
|
||||
counters[counter].color_values[3],
|
||||
counters[counter].color_values[4],
|
||||
counters[counter].color_values[5],
|
||||
counters[counter].color_values[6],
|
||||
counters[counter].color_values[7],
|
||||
counters[counter].color_values[8],
|
||||
counters[counter].color_values[9],
|
||||
counters[counter].color_values[10],
|
||||
counters[counter].color_values[11],
|
||||
counters[counter].color_values[12],
|
||||
counters[counter].color_values[13],
|
||||
counters[counter].color_values[14],
|
||||
counters[counter].color_values[15],
|
||||
counters[counter].color_values[16],
|
||||
counters[counter].color_values[17],
|
||||
counters[counter].color_values[18],
|
||||
counters[counter].color_values[19],
|
||||
counters[counter].color_values[20],
|
||||
counters[counter].color_values[21],
|
||||
counters[counter].color_values[22],
|
||||
counters[counter].color_values[23],
|
||||
counters[counter].rotate,
|
||||
});
|
||||
progress_bar += 1.0;
|
||||
_ = try file.writeAll(wrote);
|
||||
|
||||
try log.print("[{d}] \"{s}\":{d}\n", .{
|
||||
std.time.nanoTimestamp(),
|
||||
filepath,
|
||||
position,
|
||||
});
|
||||
counter += 1;
|
||||
// If we don't close the file, Parcel seems to never recognize it
|
||||
file.close();
|
||||
std.time.sleep(ms);
|
||||
}
|
||||
|
||||
try recorder.stdin.?.writeAll(&[_]u8{ 3, ';' });
|
||||
|
||||
_ = try recorder.wait();
|
||||
|
||||
all_timestamps[0] = wrote.len;
|
||||
for (counters) |count, i| {
|
||||
all_timestamps[i + 1] = count.timestamp;
|
||||
}
|
||||
|
||||
std.time.sleep(std.time.ns_per_s);
|
||||
var blob_file = try std.fs.createFileAbsolute(std.fmt.allocPrint(std.heap.c_allocator, "{s}.blob", .{filepath}) catch unreachable, .{ .truncate = true });
|
||||
try blob_file.writeAll(std.mem.asBytes(&all_timestamps));
|
||||
blob_file.close();
|
||||
}
|
||||
|
||||
const SIMULATE_LONG_FILE =
|
||||
\\
|
||||
;
|
||||
7194
bench/hot-module-reloading/css-stress-test/color-looper.zig
Normal file
7194
bench/hot-module-reloading/css-stress-test/color-looper.zig
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
experimental: {
|
||||
swcLoader: true,
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,11 @@
|
||||
SLEEP_INTERVAL=16 PROJECT=next node read-frames.js
|
||||
next
|
||||
--------------------------------------------------
|
||||
CSS HMR FRAME TIME
|
||||
|
||||
50th percentile: 312ms
|
||||
75th percentile: 337.6ms
|
||||
90th percentile: 387.7ms
|
||||
95th percentile: 446.9ms
|
||||
99th percentile: 591.7ms
|
||||
Rendered frames: 64 / 1024 (6%)
|
||||
@@ -0,0 +1,11 @@
|
||||
SLEEP_INTERVAL=24 PROJECT=next node read-frames.js
|
||||
next
|
||||
--------------------------------------------------
|
||||
CSS HMR FRAME TIME
|
||||
|
||||
50th percentile: 310.1ms
|
||||
75th percentile: 360.3ms
|
||||
90th percentile: 461.6ms
|
||||
95th percentile: 660.4ms
|
||||
99th percentile: 1009.9ms
|
||||
Rendered frames: 78 / 1024 (8%)
|
||||
@@ -0,0 +1,11 @@
|
||||
SLEEP_INTERVAL=32 PROJECT=next node read-frames.js
|
||||
next
|
||||
--------------------------------------------------
|
||||
CSS HMR FRAME TIME
|
||||
|
||||
50th percentile: 306.7ms
|
||||
75th percentile: 324.7ms
|
||||
90th percentile: 380ms
|
||||
95th percentile: 483.6ms
|
||||
99th percentile: 933.6ms
|
||||
Rendered frames: 116 / 1024 (11%)
|
||||
@@ -0,0 +1,11 @@
|
||||
SLEEP_INTERVAL=8 PROJECT=next node read-frames.js
|
||||
next
|
||||
--------------------------------------------------
|
||||
CSS HMR FRAME TIME
|
||||
|
||||
50th percentile: 320.4ms
|
||||
75th percentile: 368.8ms
|
||||
90th percentile: 527.2ms
|
||||
95th percentile: 532.4ms
|
||||
99th percentile: 532.4ms
|
||||
Rendered frames: 32 / 1024 (3%)
|
||||
@@ -3,13 +3,19 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@emotion/core": "^11.0.0",
|
||||
"@emotion/css": "^11.1.3",
|
||||
"@emotion/react": "^11.4.1",
|
||||
"@vitejs/plugin-react-refresh": "^1.3.3",
|
||||
"antd": "^4.16.1",
|
||||
"bun-framework-next": "^0.0.0-21",
|
||||
"left-pad": "^1.3.0",
|
||||
"next": "^11.0.1",
|
||||
"next": "canary",
|
||||
"parcel": "2.0.0-beta.3",
|
||||
"path-browserify": "^1.0.1",
|
||||
"percentile": "^1.5.0",
|
||||
"puppeteer": "^10.4.0",
|
||||
"puppeteer-video-recorder": "^1.0.5",
|
||||
"react": "^17.0.2",
|
||||
"react-bootstrap": "^1.6.1",
|
||||
"react-dom": "^17.0.2",
|
||||
@@ -32,6 +38,7 @@
|
||||
"devDependencies": {
|
||||
"@microsoft/fetch-event-source": "^2.0.1",
|
||||
"@snowpack/plugin-react-refresh": "^2.5.0",
|
||||
"bun-cli": "^0.0.34",
|
||||
"typescript": "^4.3.4"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
// import "../src/index.css";
|
||||
import "../src/index.css";
|
||||
|
||||
import App from "next/app";
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
import { CSSInJSStyles } from "src/css-in-js-styles";
|
||||
import { Main } from "src/main";
|
||||
export function CSSInJS() {
|
||||
return (
|
||||
<>
|
||||
<CSSInJSStyles />
|
||||
<Main
|
||||
productName={
|
||||
typeof location !== "undefined"
|
||||
? decodeURIComponent(location.search.substring(1))
|
||||
: ""
|
||||
}
|
||||
cssInJS="Emotion"
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export default CSSInJS;
|
||||
12
bench/hot-module-reloading/css-stress-test/pages/index.tsx
Normal file
12
bench/hot-module-reloading/css-stress-test/pages/index.tsx
Normal file
@@ -0,0 +1,12 @@
|
||||
import { Main } from "src/main";
|
||||
export function IndexPage() {
|
||||
return (
|
||||
<Main
|
||||
productName={
|
||||
typeof location !== "undefined" ? location.search.substring(1) : ""
|
||||
}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export default IndexPage;
|
||||
107
bench/hot-module-reloading/css-stress-test/read-frames.js
Normal file
107
bench/hot-module-reloading/css-stress-test/read-frames.js
Normal file
@@ -0,0 +1,107 @@
|
||||
const fs = require("fs");
|
||||
|
||||
const path = require("path");
|
||||
const PROJECT = process.env.PROJECT || "bun";
|
||||
const percentile = require("percentile");
|
||||
const PACKAGE_NAME = process.env.PACKAGE_NAME;
|
||||
const label = `${PACKAGE_NAME}@${
|
||||
require(PACKAGE_NAME + "/package.json").version
|
||||
}`;
|
||||
|
||||
const BASEFOLDER = path.resolve(PROJECT);
|
||||
const OUTFILE = path.join(process.cwd(), process.env.OUTFILE);
|
||||
|
||||
const buf = fs.readFileSync(BASEFOLDER + "/colors.css.blob");
|
||||
const VALID_TIMES = new BigUint64Array(buf.buffer).subarray(1);
|
||||
const cssFileSize = new BigUint64Array(buf.buffer)[0];
|
||||
|
||||
const TOTAL_FRAMES = VALID_TIMES.length;
|
||||
|
||||
const timings = fs
|
||||
.readFileSync(BASEFOLDER + "/frames.all.clean", "utf8")
|
||||
.split("\n")
|
||||
.map((a) => a.replace(/[Ran:'\.]?/gm, "").trim())
|
||||
.filter((a) => parseInt(a, 10))
|
||||
.filter((a) => a.length > 0 && VALID_TIMES.includes(BigInt(parseInt(a, 10))))
|
||||
.map((num) => BigInt(num));
|
||||
|
||||
timings.sort();
|
||||
|
||||
const frameTimesCount = timings.length;
|
||||
|
||||
var frameTime = new Array(Math.floor(frameTimesCount / 2));
|
||||
|
||||
for (let i = 0; i < frameTime.length; i++) {
|
||||
const i1 = i * 2;
|
||||
const i2 = i * 2 + 1;
|
||||
|
||||
frameTime[i] = Math.max(Number(timings[i2] - timings[i1]), 0);
|
||||
}
|
||||
|
||||
const report = {
|
||||
label,
|
||||
cssFileSize: Number(cssFileSize),
|
||||
at: new Date().toISOString(),
|
||||
sleep: process.env.SLEEP_INTERVAL,
|
||||
package: {
|
||||
name: PACKAGE_NAME,
|
||||
version: require(PACKAGE_NAME + "/package.json").version,
|
||||
},
|
||||
timestamps: timings.map((a) => Number(a)),
|
||||
frameTimes: frameTime,
|
||||
percentileMs: {
|
||||
50: percentile(50, frameTime) / 10,
|
||||
75: percentile(75, frameTime) / 10,
|
||||
90: percentile(90, frameTime) / 10,
|
||||
95: percentile(95, frameTime) / 10,
|
||||
99: percentile(99, frameTime) / 10,
|
||||
},
|
||||
};
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(
|
||||
path.dirname(OUTFILE),
|
||||
path.basename(OUTFILE) +
|
||||
"@" +
|
||||
report.package.version +
|
||||
"." +
|
||||
process.env.SLEEP_INTERVAL +
|
||||
"ms." +
|
||||
`${process.platform}-${
|
||||
process.arch === "arm64" ? "aarch64" : process.arch
|
||||
}` +
|
||||
".json"
|
||||
),
|
||||
JSON.stringify(report, null, 2)
|
||||
);
|
||||
|
||||
console.log(
|
||||
label + "\n",
|
||||
"-".repeat(50) + "\n",
|
||||
"CSS HMR FRAME TIME\n" + "\n",
|
||||
|
||||
"50th percentile:",
|
||||
percentile(50, frameTime) / 10 + "ms",
|
||||
"\n",
|
||||
"75th percentile:",
|
||||
percentile(75, frameTime) / 10 + "ms",
|
||||
"\n",
|
||||
"90th percentile:",
|
||||
percentile(90, frameTime) / 10 + "ms",
|
||||
"\n",
|
||||
"95th percentile:",
|
||||
percentile(95, frameTime) / 10 + "ms",
|
||||
"\n",
|
||||
"99th percentile:",
|
||||
percentile(99, frameTime) / 10 + "ms",
|
||||
"\n",
|
||||
"Rendered frames:",
|
||||
timings.length,
|
||||
"/",
|
||||
TOTAL_FRAMES,
|
||||
"(" +
|
||||
Math.round(
|
||||
Math.max(Math.min(1.0, timings.length / TOTAL_FRAMES), 0) * 100
|
||||
) +
|
||||
"%)"
|
||||
);
|
||||
83
bench/hot-module-reloading/css-stress-test/run.sh
Normal file
83
bench/hot-module-reloading/css-stress-test/run.sh
Normal file
@@ -0,0 +1,83 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "Running next at 24ms"
|
||||
PROJECT=next SLEEP_INTERVAL=24 make generate &
|
||||
PROJECT=next SLEEP_INTERVAL=24 make loop
|
||||
killall Chromium || echo "";
|
||||
PROJECT=next SLEEP_INTERVAL=24 make process_video
|
||||
PROJECT=next SLEEP_INTERVAL=24 make frames -j$(nproc)
|
||||
PROJECT=next SLEEP_INTERVAL=24 make trim
|
||||
cp src/colors.css.blob next/colors.css.blob
|
||||
PROJECT=next SLEEP_INTERVAL=24 make print > "next.latest.24ms.txt"
|
||||
|
||||
echo "Running bun at 24ms"
|
||||
PROJECT=bun SLEEP_INTERVAL=24 make generate &
|
||||
PROJECT=bun SLEEP_INTERVAL=24 make loop
|
||||
killall Chromium || echo "";
|
||||
PROJECT=bun SLEEP_INTERVAL=24 make process_video
|
||||
PROJECT=bun SLEEP_INTERVAL=24 make frames -j$(nproc)
|
||||
PROJECT=bun SLEEP_INTERVAL=24 make trim
|
||||
cp src/colors.css.blob bun/colors.css.blob
|
||||
PROJECT=bun SLEEP_INTERVAL=24 make print > "bun.latest.24ms.txt"
|
||||
|
||||
echo "Running next at 16ms"
|
||||
PROJECT=next SLEEP_INTERVAL=16 make generate &
|
||||
PROJECT=next SLEEP_INTERVAL=16 make loop
|
||||
killall Chromium || echo "";
|
||||
PROJECT=next SLEEP_INTERVAL=16 make process_video
|
||||
PROJECT=next SLEEP_INTERVAL=16 make frames -j$(nproc)
|
||||
PROJECT=next SLEEP_INTERVAL=16 make trim
|
||||
cp src/colors.css.blob next/colors.css.blob
|
||||
PROJECT=next SLEEP_INTERVAL=16 make print > "next.latest.16ms.txt"
|
||||
|
||||
echo "Running bun at 16ms"
|
||||
PROJECT=bun SLEEP_INTERVAL=16 make generate &
|
||||
PROJECT=bun SLEEP_INTERVAL=16 make loop
|
||||
killall Chromium || echo "";
|
||||
PROJECT=bun SLEEP_INTERVAL=16 make process_video
|
||||
PROJECT=bun SLEEP_INTERVAL=16 make frames -j$(nproc)
|
||||
PROJECT=bun SLEEP_INTERVAL=16 make trim
|
||||
cp src/colors.css.blob bun/colors.css.blob
|
||||
PROJECT=bun SLEEP_INTERVAL=16 make print > "bun.latest.16ms.txt"
|
||||
|
||||
echo "Running bun at 8ms"
|
||||
PROJECT=bun SLEEP_INTERVAL=8 make generate &
|
||||
PROJECT=bun SLEEP_INTERVAL=8 make loop
|
||||
killall Chromium || echo "";
|
||||
PROJECT=bun SLEEP_INTERVAL=8 make process_video
|
||||
PROJECT=bun SLEEP_INTERVAL=8 make frames -j$(nproc)
|
||||
PROJECT=bun SLEEP_INTERVAL=8 make trim
|
||||
cp src/colors.css.blob bun/colors.css.blob
|
||||
PROJECT=bun SLEEP_INTERVAL=8 make print > "bun.latest.8ms.txt"
|
||||
|
||||
|
||||
echo "Running next at 8ms"
|
||||
PROJECT=next SLEEP_INTERVAL=8 make generate &
|
||||
PROJECT=next SLEEP_INTERVAL=8 make loop
|
||||
killall Chromium || echo "";
|
||||
PROJECT=next SLEEP_INTERVAL=8 make process_video
|
||||
PROJECT=next SLEEP_INTERVAL=8 make frames -j$(nproc)
|
||||
PROJECT=next SLEEP_INTERVAL=8 make trim
|
||||
cp src/colors.css.blob next/colors.css.blob
|
||||
PROJECT=next SLEEP_INTERVAL=8 make print > "next.latest.8ms.txt"
|
||||
|
||||
echo "Running bun at 32ms"
|
||||
PROJECT=bun SLEEP_INTERVAL=32 make generate &
|
||||
PROJECT=bun SLEEP_INTERVAL=32 make loop
|
||||
killall Chromium || echo "";
|
||||
PROJECT=bun SLEEP_INTERVAL=32 make process_video
|
||||
PROJECT=bun SLEEP_INTERVAL=32 make frames -j$(nproc)
|
||||
PROJECT=bun SLEEP_INTERVAL=32 make trim
|
||||
cp src/colors.css.blob bun/colors.css.blob
|
||||
PROJECT=bun SLEEP_INTERVAL=32 make print > "bun.latest.32ms.txt"
|
||||
|
||||
echo "Running next at 32ms"
|
||||
PROJECT=next SLEEP_INTERVAL=32 make generate &
|
||||
PROJECT=next SLEEP_INTERVAL=32 make loop
|
||||
killall Chromium || echo "";
|
||||
PROJECT=next SLEEP_INTERVAL=32 make process_video
|
||||
PROJECT=next SLEEP_INTERVAL=32 make frames -j$(nproc)
|
||||
PROJECT=next SLEEP_INTERVAL=32 make trim
|
||||
cp src/colors.css.blob next/colors.css.blob
|
||||
PROJECT=next SLEEP_INTERVAL=32 make print > "next.latest.32ms.txt"
|
||||
|
||||
13889
bench/hot-module-reloading/css-stress-test/src/colors.css
Normal file
13889
bench/hot-module-reloading/css-stress-test/src/colors.css
Normal file
File diff suppressed because it is too large
Load Diff
14
bench/hot-module-reloading/css-stress-test/src/colors.css.0
Normal file
14
bench/hot-module-reloading/css-stress-test/src/colors.css.0
Normal file
@@ -0,0 +1,14 @@
|
||||
:root {
|
||||
--timestamp: "0";
|
||||
--interval: "8";
|
||||
--progress-bar: 0%;
|
||||
--spinner-1-muted: rgb(179, 6, 202);
|
||||
--spinner-1-primary: rgb(224, 8, 253);
|
||||
--spinner-2-muted: rgb(22, 188, 124);
|
||||
--spinner-2-primary: rgb(27, 235, 155);
|
||||
--spinner-3-muted: rgb(89, 72, 0);
|
||||
--spinner-3-primary: rgb(111, 90, 0);
|
||||
--spinner-4-muted: rgb(18, 84, 202);
|
||||
--spinner-4-primary: rgb(23, 105, 253);
|
||||
--spinner-rotate: 304deg;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import { Global } from "@emotion/react";
|
||||
export function CSSInJSStyles() {
|
||||
return (
|
||||
<Global
|
||||
styles={`
|
||||
:root {
|
||||
--timestamp: "0";
|
||||
--interval: "8";
|
||||
--progress-bar: 11.83299999999997%;
|
||||
--spinner-1-muted: rgb(142, 6, 182);
|
||||
--spinner-1-primary: rgb(177, 8, 227);
|
||||
--spinner-2-muted: rgb(110, 148, 190);
|
||||
--spinner-2-primary: rgb(138, 185, 238);
|
||||
--spinner-3-muted: rgb(75, 45, 64);
|
||||
--spinner-3-primary: rgb(94, 56, 80);
|
||||
--spinner-4-muted: rgb(155, 129, 108);
|
||||
--spinner-4-primary: rgb(194, 161, 135);
|
||||
--spinner-rotate: 213deg;
|
||||
}
|
||||
`}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
|
||||
import { Global } from "@emotion/react";
|
||||
export function CSSInJSStyles() {
|
||||
return (
|
||||
<Global
|
||||
styles={`
|
||||
:root {
|
||||
--timestamp: "16336621338281";
|
||||
--interval: "16";
|
||||
--progress-bar: 56.889%;
|
||||
--spinner-1-muted: rgb(179, 6, 202);
|
||||
--spinner-1-primary: rgb(224, 8, 253);
|
||||
--spinner-2-muted: rgb(22, 188, 124);
|
||||
--spinner-2-primary: rgb(27, 235, 155);
|
||||
--spinner-3-muted: rgb(89, 72, 0);
|
||||
--spinner-3-primary: rgb(111, 90, 0);
|
||||
--spinner-4-muted: rgb(18, 84, 202);
|
||||
--spinner-4-primary: rgb(23, 105, 253);
|
||||
--spinner-rotate: 304deg;
|
||||
} `}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -112,15 +112,26 @@ section {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.ran,
|
||||
.timer {
|
||||
font-weight: normal;
|
||||
white-space: nowrap;
|
||||
font-weight: bold;
|
||||
-webkit-text-stroke: white;
|
||||
-webkit-text-stroke-width: 2px;
|
||||
color: white;
|
||||
font-size: 100px;
|
||||
}
|
||||
.ran {
|
||||
}
|
||||
|
||||
.ProgressBar-container {
|
||||
width: 100%;
|
||||
display: block;
|
||||
position: relative;
|
||||
border: 1px solid var(--color-brand-muted);
|
||||
border-left: 10px solid red;
|
||||
border-right: 10px solid pink;
|
||||
border-top: 10px solid yellow;
|
||||
border-bottom: 10px solid orange;
|
||||
border-radius: 4px;
|
||||
|
||||
height: 92px;
|
||||
@@ -7,7 +7,7 @@ const Base = ({}) => {
|
||||
typeof location !== "undefined"
|
||||
? decodeURIComponent(location.search.substring(1))
|
||||
: null;
|
||||
return <Main productName={name || "asdasdasdasdasdasd"} />;
|
||||
return <Main productName={name} />;
|
||||
};
|
||||
|
||||
function startReact() {
|
||||
@@ -1,17 +1,17 @@
|
||||
export const Main = ({ productName }) => {
|
||||
export const Main = ({ productName, cssInJS }) => {
|
||||
return (
|
||||
<>
|
||||
<header>
|
||||
<div className="Title">CSS HMR Stress Test!</div>
|
||||
<p className="Description">
|
||||
This page visually tests how quickly a bundler can update CSS over Hot
|
||||
Module Reloading.
|
||||
This page visually tests how quickly a bundler can update{" "}
|
||||
{cssInJS ? "CSS-in-JS" : "CSS"} over Hot Module Reloading.
|
||||
</p>
|
||||
</header>
|
||||
<main className="main">
|
||||
<section className="ProgressSection">
|
||||
<p className="Subtitle">
|
||||
<span className="Subtitle-part">
|
||||
<span className="Subtitle-part ran">
|
||||
Ran: <span className="timer"></span>
|
||||
</span>
|
||||
</p>
|
||||
@@ -55,10 +55,7 @@ export const Main = ({ productName }) => {
|
||||
<div className="Bundler-container">
|
||||
<div className="Bundler">{productName}</div>
|
||||
<div className="Bundler-updateRate">
|
||||
{/* This should loose all the styles
|
||||
<span className="highlight">
|
||||
<span className="interval"></span>ms
|
||||
</span> */}
|
||||
{cssInJS ? "CSS-in-JS framework: " + cssInJS : ""}
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
@@ -0,0 +1,292 @@
|
||||
{
|
||||
"label": "bun-cli@0.0.34",
|
||||
"at": "2021-10-08T01:01:18.129Z",
|
||||
"sleep": "32",
|
||||
"package": {
|
||||
"name": "bun-cli",
|
||||
"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
|
||||
],
|
||||
"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
|
||||
],
|
||||
"percentileMs": {
|
||||
"50": 40.7,
|
||||
"75": 42.3,
|
||||
"90": 43.5,
|
||||
"95": 76.4,
|
||||
"99": 118.8
|
||||
}
|
||||
}
|
||||
15
bench/hot-module-reloading/readme.md
Normal file
15
bench/hot-module-reloading/readme.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Benchmarking hot module reloading
|
||||
|
||||
## Methodology
|
||||
|
||||
How do you benchmark hot module reloading? What do you call "done" and what do you call "start"?
|
||||
|
||||
The answer for "done" is certainly not compilation time. Compilation time is one step.
|
||||
|
||||
I think the answer should be different depending on the type of content loaded.
|
||||
|
||||
For CSS, the answer should be "when the updated stylesheet was drawn on the screen"
|
||||
For JavaScript, the answer should be "when the rebuilt code completed execution such that any changes are applied"
|
||||
For images & assets, the answer should be "when the updated asset finished loading"
|
||||
|
||||
The start time should be defined as "the timestamp the filesystem set as the write time". As in, the time the developer pressed save in their editor.
|
||||
306
build.zig
306
build.zig
@@ -1,17 +1,11 @@
|
||||
const std = @import("std");
|
||||
const resolve_path = @import("./src/resolver/resolve_path.zig");
|
||||
|
||||
pub fn addPicoHTTP(step: *std.build.LibExeObjStep, comptime with_obj: bool) void {
|
||||
const picohttp = step.addPackage(.{
|
||||
.name = "picohttp",
|
||||
.path = .{ .path = "src/deps/picohttp.zig" },
|
||||
});
|
||||
|
||||
_ = step.addPackage(.{
|
||||
.name = "iguanaTLS",
|
||||
.path = .{ .path = "src/deps/iguanaTLS/src/main.zig" },
|
||||
});
|
||||
|
||||
step.addIncludeDir("src/deps");
|
||||
|
||||
if (with_obj) {
|
||||
@@ -24,13 +18,25 @@ pub fn addPicoHTTP(step: *std.build.LibExeObjStep, comptime with_obj: bool) void
|
||||
// set -gx ICU_INCLUDE_DIRS "/usr/local/opt/icu4c/include"
|
||||
// homebrew-provided icu4c
|
||||
}
|
||||
|
||||
fn panicIfNotFound(comptime filepath: []const u8) []const u8 {
|
||||
var file = std.fs.cwd().openFile(filepath, .{ .read = true }) catch |err| {
|
||||
const linux_only = "\nOn Linux, you'll need to compile libiconv manually and copy the .a file into src/deps.";
|
||||
|
||||
std.debug.panic("error: {s} opening {s}. Please ensure you've downloaded git submodules, and ran `make vendor`, `make jsc`." ++ linux_only, .{ filepath, @errorName(err) });
|
||||
};
|
||||
file.close();
|
||||
|
||||
return filepath;
|
||||
}
|
||||
|
||||
var x64 = "x64";
|
||||
pub fn build(b: *std.build.Builder) !void {
|
||||
// Standard target options allows the person running `zig build` to choose
|
||||
// what target to build for. Here we do not override the defaults, which
|
||||
// means any target is allowed, and the default is native. Other options
|
||||
// for restricting supported target set are available.
|
||||
const target = b.standardTargetOptions(.{});
|
||||
var target = b.standardTargetOptions(.{});
|
||||
// Standard release options allow the person running `zig build` to select
|
||||
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
|
||||
const mode = b.standardReleaseOptions();
|
||||
@@ -39,12 +45,20 @@ pub fn build(b: *std.build.Builder) !void {
|
||||
const cwd: []const u8 = b.pathFromRoot(".");
|
||||
var exe: *std.build.LibExeObjStep = undefined;
|
||||
var output_dir_buf = std.mem.zeroes([4096]u8);
|
||||
var bin_label = if (mode == std.builtin.Mode.Debug) "packages/debug-bun-cli-" else "packages/bun-cli-";
|
||||
var bin_label = if (mode == std.builtin.Mode.Debug) "packages/debug-bun-" else "packages/bun-";
|
||||
|
||||
var triplet_buf: [64]u8 = undefined;
|
||||
var os_tagname = @tagName(target.getOs().tag);
|
||||
|
||||
const arch: std.Target.Cpu.Arch = target.getCpuArch();
|
||||
|
||||
if (std.mem.eql(u8, os_tagname, "macos")) {
|
||||
os_tagname = "darwin";
|
||||
if (arch.isAARCH64()) {
|
||||
target.os_version_min = std.build.Target.OsVersion{ .semver = .{ .major = 11, .minor = 0, .patch = 0 } };
|
||||
} else if (arch.isX86()) {
|
||||
target.os_version_min = std.build.Target.OsVersion{ .semver = .{ .major = 10, .minor = 14, .patch = 0 } };
|
||||
}
|
||||
}
|
||||
|
||||
std.mem.copy(
|
||||
@@ -65,7 +79,7 @@ pub fn build(b: *std.build.Builder) !void {
|
||||
|
||||
var triplet = triplet_buf[0 .. osname.len + cpuArchName.len + 1];
|
||||
|
||||
const output_dir_base = try std.fmt.bufPrint(&output_dir_buf, "{s}{s}/bin", .{ bin_label, triplet });
|
||||
const output_dir_base = try std.fmt.bufPrint(&output_dir_buf, "{s}{s}", .{ bin_label, triplet });
|
||||
const output_dir = b.pathFromRoot(output_dir_base);
|
||||
const bun_executable_name = if (mode == std.builtin.Mode.Debug) "bun-debug" else "bun";
|
||||
|
||||
@@ -133,25 +147,24 @@ pub fn build(b: *std.build.Builder) !void {
|
||||
|
||||
exe.setOutputDir(output_dir);
|
||||
var cwd_dir = std.fs.cwd();
|
||||
if (std.builtin.is_test) {
|
||||
var walker = cwd_dir.walk(std.heap.c_allocator) catch unreachable;
|
||||
|
||||
while (walker.next() catch unreachable) |entry| {
|
||||
if (std.mem.endsWith(u8, entry.basename, "_test.zig")) {
|
||||
std.debug.print("[test] Added {s}", .{entry.basename});
|
||||
_ = b.addTest(entry.path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const runtime_hash = std.hash.Wyhash.hash(0, @embedFile("./src/runtime.out.js"));
|
||||
const runtime_version_file = std.fs.cwd().openFile("src/runtime.version", .{ .write = true }) catch unreachable;
|
||||
runtime_version_file.writer().print("{x}", .{runtime_hash}) catch unreachable;
|
||||
var runtime_out_file = try std.fs.cwd().openFile("src/runtime.out.js", .{ .read = true });
|
||||
const runtime_hash = std.hash.Wyhash.hash(
|
||||
0,
|
||||
try runtime_out_file.readToEndAlloc(b.allocator, try runtime_out_file.getEndPos()),
|
||||
);
|
||||
const runtime_version_file = std.fs.cwd().createFile("src/runtime.version", .{ .truncate = true }) catch std.debug.panic("Failed to create src/runtime.version", .{});
|
||||
defer runtime_version_file.close();
|
||||
runtime_version_file.writer().print("{x}", .{runtime_hash}) catch unreachable;
|
||||
var fallback_out_file = try std.fs.cwd().openFile("src/fallback.out.js", .{ .read = true });
|
||||
const fallback_hash = std.hash.Wyhash.hash(
|
||||
0,
|
||||
try fallback_out_file.readToEndAlloc(b.allocator, try fallback_out_file.getEndPos()),
|
||||
);
|
||||
|
||||
const fallback_version_file = std.fs.cwd().createFile("src/fallback.version", .{ .truncate = true }) catch std.debug.panic("Failed to create src/fallback.version", .{});
|
||||
|
||||
const fallback_hash = std.hash.Wyhash.hash(0, @embedFile("./src/fallback.out.js"));
|
||||
const fallback_version_file = std.fs.cwd().openFile("src/fallback.version", .{ .write = true }) catch unreachable;
|
||||
fallback_version_file.writer().print("{x}", .{fallback_hash}) catch unreachable;
|
||||
|
||||
defer fallback_version_file.close();
|
||||
|
||||
exe.setTarget(target);
|
||||
@@ -179,8 +192,8 @@ pub fn build(b: *std.build.Builder) !void {
|
||||
},
|
||||
) catch unreachable;
|
||||
|
||||
var bindings_dir_ = cwd_dir.openDir(bindings_dir, .{ .iterate = true }) catch unreachable;
|
||||
var bindings_walker = bindings_dir_.walk(b.allocator) catch unreachable;
|
||||
var bindings_dir_ = cwd_dir.openDir(bindings_dir, .{ .iterate = true }) catch std.debug.panic("Error opening bindings directory. Please make sure you ran `make jsc`. {s} should exist", .{bindings_dir});
|
||||
var bindings_walker = bindings_dir_.walk(b.allocator) catch std.debug.panic("Error reading bindings directory {s}", .{bindings_dir});
|
||||
|
||||
var bindings_files = std.ArrayList([]const u8).init(b.allocator);
|
||||
|
||||
@@ -211,78 +224,137 @@ pub fn build(b: *std.build.Builder) !void {
|
||||
// if (target.getOsTag() == .macos) "-DUSE_FOUNDATION=1" else "",
|
||||
// if (target.getOsTag() == .macos) "-DUSE_CF_RETAIN_PTR=1" else "",
|
||||
// };
|
||||
const headers_step = b.step("headers", "JSC headers");
|
||||
var headers_exec: *std.build.LibExeObjStep = b.addExecutable("headers", "src/javascript/jsc/bindings/bindings-generator.zig");
|
||||
var headers_runner = headers_exec.run();
|
||||
headers_exec.setMainPkgPath(javascript.main_pkg_path.?);
|
||||
headers_step.dependOn(&headers_runner.step);
|
||||
var translate_c: *std.build.TranslateCStep = b.addTranslateC(.{ .path = b.pathFromRoot("src/javascript/jsc/bindings/headers.h") });
|
||||
translate_c.out_basename = "headers";
|
||||
translate_c.output_dir = b.pathFromRoot("src/javascript/jsc/bindings/");
|
||||
headers_step.dependOn(&translate_c.step);
|
||||
headers_zig_file = b.pathFromRoot("src/javascript/jsc/bindings/headers.zig");
|
||||
const headers_step = b.step("headers-obj", "JSC headers Step #1");
|
||||
var headers_obj: *std.build.LibExeObjStep = b.addObject("headers", "src/javascript/jsc/bindings/bindings-generator.zig");
|
||||
headers_obj.setMainPkgPath(javascript.main_pkg_path.?);
|
||||
headers_step.dependOn(&headers_obj.step);
|
||||
|
||||
original_make_fn = headers_step.makeFn;
|
||||
headers_step.makeFn = HeadersMaker.make;
|
||||
{
|
||||
b.default_step.dependOn(&b.addLog(
|
||||
"Build {s} v{} - v{}",
|
||||
.{
|
||||
triplet,
|
||||
target.getOsVersionMin().semver,
|
||||
target.getOsVersionMax().semver,
|
||||
},
|
||||
).step);
|
||||
}
|
||||
b.default_step.dependOn(&exe.step);
|
||||
var steps = [_]*std.build.LibExeObjStep{ exe, javascript, typings_exe, headers_exec };
|
||||
|
||||
// const single_threaded = b.option(bool, "single-threaded", "Build single-threaded") orelse false;
|
||||
{
|
||||
var steps = [_]*std.build.LibExeObjStep{ exe, javascript, typings_exe };
|
||||
|
||||
for (steps) |step, i| {
|
||||
step.linkLibC();
|
||||
step.linkLibCpp();
|
||||
addPicoHTTP(
|
||||
step,
|
||||
true,
|
||||
);
|
||||
// const single_threaded = b.option(bool, "single-threaded", "Build single-threaded") orelse false;
|
||||
|
||||
step.addObjectFile("src/deps/libJavaScriptCore.a");
|
||||
step.addObjectFile("src/deps/libWTF.a");
|
||||
step.addObjectFile("src/deps/libbmalloc.a");
|
||||
|
||||
step.addObjectFile("src/deps/mimalloc/libmimalloc.a");
|
||||
step.addLibPath("src/deps/mimalloc");
|
||||
step.addIncludeDir("src/deps/mimalloc");
|
||||
|
||||
// step.single_threaded = single_threaded;
|
||||
|
||||
if (target.getOsTag() == .macos) {
|
||||
const homebrew_prefix = comptime if (std.Target.current.cpu.arch == .aarch64)
|
||||
"/opt/homebrew/"
|
||||
else
|
||||
"/usr/local/";
|
||||
|
||||
// We must link ICU statically
|
||||
step.addObjectFile(homebrew_prefix ++ "opt/icu4c/lib/libicudata.a");
|
||||
step.addObjectFile(homebrew_prefix ++ "opt/icu4c/lib/libicui18n.a");
|
||||
step.addObjectFile(homebrew_prefix ++ "opt/icu4c/lib/libicuuc.a");
|
||||
// icucore is a weird macOS only library
|
||||
step.linkSystemLibrary("icucore");
|
||||
step.addLibPath(homebrew_prefix ++ "opt/icu4c/lib");
|
||||
step.addIncludeDir(homebrew_prefix ++ "opt/icu4c/include");
|
||||
}
|
||||
|
||||
for (bindings_files.items) |binding| {
|
||||
step.addObjectFile(
|
||||
binding,
|
||||
for (steps) |step, i| {
|
||||
step.linkLibC();
|
||||
step.linkLibCpp();
|
||||
addPicoHTTP(
|
||||
step,
|
||||
true,
|
||||
);
|
||||
|
||||
step.addObjectFile(panicIfNotFound("src/deps/libJavaScriptCore.a"));
|
||||
step.addObjectFile(panicIfNotFound("src/deps/libWTF.a"));
|
||||
step.addObjectFile(panicIfNotFound("src/deps/libcrypto.a"));
|
||||
step.addObjectFile(panicIfNotFound("src/deps/libbmalloc.a"));
|
||||
step.addObjectFile(panicIfNotFound("src/deps/libarchive.a"));
|
||||
step.addObjectFile(panicIfNotFound("src/deps/libs2n.a"));
|
||||
step.addObjectFile(panicIfNotFound("src/deps/zlib/libz.a"));
|
||||
step.addObjectFile(panicIfNotFound("src/deps/mimalloc/libmimalloc.a"));
|
||||
step.addLibPath("src/deps/mimalloc");
|
||||
step.addIncludeDir("src/deps/mimalloc");
|
||||
|
||||
// step.single_threaded = single_threaded;
|
||||
|
||||
if (target.getOsTag() == .macos) {
|
||||
const homebrew_prefix = comptime if (std.Target.current.cpu.arch == .aarch64)
|
||||
"/opt/homebrew/"
|
||||
else
|
||||
"/usr/local/";
|
||||
|
||||
// We must link ICU statically
|
||||
step.addObjectFile(panicIfNotFound(homebrew_prefix ++ "opt/icu4c/lib/libicudata.a"));
|
||||
step.addObjectFile(panicIfNotFound(homebrew_prefix ++ "opt/icu4c/lib/libicui18n.a"));
|
||||
step.addObjectFile(panicIfNotFound(homebrew_prefix ++ "opt/icu4c/lib/libicuuc.a"));
|
||||
step.addObjectFile(panicIfNotFound(homebrew_prefix ++ "opt/libiconv/lib/libiconv.a"));
|
||||
|
||||
// icucore is a weird macOS only library
|
||||
step.linkSystemLibrary("icucore");
|
||||
step.addLibPath(panicIfNotFound(homebrew_prefix ++ "opt/icu4c/lib"));
|
||||
step.addIncludeDir(panicIfNotFound(homebrew_prefix ++ "opt/icu4c/include"));
|
||||
} else {
|
||||
step.linkSystemLibrary("icuuc");
|
||||
step.linkSystemLibrary("icudata");
|
||||
step.linkSystemLibrary("icui18n");
|
||||
step.addObjectFile(panicIfNotFound("src/deps/libiconv.a"));
|
||||
}
|
||||
|
||||
for (bindings_files.items) |binding| {
|
||||
step.addObjectFile(
|
||||
binding,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var obj_step = b.step("obj", "Build Bun as a .o file");
|
||||
var obj = b.addObject(bun_executable_name, exe.root_src.?.path);
|
||||
obj.bundle_compiler_rt = true;
|
||||
addPicoHTTP(obj, false);
|
||||
obj.addPackage(.{
|
||||
.name = "clap",
|
||||
.path = .{ .path = "src/deps/zig-clap/clap.zig" },
|
||||
});
|
||||
{
|
||||
var obj_step = b.step("obj", "Build Bun as a .o file");
|
||||
var obj = b.addObject(bun_executable_name, exe.root_src.?.path);
|
||||
obj.setTarget(target);
|
||||
addPicoHTTP(obj, false);
|
||||
obj.addPackage(.{
|
||||
.name = "clap",
|
||||
.path = .{ .path = "src/deps/zig-clap/clap.zig" },
|
||||
});
|
||||
|
||||
obj_step.dependOn(&obj.step);
|
||||
obj.setOutputDir(output_dir);
|
||||
obj.setBuildMode(mode);
|
||||
obj.setTarget(target);
|
||||
{
|
||||
obj_step.dependOn(&b.addLog(
|
||||
"Build {s} v{} - v{}\n",
|
||||
.{
|
||||
triplet,
|
||||
obj.target.getOsVersionMin().semver,
|
||||
obj.target.getOsVersionMax().semver,
|
||||
},
|
||||
).step);
|
||||
}
|
||||
|
||||
obj_step.dependOn(&obj.step);
|
||||
|
||||
obj.setOutputDir(output_dir);
|
||||
obj.setBuildMode(mode);
|
||||
obj.linkLibC();
|
||||
obj.linkLibCpp();
|
||||
|
||||
obj.strip = false;
|
||||
obj.bundle_compiler_rt = true;
|
||||
|
||||
if (target.getOsTag() == .linux) {
|
||||
// obj.want_lto = tar;
|
||||
obj.link_emit_relocs = true;
|
||||
obj.link_function_sections = true;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
headers_obj.setTarget(target);
|
||||
headers_obj.addPackage(.{
|
||||
.name = "clap",
|
||||
.path = .{ .path = "src/deps/zig-clap/clap.zig" },
|
||||
});
|
||||
|
||||
headers_obj.setOutputDir(output_dir);
|
||||
headers_obj.setBuildMode(mode);
|
||||
headers_obj.linkLibC();
|
||||
headers_obj.linkLibCpp();
|
||||
headers_obj.bundle_compiler_rt = true;
|
||||
|
||||
if (target.getOsTag() == .linux) {
|
||||
// obj.want_lto = tar;
|
||||
headers_obj.link_emit_relocs = true;
|
||||
headers_obj.link_function_sections = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
b.default_step.dependOn(&exe.step);
|
||||
}
|
||||
@@ -323,59 +395,3 @@ pub fn build(b: *std.build.Builder) !void {
|
||||
}
|
||||
|
||||
pub var original_make_fn: ?fn (step: *std.build.Step) anyerror!void = null;
|
||||
pub var headers_zig_file: ?[]const u8 = null;
|
||||
const HeadersMaker = struct {
|
||||
pub fn make(self: *std.build.Step) anyerror!void {
|
||||
try original_make_fn.?(self);
|
||||
var headers_zig: std.fs.File = try std.fs.openFileAbsolute(headers_zig_file.?, .{ .write = true });
|
||||
var contents = try headers_zig.readToEndAlloc(std.heap.page_allocator, headers_zig.getEndPos() catch unreachable);
|
||||
const last_extern_i = std.mem.lastIndexOf(u8, contents, "pub extern fn") orelse @panic("Expected contents");
|
||||
const last_newline = std.mem.indexOf(u8, contents[last_extern_i..], "\n") orelse @panic("Expected newline");
|
||||
const to_splice = "usingnamespace @import(\"./headers-replacements.zig\");\n";
|
||||
var new_contents = try std.heap.page_allocator.alloc(u8, contents.len + to_splice.len);
|
||||
std.mem.copy(u8, new_contents, to_splice);
|
||||
std.mem.copy(u8, new_contents[to_splice.len..], contents);
|
||||
var i: usize = to_splice.len;
|
||||
var remainder = new_contents[i..];
|
||||
while (remainder.len > 0) {
|
||||
i = std.mem.indexOf(u8, remainder, "\npub const struct_b") orelse break + "\npub const struct_b".len;
|
||||
var begin = remainder[i..];
|
||||
const end_line = std.mem.indexOf(u8, begin, "extern struct {") orelse break;
|
||||
const end_struct = std.mem.indexOf(u8, begin, "\n};\n") orelse break + "\n};\n".len;
|
||||
|
||||
std.mem.set(u8, begin[1 .. end_struct + 3], ' ');
|
||||
remainder = begin[end_struct..];
|
||||
}
|
||||
i = to_splice.len;
|
||||
remainder = new_contents[i..];
|
||||
while (remainder.len > 0) {
|
||||
i = std.mem.indexOf(u8, remainder, "\npub const struct_") orelse break + "\npub const struct_".len;
|
||||
var begin = remainder[i..];
|
||||
var end_struct = std.mem.indexOf(u8, begin, "opaque {};") orelse break;
|
||||
end_struct += std.mem.indexOf(u8, begin[end_struct..], "\n") orelse break;
|
||||
i = 0;
|
||||
|
||||
std.mem.set(u8, begin[1..end_struct], ' ');
|
||||
remainder = begin[end_struct..];
|
||||
}
|
||||
|
||||
const HARDCODE = [_][]const u8{
|
||||
"[*c][*c]JSC__Exception",
|
||||
"*?*JSC__Exception ",
|
||||
"[*c]?*c_void",
|
||||
"[*c]*c_void",
|
||||
};
|
||||
i = 0;
|
||||
while (i < HARDCODE.len) : (i += 2) {
|
||||
_ = std.mem.replace(u8, new_contents, HARDCODE[i], HARDCODE[i + 1], new_contents);
|
||||
}
|
||||
|
||||
const js_value_start = std.mem.indexOf(u8, new_contents, "pub const JSC__JSValue") orelse unreachable;
|
||||
const js_value_end = std.mem.indexOf(u8, new_contents[js_value_start..], "\n") orelse unreachable;
|
||||
std.mem.set(u8, new_contents[js_value_start..][0..js_value_end], ' ');
|
||||
|
||||
try headers_zig.seekTo(0);
|
||||
try headers_zig.writeAll(new_contents);
|
||||
try headers_zig.setEndPos(last_newline + last_extern_i + to_splice.len);
|
||||
}
|
||||
};
|
||||
|
||||
8
completions/bun.bash
Normal file
8
completions/bun.bash
Normal file
@@ -0,0 +1,8 @@
|
||||
#/usr/bin/env bash
|
||||
|
||||
# This is not implemented yet.
|
||||
# But a PR implementing it would be very welcome!
|
||||
_bun_completions() {
|
||||
}
|
||||
|
||||
complete -F _bun_completions bun
|
||||
90
completions/bun.fish
Normal file
90
completions/bun.fish
Normal file
@@ -0,0 +1,90 @@
|
||||
function __fish__get_bun_bins
|
||||
string split ' ' (bun getcompletes b)
|
||||
end
|
||||
|
||||
function __fish__get_bun_scripts
|
||||
set -lx SHELL bash
|
||||
set -lx MAX_DESCRIPTION_LEN 40
|
||||
string trim (string split '\n' (string split '\t' (bun getcompletes z)))
|
||||
end
|
||||
|
||||
function __fish__get_bun_bun_js_files
|
||||
string split ' ' (bun getcompletes j)
|
||||
end
|
||||
|
||||
function bun_fish_is_nth_token --description 'Test if current token is on Nth place' --argument-names n
|
||||
set -l tokens (commandline -poc)
|
||||
set -l tokens (string replace -r --filter '^([^-].*)' '$1' -- $tokens)
|
||||
test (count $tokens) -eq "$n"
|
||||
end
|
||||
|
||||
function __bun_command_count --argument-names n
|
||||
set -l cmds (commandline -poc)
|
||||
|
||||
test (count cmds) -eq "$n"
|
||||
end
|
||||
|
||||
function __bun_last_cmd --argument-names n
|
||||
set -l cmds (commandline -poc)
|
||||
|
||||
test "(cmds[-1])" = "$n"
|
||||
end
|
||||
|
||||
set -l bun_builtin_cmds dev create help bun upgrade discord run
|
||||
set -l bun_builtin_cmds_without_run dev create help bun upgrade discord
|
||||
set -l bun_builtin_cmds_without_bun dev create help upgrade run discord
|
||||
set -l bun_builtin_cmds_without_create dev help bun upgrade discord run
|
||||
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds_without_run; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_use_subcommand" -a '(__fish__get_bun_scripts)' -d 'script'
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds_without_run; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_seen_subcommand_from run" -a '(__fish__get_bun_bins)' -d 'package bin'
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds_without_run; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_seen_subcommand_from run" -a '(__fish__get_bun_scripts)' -d 'script'
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds_without_run; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_seen_subcommand_from run" -a '(__fish__get_bun_bun_js_files)' -d 'Bun.js'
|
||||
complete -c bun \
|
||||
-n "bun_fish_is_nth_token 1; and not __fish_seen_subcommand_from $bun_builtin_cmds; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts) and __fish_use_subcommand" -a 'run' -f -d 'Run a script or bin'
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts);" --no-files -s 'u' -l 'origin' -r -d 'Server URL. Rewrites import paths'
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts);" --no-files -s 'p' -l 'port' -r -d 'Port number to start server from'
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts);" --no-files -s 'd' -l 'define' -r -d 'Substitute K:V while parsing, e.g. --define process.env.NODE_ENV:\"development\"'
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts);" --no-files -s 'e' -l 'external' -r -d 'Exclude module from transpilation (can use * wildcards). ex: -e react'
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts);" --no-files -l 'use' -r -d 'Use a framework (ex: next)'
|
||||
complete -c bun \
|
||||
-n "bun_fish_is_nth_token 1; and not __fish_seen_subcommand_from $bun_builtin_cmds; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts) and __fish_use_subcommand" -a 'dev' -d 'Start dev server'
|
||||
complete -c bun \
|
||||
-n "bun_fish_is_nth_token 1; and not __fish_seen_subcommand_from $bun_builtin_cmds; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts) and __bun_command_count 1 and __fish_use_subcommand" -a 'create' -f -d 'Create a new project'
|
||||
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds_without_create next react; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_seen_subcommand_from create;" -a 'next' -d 'new Next.js project'
|
||||
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds_without_create next react; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_seen_subcommand_from create;" -a 'react' -d 'new React project'
|
||||
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_use_subcommand" -a 'upgrade' -d 'Upgrade Bun to the latest version' -x
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_use_subcommand" -a '--help' -d 'See all commands and flags' -x
|
||||
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_use_subcommand" -l "version" -s "v" -a '--version' -d 'Bun\'s version' -x
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_use_subcommand" -a 'discord' -d 'Open Bun\'s Discord server' -x
|
||||
|
||||
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds_without_bun; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); __fish_use_subcommand" -a 'bun' -d 'Generate a new bundle'
|
||||
|
||||
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds_without_bun; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_seen_subcommand_from bun" -F -d 'Bundle this'
|
||||
|
||||
complete -c bun \
|
||||
-n "not __fish_seen_subcommand_from $bun_builtin_cmds_without_create; and not __fish_seen_subcommand_from (__fish__get_bun_bins); and not __fish_seen_subcommand_from (__fish__get_bun_scripts); and __fish_seen_subcommand_from react; or __fish_seen_subcommand_from next" -F -d "Create in directory"
|
||||
|
||||
complete -c bun --no-files
|
||||
368
completions/bun.zsh
Normal file
368
completions/bun.zsh
Normal file
@@ -0,0 +1,368 @@
|
||||
_bun() {
|
||||
local program=bun
|
||||
typeset -A opt_args
|
||||
local curcontext="$curcontext" state line context
|
||||
|
||||
# ---- Command:
|
||||
_arguments -s \
|
||||
'1: :->cmd' \
|
||||
'*: :->args' &&
|
||||
ret=0
|
||||
|
||||
case $state in
|
||||
cmd)
|
||||
local -a scripts_list
|
||||
IFS=$'\n' scripts_list=($(SHELL=zsh bun getcompletes i))
|
||||
compadd $scripts_list && ret=0
|
||||
|
||||
main_commands=('bun:"Generate a bundle" create:"Create a new project" dev:"Start a dev server" help:"Show command help" run:"Run a script or package bin" upgrade:"Upgrade to the latest version of Bun"')
|
||||
main_commands=($main_commands)
|
||||
_alternative "args:Bun:(($main_commands))"
|
||||
;;
|
||||
args)
|
||||
case $line[1] in
|
||||
bun)
|
||||
|
||||
# ---- Command: bun
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'*: :->file' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' \
|
||||
'--use[Use a framework, e.g. "next"]:use' &&
|
||||
ret=0
|
||||
|
||||
case $state in
|
||||
file)
|
||||
_files
|
||||
;;
|
||||
esac
|
||||
|
||||
;;
|
||||
create)
|
||||
|
||||
# ---- Command: create
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->cmd2' \
|
||||
'*: :->args' &&
|
||||
ret=0
|
||||
|
||||
case $state in
|
||||
cmd2)
|
||||
_alternative 'args:create:((next\:"Next.js app" react\:"React app"))'
|
||||
;;
|
||||
|
||||
args)
|
||||
case $line[2] in
|
||||
next)
|
||||
|
||||
# ---- Command: create next
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->cmd2' \
|
||||
'3: :->file' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' &&
|
||||
ret=0
|
||||
|
||||
case $state in
|
||||
file)
|
||||
_files
|
||||
;;
|
||||
esac
|
||||
|
||||
;;
|
||||
react)
|
||||
|
||||
# ---- Command: create react
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->cmd2' \
|
||||
'3: :->file' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' &&
|
||||
ret=0
|
||||
|
||||
case $state in
|
||||
file)
|
||||
_files
|
||||
;;
|
||||
esac
|
||||
|
||||
;;
|
||||
esac
|
||||
|
||||
;;
|
||||
|
||||
esac
|
||||
;;
|
||||
dev)
|
||||
|
||||
# ---- Command: dev
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' \
|
||||
'--bunfile[Use a specific .bun file (default: node_modules.bun)]:bunfile' \
|
||||
'--origin[Rewrite import paths to start from a different url. Default: http://localhost:3000]:origin' \
|
||||
'-u[Rewrite import paths to start from a different url. Default: http://localhost:3000]:u' \
|
||||
'--server-bunfile[Use a specific .bun file for SSR in bun dev (default: node_modules.server.bun)]:server-bunfile' \
|
||||
'--extension-order[defaults to: .tsx,.ts,.jsx,.js,.json]:extension-order' \
|
||||
'--jsx-runtime[JSX runtime to use. Defaults to "automatic"]:jsx-runtime:("automatic" "classic")' \
|
||||
'--main-fields[Main fields to lookup in package.json. Defaults to --platform dependent]:main-fields' \
|
||||
'--disable-react-fast-refresh[Disable React Fast Refresh]' \
|
||||
'--disable-hmr[Disable Hot Module Reloading]' \
|
||||
'--jsx-factory[Changes the function called when compiling JSX elements using the classic JSX runtime]:jsx-factory' \
|
||||
'--jsx-fragment[Changes the function called when compiling JSX fragments]:jsx-fragment' \
|
||||
'--jsx-import-source[Declares the module specifier to be used for importing the jsx and jsxs factory functions. Default: "react"]:jsx-import-source' \
|
||||
'--port[Port number]:port' &&
|
||||
ret=0
|
||||
|
||||
;;
|
||||
|
||||
help)
|
||||
|
||||
# ---- Command: help
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->cmd2' \
|
||||
'*: :->args' &&
|
||||
ret=0
|
||||
|
||||
case $state in
|
||||
cmd2)
|
||||
_alternative 'args:cmd3:((bun create dev run upgrade))'
|
||||
;;
|
||||
|
||||
args)
|
||||
case $line[2] in
|
||||
bun)
|
||||
|
||||
# ---- Command: help bun
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->cmd2' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' \
|
||||
'--all[]' &&
|
||||
ret=0
|
||||
|
||||
;;
|
||||
|
||||
create)
|
||||
|
||||
# ---- Command: help create
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->cmd2' \
|
||||
'3: :->cmd3' \
|
||||
'*: :->args' &&
|
||||
ret=0
|
||||
|
||||
case $state in
|
||||
cmd3)
|
||||
_alternative 'args:create:((next react))'
|
||||
;;
|
||||
|
||||
args)
|
||||
case $line[3] in
|
||||
next)
|
||||
|
||||
# ---- Command: help create next
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->cmd2' \
|
||||
'3: :->cmd3' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' \
|
||||
'--all[]' &&
|
||||
ret=0
|
||||
|
||||
;;
|
||||
|
||||
react)
|
||||
|
||||
# ---- Command: help create react
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->cmd2' \
|
||||
'3: :->cmd3' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' \
|
||||
'--all[]' &&
|
||||
ret=0
|
||||
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
;;
|
||||
|
||||
esac
|
||||
;;
|
||||
dev)
|
||||
|
||||
# ---- Command: help dev
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->cmd2' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' \
|
||||
'--all[]' &&
|
||||
ret=0
|
||||
|
||||
;;
|
||||
|
||||
run)
|
||||
|
||||
# ---- Command: help run
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->cmd2' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' \
|
||||
'--all[]' &&
|
||||
ret=0
|
||||
|
||||
;;
|
||||
|
||||
upgrade)
|
||||
|
||||
# ---- Command: help upgrade
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->cmd2' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' \
|
||||
'--all[]' &&
|
||||
ret=0
|
||||
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
;;
|
||||
|
||||
esac
|
||||
;;
|
||||
run)
|
||||
|
||||
# ---- Command: run
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'2: :->script' \
|
||||
'*: :->other' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' \
|
||||
'--silent[Don'"'"'t echo the command]' &&
|
||||
ret=0
|
||||
|
||||
case $state in
|
||||
script)
|
||||
_bun_run_param_script_completion
|
||||
;;
|
||||
other)
|
||||
_files
|
||||
;;
|
||||
esac
|
||||
|
||||
;;
|
||||
upgrade)
|
||||
|
||||
# ---- Command: upgrade
|
||||
_arguments -s -C \
|
||||
'1: :->cmd' \
|
||||
'--version[Show version and exit]' \
|
||||
'-V[Show version and exit]' \
|
||||
'--cwd[Change directory]:cwd' \
|
||||
'--help[Show command help]' \
|
||||
'-h[Show command help]' &&
|
||||
ret=0
|
||||
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
}
|
||||
|
||||
_bun_run_param_script_completion() {
|
||||
local -a scripts_list
|
||||
IFS=$'\n' scripts_list=($(SHELL=zsh bun getcompletes s))
|
||||
compadd $scripts_list && ret=0
|
||||
|
||||
IFS=$'\n' bunjs=($(SHELL=zsh bun getcompletes j))
|
||||
IFS=$'\n' bins=($(SHELL=zsh bun getcompletes b))
|
||||
|
||||
if [ ! -z "$bunjs" -a "$bunjs" != " " ]; then
|
||||
if [ ! -z "$bins" -a "$bins" != " " ]; then
|
||||
compadd $bunjs && ret=0
|
||||
_alternative "args:bin:(($bins))"
|
||||
return 1
|
||||
fi
|
||||
|
||||
_alternative "args:Bun.js:(($bunjs))"
|
||||
fi
|
||||
|
||||
if [ ! -z "$bins" -a "$bins" != " " ]; then
|
||||
_alternative "args:bin:(($bins))"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
__bun_dynamic_comp() {
|
||||
local comp=""
|
||||
|
||||
for arg in scripts; do
|
||||
local line
|
||||
while read -r line; do
|
||||
local name="$line"
|
||||
local desc="$line"
|
||||
name="${name%$'\t'*}"
|
||||
desc="${desc/*$'\t'/}"
|
||||
echo
|
||||
done <<<"$arg"
|
||||
done
|
||||
|
||||
return $comp
|
||||
}
|
||||
|
||||
autoload -U compinit && compinit
|
||||
compdef _bun bun
|
||||
113
completions/spec.yaml
Normal file
113
completions/spec.yaml
Normal file
@@ -0,0 +1,113 @@
|
||||
---
|
||||
name: bun
|
||||
appspec: { version: "0.001" }
|
||||
plugins: [-Meta]
|
||||
title: A tool for installing and managing Python packages
|
||||
|
||||
options:
|
||||
- version|V --Show version and exit
|
||||
- name: cwd
|
||||
type: string
|
||||
summary: "Change directory"
|
||||
|
||||
# subcommands:
|
||||
# bun:
|
||||
|
||||
subcommands:
|
||||
run:
|
||||
summary: Run a script or package bin
|
||||
parameters:
|
||||
- name: script
|
||||
multiple: false
|
||||
completion:
|
||||
command_string: >
|
||||
SHELL=zsh bun getcompletes r
|
||||
|
||||
options:
|
||||
- silent --Don't echo the command
|
||||
|
||||
create:
|
||||
summary: Create a new project
|
||||
subcommands:
|
||||
next:
|
||||
summary: "Next.js app"
|
||||
parameters:
|
||||
- name: file
|
||||
multiple: false
|
||||
type: file
|
||||
required: true
|
||||
|
||||
react:
|
||||
summary: "React app"
|
||||
parameters:
|
||||
- name: file
|
||||
multiple: false
|
||||
type: file
|
||||
required: true
|
||||
|
||||
bun:
|
||||
summary: Generate a bundle
|
||||
parameters:
|
||||
- name: file
|
||||
multiple: true
|
||||
type: file
|
||||
required: false
|
||||
options:
|
||||
- name: use
|
||||
type: string
|
||||
summary: Use a framework, e.g. "next"
|
||||
|
||||
upgrade:
|
||||
summary: Upgrade to the latest version of Bun
|
||||
|
||||
dev:
|
||||
summary: Start a dev server
|
||||
options:
|
||||
- name: bunfile
|
||||
type: string
|
||||
summary: "Use a specific .bun file (default: node_modules.bun)"
|
||||
|
||||
- name: origin
|
||||
type: string
|
||||
summary: "Rewrite import paths to start from a different url. Default: http://localhost:3000"
|
||||
|
||||
- name: u
|
||||
type: string
|
||||
summary: "Rewrite import paths to start from a different url. Default: http://localhost:3000"
|
||||
|
||||
- name: server-bunfile
|
||||
type: string
|
||||
summary: "Use a specific .bun file for SSR in bun dev (default: node_modules.server.bun)"
|
||||
- name: extension-order
|
||||
type: string
|
||||
summary: "defaults to: .tsx,.ts,.jsx,.js,.json"
|
||||
- name: "jsx-runtime"
|
||||
type: string
|
||||
enum: ["automatic", "classic"]
|
||||
summary: 'JSX runtime to use. Defaults to "automatic"'
|
||||
- name: main-fields
|
||||
type: string
|
||||
summary: Main fields to lookup in package.json. Defaults to --platform dependent
|
||||
- disable-react-fast-refresh --Disable React Fast Refresh
|
||||
- disable-hmr --Disable Hot Module Reloading
|
||||
- &jsx_factory name: jsx-factory
|
||||
type: string
|
||||
summary: "Changes the function called when compiling JSX elements using the classic JSX runtime"
|
||||
- &jsx_fragment name: jsx-fragment
|
||||
type: string
|
||||
summary: "Changes the function called when compiling JSX fragments"
|
||||
- &jsx_import_source name: jsx-import-source
|
||||
type: string
|
||||
summary: 'Declares the module specifier to be used for importing the jsx and jsxs factory functions. Default: "react"'
|
||||
- &port name: port
|
||||
type: int
|
||||
summary: Port number
|
||||
|
||||
parameters:
|
||||
- name: sasdasdds
|
||||
completion:
|
||||
command_string: >
|
||||
SHELL=zsh bun getcompletes r
|
||||
|
||||
# vim:et:sts=2:sws=2:sw=2:foldmethod=indent
|
||||
|
||||
@@ -2,13 +2,15 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-executable-page-protection</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-executable-page-protection</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-library-validation</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
1
examples/.gitignore
vendored
Normal file
1
examples/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
bun-examples-all
|
||||
@@ -1,11 +0,0 @@
|
||||
import { Main } from "../../src/main";
|
||||
|
||||
function IndexRoute() {
|
||||
return (
|
||||
<div>
|
||||
<Main productName={"Boom id"} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export { IndexRoute as default };
|
||||
@@ -1,7 +0,0 @@
|
||||
import { Main } from "src/main";
|
||||
|
||||
export function IndexPage() {
|
||||
return <Main />;
|
||||
}
|
||||
|
||||
export default IndexPage;
|
||||
@@ -1,9 +0,0 @@
|
||||
import { Main } from "../../src/main";
|
||||
|
||||
export default function IndexRoute() {
|
||||
return (
|
||||
<div>
|
||||
<Main productName={"nested!"} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
import { Main } from "../src/main";
|
||||
|
||||
export function getInitialProps() {
|
||||
return {};
|
||||
}
|
||||
|
||||
export default function IndexRoute() {
|
||||
return (
|
||||
<div>
|
||||
<Main productName={"Page 2! Next.js (Webpack 5)"} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
// Snowpack Configuration File
|
||||
// See all supported options: https://www.snowpack.dev/reference/configuration
|
||||
|
||||
/** @type {import("snowpack").SnowpackUserConfig } */
|
||||
module.exports = {
|
||||
root: "src",
|
||||
mount: {
|
||||
public: "/",
|
||||
src: "/",
|
||||
},
|
||||
plugins: ["@snowpack/plugin-react-refresh"],
|
||||
packageOptions: {
|
||||
/* ... */
|
||||
},
|
||||
devOptions: {
|
||||
/* ... */
|
||||
},
|
||||
buildOptions: {
|
||||
/* ... */
|
||||
},
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
||||
export const Button = ({ children }) => <div>asdasasd{children}</div>;
|
||||
@@ -1,14 +0,0 @@
|
||||
:root {
|
||||
--timestamp: "596";
|
||||
--interval: "64";
|
||||
--progress-bar: 33.167%;
|
||||
--spinner-1-muted: rgb(42, 74, 66);
|
||||
--spinner-1-primary: rgb(53, 93, 82);
|
||||
--spinner-2-muted: rgb(90, 51, 192);
|
||||
--spinner-2-primary: rgb(112, 64, 240);
|
||||
--spinner-3-muted: rgb(157, 140, 68);
|
||||
--spinner-3-primary: rgb(196, 175, 85);
|
||||
--spinner-4-muted: rgb(86, 152, 66);
|
||||
--spinner-4-primary: rgb(108, 190, 82);
|
||||
--spinner-rotate: 237deg;
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
body {
|
||||
filter: sepia(50%) brightness(200%);
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
import React from "react";
|
||||
import { NewComponent } from "./new-comp";
|
||||
|
||||
const Toast = () => {
|
||||
const [baconyes, baconno] = useBacon();
|
||||
return <div>false</div>;
|
||||
};
|
||||
const Button = ({ label, label2, onClick }) => {
|
||||
const useCustomHookInsideFunction = (what, arr) => {
|
||||
return [true, false];
|
||||
};
|
||||
const [on, setOn] = React.useState(false);
|
||||
|
||||
React.useEffect(() => {
|
||||
console.log({ on });
|
||||
}, [on]);
|
||||
|
||||
// const [foo1, foo2] = useCustomHookInsideFunction(() => {}, [on]);
|
||||
|
||||
return (
|
||||
<div className="Button" onClick={onClick}>
|
||||
<Toast>f</Toast>
|
||||
<div className="Button-label">{label}12</div>
|
||||
<NewComponent />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
export const NewComponent = () => {
|
||||
return <div>NEW!</div>;
|
||||
};
|
||||
@@ -1 +0,0 @@
|
||||
/* @import "https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;700&family=Space+Mono:wght@400;700&display=swap"; */
|
||||
@@ -1 +0,0 @@
|
||||
import jsx from "/Users/jarred/Code/bun/demos/css-stress-test/node_modules/react/cjs/react-jsx-dev-runtime.development.js";
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "esnext",
|
||||
"lib": ["dom", "dom.iterable", "esnext", "WebWorker"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": false,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "Node",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"path": ["node_modules/path-browserify"]
|
||||
}
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
export const yep = true;
|
||||
18014
examples/hello-next/package-lock.json
generated
18014
examples/hello-next/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"name": "hello-next",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jarred/react-static-tweets": "0.5.8",
|
||||
"@jarred/static-tweets": "^0.5.8",
|
||||
"date-fns": "^2.23.0",
|
||||
"isomorphic-fetch": "^3.0.0",
|
||||
"next": "^11.1.0",
|
||||
"parcel": "2.0.0-rc.0",
|
||||
"path-browserify": "^1.0.1",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-is": "^17.0.2",
|
||||
"whatwg-url": "^9.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/standalone": "^7.15.3",
|
||||
"@types/react": "^17.0.19",
|
||||
"bun-framework-next": "^0.0.0-18",
|
||||
"typescript": "^4.3.5"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
|
||||
|
||||
export default function handler(req, res) {
|
||||
res.status(200).json({ name: 'John Doe' })
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
import Link from "next/link";
|
||||
|
||||
export default function Baz({}) {
|
||||
return (
|
||||
<div style={{ padding: 16 }}>
|
||||
<h1>Third</h1>
|
||||
<ul>
|
||||
<li>
|
||||
<Link href="/">
|
||||
<a>Root page</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/second">
|
||||
<a>Second page</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/posts/123">
|
||||
<a>Post page 123</a>
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
import Head from "next/head";
|
||||
import Link from "next/link";
|
||||
import React from "react";
|
||||
import styles from "../styles/Home.module.css";
|
||||
|
||||
export async function getStaticProps(ctx) {
|
||||
return {
|
||||
props: {
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export default function Home({ }) {
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<Head>
|
||||
<title>Fo</title>
|
||||
<meta name="description" content="Generated by create next app" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
</Head>
|
||||
|
||||
<main className={styles.main}>
|
||||
<h1 className={styles.title}>
|
||||
Welcome to <a href="https://nextjs.org">Next.js!</a>
|
||||
</h1>
|
||||
|
||||
<p className={styles.description}>
|
||||
Get started by editing{" "}
|
||||
<code className={styles.code}>pages/index.js</code>
|
||||
</p>
|
||||
|
||||
<div className={styles.grid}>
|
||||
<Link href="/second">
|
||||
<div className={styles.card}>
|
||||
<h2>Second Page →</h2>
|
||||
<p>Link</p>
|
||||
</div>
|
||||
</Link>
|
||||
|
||||
<a
|
||||
onClick={() => router.push("/foo/bar/third")}
|
||||
className={styles.card}
|
||||
>
|
||||
<h2>Third Page →</h2>
|
||||
<p>button, router.push()</p>
|
||||
</a>
|
||||
|
||||
<a
|
||||
href="https://github.com/vercel/next.js/tree/master/examples"
|
||||
className={styles.card}
|
||||
>
|
||||
<h2>Examples →</h2>
|
||||
<p>Discover and deploy boilerplate example Next.js projects.</p>
|
||||
</a>
|
||||
|
||||
<a
|
||||
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
|
||||
className={styles.card}
|
||||
>
|
||||
<h2>Deploy →</h2>
|
||||
<p>
|
||||
Instantly deploy your Next.js site to a public URL with Vercel.
|
||||
</p>
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer className={styles.footer}>
|
||||
<a
|
||||
href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Powered by{" "}
|
||||
<span className={styles.logo}>
|
||||
<img src="/vercel.svg" alt="Vercel Logo" width={72} height={16} />
|
||||
</span>
|
||||
</a>
|
||||
</footer>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
import { useRouter } from "next/router";
|
||||
import Link from "next/link";
|
||||
|
||||
export default function Post({}) {
|
||||
const router = useRouter();
|
||||
|
||||
return (
|
||||
<div style={{ padding: 16 }}>
|
||||
<h1>Post: {router.query.id}</h1>
|
||||
<ul>
|
||||
<li>
|
||||
<Link href="/">
|
||||
<a>Root page</a>
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
import "three/three1";
|
||||
import "three/three2";
|
||||
import "three/three3";
|
||||
import "three/three4";
|
||||
import "three/three5";
|
||||
import "three/three6";
|
||||
import "three/three7";
|
||||
import "three/three8";
|
||||
import "three/three9";
|
||||
import "three/three10";
|
||||
// import "@babel/standalone/babel";
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"name": "lotta-modules",
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/standalone": "^7.15.3",
|
||||
"lodash": "^4.17.21",
|
||||
"three.js": "^0.77.1",
|
||||
"underscore": "^1.13.1"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
<html>
|
||||
<head> </head>
|
||||
<body>
|
||||
<script src="/index.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
33
examples/macros/components/covid19.tsx
Normal file
33
examples/macros/components/covid19.tsx
Normal file
@@ -0,0 +1,33 @@
|
||||
import { fetchCSV } from "macro:fetchCSV";
|
||||
|
||||
export const Covid19 = () => {
|
||||
const rows = fetchCSV(
|
||||
"https://covid19.who.int/WHO-COVID-19-global-data.csv",
|
||||
{
|
||||
last: 100,
|
||||
columns: ["New_cases", "Date_reported", "Country"],
|
||||
}
|
||||
);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h2>Covid-19</h2>
|
||||
<h6>last {rows.length} updates from the WHO</h6>
|
||||
<div className="Table">
|
||||
<div className="Header">
|
||||
<div className="Heading">New Cases</div>
|
||||
<div className="Heading">Date</div>
|
||||
<div className="Heading">Country</div>
|
||||
</div>
|
||||
|
||||
{rows.map((row, index) => (
|
||||
<div className="Row" key={index}>
|
||||
<div className="Column">{row[0]}</div>
|
||||
<div className="Column">{row[1]}</div>
|
||||
<div className="Column">{row[2]}</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
17
examples/macros/components/example.jsx
Normal file
17
examples/macros/components/example.jsx
Normal file
@@ -0,0 +1,17 @@
|
||||
// source code
|
||||
import { matchInFile } from "macro:matchInFile";
|
||||
|
||||
export const IPAddresses = () => (
|
||||
<div>
|
||||
<h2>recent ip addresses</h2>
|
||||
<div className="Lines">
|
||||
{matchInFile("access.log", /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}/).map(
|
||||
(ipAddress, index) => (
|
||||
<div className="Line" key={index}>
|
||||
{ipAddress}
|
||||
</div>
|
||||
)
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
15
examples/macros/components/index.tsx
Normal file
15
examples/macros/components/index.tsx
Normal file
@@ -0,0 +1,15 @@
|
||||
import * as ReactDOM from "react-dom";
|
||||
import * as React from "react";
|
||||
import { IPAddresses } from "./example";
|
||||
import { Covid19 } from "./covid19";
|
||||
|
||||
const Start = function () {
|
||||
const root = document.createElement("div");
|
||||
document.body.appendChild(root);
|
||||
|
||||
// comment out to switch between examples
|
||||
// ReactDOM.render(<IPAddresses />, root);
|
||||
ReactDOM.render(<Covid19 />, root);
|
||||
};
|
||||
|
||||
Start();
|
||||
4
examples/macros/example.js
Normal file
4
examples/macros/example.js
Normal file
@@ -0,0 +1,4 @@
|
||||
// source code
|
||||
import { mysteryBox } from "macro:./mystery-box";
|
||||
|
||||
export default "You roll! " + mysteryBox(123);
|
||||
54
examples/macros/fetchCSV.tsx
Normal file
54
examples/macros/fetchCSV.tsx
Normal file
@@ -0,0 +1,54 @@
|
||||
import Pappa from "papaparse";
|
||||
// Example usage:
|
||||
// const rows = fetchCSV(
|
||||
// "https://covid19.who.int/WHO-COVID-19-global-data.csv",
|
||||
// {
|
||||
// last: 100,
|
||||
// columns: ["New_cases", "Date_reported", "Country"],
|
||||
// }
|
||||
// );
|
||||
export async function fetchCSV(callExpression) {
|
||||
console.time("fetchCSV Total");
|
||||
const [
|
||||
urlNode,
|
||||
{
|
||||
properties: { last: limit = 10, columns = [] },
|
||||
},
|
||||
] = callExpression.arguments;
|
||||
const url = urlNode.get();
|
||||
|
||||
console.time("Fetch");
|
||||
const response = await fetch(url);
|
||||
const csvText = await response.text();
|
||||
console.timeEnd("Fetch");
|
||||
|
||||
console.time("Parse");
|
||||
let rows = Pappa.parse(csvText, { fastMode: true }).data;
|
||||
console.timeEnd("Parse");
|
||||
|
||||
console.time("Render");
|
||||
const columnIndices = new Array(columns.length);
|
||||
|
||||
for (let i = 0; i < columns.length; i++) {
|
||||
columnIndices[i] = rows[0].indexOf(columns[i]);
|
||||
}
|
||||
|
||||
rows = rows
|
||||
.slice(Math.max(limit, rows.length) - limit)
|
||||
.reverse()
|
||||
.filter((columns) => columns.every(Boolean));
|
||||
const value = (
|
||||
<array>
|
||||
{rows.map((columns) => (
|
||||
<array>
|
||||
{columnIndices.map((columnIndex) => (
|
||||
<string value={columns[columnIndex]} />
|
||||
))}
|
||||
</array>
|
||||
))}
|
||||
</array>
|
||||
);
|
||||
console.timeEnd("Render");
|
||||
console.timeEnd("fetchCSV Total");
|
||||
return value;
|
||||
}
|
||||
23
examples/macros/matchInFile.tsx
Normal file
23
examples/macros/matchInFile.tsx
Normal file
@@ -0,0 +1,23 @@
|
||||
// macro code
|
||||
export function matchInFile(callExpression: BunAST.CallExpression) {
|
||||
const [filePathNode, matcherNode] = callExpression.arguments;
|
||||
let filePath: string;
|
||||
filePath = filePathNode.get();
|
||||
|
||||
let matcher: RegExp;
|
||||
matcher = matcherNode.get();
|
||||
const file: string = Bun.readFile(Bun.cwd + filePath);
|
||||
|
||||
return (
|
||||
<array>
|
||||
{file
|
||||
.split("\n")
|
||||
.map((line) => line.match(matcher))
|
||||
.filter(Boolean)
|
||||
.reverse()
|
||||
.map((line) => (
|
||||
<string value={line[0]} />
|
||||
))}
|
||||
</array>
|
||||
);
|
||||
}
|
||||
10
examples/macros/now.tsx
Normal file
10
examples/macros/now.tsx
Normal file
@@ -0,0 +1,10 @@
|
||||
import moment from "moment";
|
||||
export function now(node) {
|
||||
var fmt = "HH:mm:ss";
|
||||
const args = node.arguments;
|
||||
if (args[0] instanceof <string />) {
|
||||
fmt = args[0].get();
|
||||
}
|
||||
const time = moment().format(fmt);
|
||||
return <string value={time}></string>;
|
||||
}
|
||||
17
examples/macros/package.json
Normal file
17
examples/macros/package.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "macros",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"moment": "^2.29.1",
|
||||
"papaparse": "^5.3.1",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-refresh": "^0.10.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^17.0.24",
|
||||
"@types/react-dom": "^17.0.9"
|
||||
}
|
||||
}
|
||||
14
examples/macros/public/index.html
Normal file
14
examples/macros/public/index.html
Normal file
@@ -0,0 +1,14 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Macro test</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
|
||||
<link rel="stylesheet" href="/styles.css" type="text/css" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<script async type="module" src="/components/index.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
47
examples/macros/styles.css
Normal file
47
examples/macros/styles.css
Normal file
@@ -0,0 +1,47 @@
|
||||
html {
|
||||
font-size: 4rem;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: black;
|
||||
|
||||
color: rgb(0, 255, 0);
|
||||
font-family: "Courier";
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 48px auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.Line {
|
||||
font-size: 0.5rem;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.Table {
|
||||
display: grid;
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
.Row,
|
||||
.Header {
|
||||
display: grid;
|
||||
grid-template-columns: 2fr 1fr 1fr;
|
||||
text-align: right;
|
||||
|
||||
column-gap: 2rem;
|
||||
}
|
||||
|
||||
.Heading {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.Header {
|
||||
border-bottom: 1px solid rgb(0, 255, 0);
|
||||
margin-bottom: 20px;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
.Heading:nth-of-type(2) {
|
||||
text-align: left;
|
||||
}
|
||||
7
examples/macros/tsconfig.json
Normal file
7
examples/macros/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"paths": {},
|
||||
"jsx": "preserve"
|
||||
}
|
||||
}
|
||||
@@ -32,3 +32,11 @@ yarn-error.log*
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
**/*.trace
|
||||
**/*.zip
|
||||
**/*.tar.gz
|
||||
**/*.tgz
|
||||
**/*.log
|
||||
package-lock.json
|
||||
**/*.bun
|
||||
42
examples/next/.npmignore
Normal file
42
examples/next/.npmignore
Normal file
@@ -0,0 +1,42 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# local env files
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
**/*.trace
|
||||
**/*.zip
|
||||
**/*.tar.gz
|
||||
**/*.tgz
|
||||
**/*.log
|
||||
package-lock.json
|
||||
**/*.bun
|
||||
42
examples/next/gitignore
Normal file
42
examples/next/gitignore
Normal file
@@ -0,0 +1,42 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# local env files
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
**/*.trace
|
||||
**/*.zip
|
||||
**/*.tar.gz
|
||||
**/*.tgz
|
||||
**/*.log
|
||||
package-lock.json
|
||||
**/*.bun
|
||||
21
examples/next/package.json
Normal file
21
examples/next/package.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "@bun-examples/next",
|
||||
"version": "0.0.48",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"next": "12.0.2",
|
||||
"react": "beta",
|
||||
"react-dom": "beta",
|
||||
"react-is": "^17.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^17.0.19",
|
||||
"bun-framework-next": "^12",
|
||||
"typescript": "^4.4.0"
|
||||
},
|
||||
"bun-create": {
|
||||
"postinstall": [
|
||||
"bun bun --use next"
|
||||
]
|
||||
}
|
||||
}
|
||||
36
examples/next/pages/index.tsx
Normal file
36
examples/next/pages/index.tsx
Normal file
@@ -0,0 +1,36 @@
|
||||
import Head from "next/head";
|
||||
import Link from "next/link";
|
||||
import React from "react";
|
||||
import styles from "../styles/Home.module.css";
|
||||
import nextPackage from "next/package.json";
|
||||
export async function getStaticProps(ctx) {
|
||||
return {
|
||||
props: {},
|
||||
};
|
||||
}
|
||||
|
||||
export default function Home({}) {
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<Head>
|
||||
<title>Next.js</title>
|
||||
<meta name="description" content="Generated by create next app" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
</Head>
|
||||
|
||||
<main className={styles.main}>
|
||||
<h1 className={styles.title}>
|
||||
Welcome to <a href="https://nextjs.org">Next.js!</a> v
|
||||
{nextPackage.version}
|
||||
</h1>
|
||||
|
||||
<p className={styles.description}>
|
||||
Get started by editing{" "}
|
||||
<code className={styles.code}>pages/index.tsx</code>
|
||||
</p>
|
||||
</main>
|
||||
|
||||
<footer className={styles.footer}></footer>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user