mirror of
https://github.com/oven-sh/bun
synced 2026-02-03 07:28:53 +00:00
Compare commits
392 Commits
jarred/han
...
suppressed
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
147826d93c | ||
|
|
c0a2073dd5 | ||
|
|
a0be3cb2ff | ||
|
|
5c6b9ea9b6 | ||
|
|
48e7c0fb8e | ||
|
|
2656418e50 | ||
|
|
7056384702 | ||
|
|
5712ba8b3b | ||
|
|
6f1939621c | ||
|
|
182d052d4b | ||
|
|
42d15ea853 | ||
|
|
7407080628 | ||
|
|
7ec9ad5cb7 | ||
|
|
141140ef7c | ||
|
|
8c7972fdc8 | ||
|
|
80e4712662 | ||
|
|
3221bfeeb7 | ||
|
|
89641f2e4a | ||
|
|
bc74154536 | ||
|
|
a6acb257c1 | ||
|
|
c34bbb2e3f | ||
|
|
f9b12300d4 | ||
|
|
abf1239976 | ||
|
|
e2c92c69b5 | ||
|
|
135de4dff7 | ||
|
|
fe8ec29f1f | ||
|
|
27eed543ef | ||
|
|
17e01a284b | ||
|
|
2b56451a11 | ||
|
|
0e2a3a0197 | ||
|
|
ebaeafbc89 | ||
|
|
2b335d72e7 | ||
|
|
dcda49a271 | ||
|
|
d49cb0b98e | ||
|
|
bb31e768de | ||
|
|
099825e5ac | ||
|
|
fc05cbfedc | ||
|
|
c920919c42 | ||
|
|
da78103b1c | ||
|
|
a2ae984c3e | ||
|
|
151512dcc9 | ||
|
|
1b945ba2ef | ||
|
|
e8dff7b029 | ||
|
|
d936f365c8 | ||
|
|
48c0d7aadc | ||
|
|
cf054456ce | ||
|
|
57b1e545f8 | ||
|
|
12f83cf48b | ||
|
|
b0f9e03230 | ||
|
|
7481a29f4e | ||
|
|
0714b3a06b | ||
|
|
08c2148000 | ||
|
|
00cc2eae67 | ||
|
|
82a07430ed | ||
|
|
636a8f1f0a | ||
|
|
05d33c39cd | ||
|
|
aba37525a6 | ||
|
|
04a6ebaa17 | ||
|
|
7405c5a615 | ||
|
|
d0903f6b71 | ||
|
|
d0b6218bdf | ||
|
|
8afcb39055 | ||
|
|
b2a697f264 | ||
|
|
aca936515a | ||
|
|
6ba146c3e0 | ||
|
|
a80b3569b4 | ||
|
|
8b5cac1ea1 | ||
|
|
96e7227087 | ||
|
|
f88855da4f | ||
|
|
19cb3ab6ff | ||
|
|
862d35d832 | ||
|
|
a0bcd0f946 | ||
|
|
2264bb3d04 | ||
|
|
3e1231deb4 | ||
|
|
dfcac563bc | ||
|
|
90fd322b5c | ||
|
|
f77b217abf | ||
|
|
7c2be6a877 | ||
|
|
a3c3dad351 | ||
|
|
98b438d0a4 | ||
|
|
58d22b063c | ||
|
|
8cd1db9cda | ||
|
|
2d7df726fd | ||
|
|
1ccf0c2e9c | ||
|
|
db85e04ade | ||
|
|
c2936b205d | ||
|
|
8680641c23 | ||
|
|
e77db8ebac | ||
|
|
dfbedd6a10 | ||
|
|
8624a86eba | ||
|
|
bfc6091faf | ||
|
|
9d0a88ab82 | ||
|
|
2f8f77eeb7 | ||
|
|
7b6e0f7164 | ||
|
|
5df59cb02b | ||
|
|
b61282e290 | ||
|
|
dd3227c436 | ||
|
|
a9a4bbcd24 | ||
|
|
55aa35ee35 | ||
|
|
a99459ffdc | ||
|
|
08f957d33b | ||
|
|
2bd4fe578e | ||
|
|
d672309547 | ||
|
|
e171f04ce6 | ||
|
|
651d5699a0 | ||
|
|
d0d4d8bf85 | ||
|
|
53814dda00 | ||
|
|
d3d5c7a1d6 | ||
|
|
972a7b7080 | ||
|
|
e3759bbbfe | ||
|
|
f722236978 | ||
|
|
e366921e90 | ||
|
|
bd2779b029 | ||
|
|
a05ef0aeb1 | ||
|
|
264142e756 | ||
|
|
51def5f5d6 | ||
|
|
23b292ac21 | ||
|
|
48ed1dfb65 | ||
|
|
bd4d0d15db | ||
|
|
1f0c1c81e9 | ||
|
|
e93eb6c1ab | ||
|
|
1009b07807 | ||
|
|
1a695f13bf | ||
|
|
c75e768a6c | ||
|
|
7d86f9e590 | ||
|
|
a8600b0878 | ||
|
|
5b228256f9 | ||
|
|
ba4daee7e5 | ||
|
|
2c0c562d1d | ||
|
|
683a03d8c7 | ||
|
|
e0c0fe235a | ||
|
|
d16ac87347 | ||
|
|
5934b17f00 | ||
|
|
eedf008c80 | ||
|
|
3a6318b67c | ||
|
|
647b15e4f3 | ||
|
|
625b172a71 | ||
|
|
4959c7d363 | ||
|
|
8808437a02 | ||
|
|
330a4744de | ||
|
|
3a1229d03d | ||
|
|
63a9a8b015 | ||
|
|
f73bde79c7 | ||
|
|
3a7df3f6c7 | ||
|
|
0037dc2537 | ||
|
|
c0fe042102 | ||
|
|
ce1eba1954 | ||
|
|
8191fbd970 | ||
|
|
2af7cdedc2 | ||
|
|
4f98336f86 | ||
|
|
91cfd614ca | ||
|
|
42e4cd8408 | ||
|
|
dbe0a4a978 | ||
|
|
350cc1178a | ||
|
|
dccabd9423 | ||
|
|
345a061d3b | ||
|
|
690346b30b | ||
|
|
16b7b94aea | ||
|
|
fcf0047763 | ||
|
|
af1a124831 | ||
|
|
f5754e3c19 | ||
|
|
4e09f8ef8f | ||
|
|
1969204fa5 | ||
|
|
2d9db9b28f | ||
|
|
0333c7b0bf | ||
|
|
82829c5925 | ||
|
|
8fdb46cb91 | ||
|
|
0aba51230c | ||
|
|
ca801a35fe | ||
|
|
692fb220a4 | ||
|
|
cf1c849e4a | ||
|
|
2eede4f435 | ||
|
|
4989ef88b8 | ||
|
|
9fa26e6a09 | ||
|
|
413aaaff33 | ||
|
|
c538bf87d1 | ||
|
|
1e9b44adda | ||
|
|
3046b0ee39 | ||
|
|
01d41838c5 | ||
|
|
bc7e7027e4 | ||
|
|
eaea6dea54 | ||
|
|
d0b759f784 | ||
|
|
dbfc62e288 | ||
|
|
34ae040d95 | ||
|
|
3caa846988 | ||
|
|
5a0ae3c256 | ||
|
|
568f87eb8f | ||
|
|
968c21d80a | ||
|
|
6faeef6dc2 | ||
|
|
08c9511acc | ||
|
|
1644f341f9 | ||
|
|
17fc1e7be1 | ||
|
|
7492b3a203 | ||
|
|
681baedab2 | ||
|
|
c7c3ae381b | ||
|
|
7543da0bb3 | ||
|
|
83ac4f0c33 | ||
|
|
3c42dfd42b | ||
|
|
e3188c918a | ||
|
|
045672cf67 | ||
|
|
345ed18454 | ||
|
|
5462ca01fd | ||
|
|
4bfd8a8cef | ||
|
|
a2a12b5802 | ||
|
|
b6c1dc1fa8 | ||
|
|
f4f8bb377a | ||
|
|
5c21695db6 | ||
|
|
2c16b204ff | ||
|
|
20f7fd5b08 | ||
|
|
c9a7d24538 | ||
|
|
108cae5189 | ||
|
|
358be9e727 | ||
|
|
2a6388d50b | ||
|
|
aa901a22c2 | ||
|
|
562495b878 | ||
|
|
875728da83 | ||
|
|
47e7e004b1 | ||
|
|
80bd3254cc | ||
|
|
0bf8a25d50 | ||
|
|
effb8f189b | ||
|
|
7eeefc1497 | ||
|
|
025a5ba140 | ||
|
|
885d705d55 | ||
|
|
3447bc2ed3 | ||
|
|
f1f861fd74 | ||
|
|
58ba802ca6 | ||
|
|
73f3b92dc9 | ||
|
|
eeb10f3f7d | ||
|
|
8544f8ae68 | ||
|
|
9f5ce53544 | ||
|
|
82b6a42a3c | ||
|
|
0974479655 | ||
|
|
918e1878a5 | ||
|
|
17deafd05f | ||
|
|
b7ae984ca1 | ||
|
|
e848c3f226 | ||
|
|
cd3de9c788 | ||
|
|
945ad77bce | ||
|
|
04a99deb0e | ||
|
|
cff5dc0ee8 | ||
|
|
77ccf77e35 | ||
|
|
864a726249 | ||
|
|
1407683f95 | ||
|
|
1f928e9b6e | ||
|
|
e0cf77c660 | ||
|
|
07a685bd3d | ||
|
|
80ad8d57f2 | ||
|
|
41b45599c6 | ||
|
|
416e896c63 | ||
|
|
2d1e0dc240 | ||
|
|
c52e7c57d2 | ||
|
|
c4a60f9059 | ||
|
|
15fe30ac41 | ||
|
|
a014f1c566 | ||
|
|
73b0b35a42 | ||
|
|
75524d0ae3 | ||
|
|
c21dc25a65 | ||
|
|
3bc0f90a7c | ||
|
|
eaa1cd5553 | ||
|
|
6019665d4b | ||
|
|
b7b0e28b10 | ||
|
|
c577c64aa7 | ||
|
|
1560a866fe | ||
|
|
5b9e1e5708 | ||
|
|
353f724a9c | ||
|
|
a8ff7be642 | ||
|
|
af67ee77a0 | ||
|
|
b82656d9fc | ||
|
|
7b9201a0fc | ||
|
|
627d60c6c7 | ||
|
|
c00f0787f0 | ||
|
|
3ca0fcb67a | ||
|
|
43107f48fa | ||
|
|
b1273e53d8 | ||
|
|
10e57fdc1e | ||
|
|
fad3db84f0 | ||
|
|
fccab2f0da | ||
|
|
885f9372f4 | ||
|
|
509a2c5a69 | ||
|
|
b433beb016 | ||
|
|
c71bad205c | ||
|
|
d4794bbac8 | ||
|
|
6fa35839c3 | ||
|
|
35d551c174 | ||
|
|
4674ee16a1 | ||
|
|
ce2ef65122 | ||
|
|
0d88dcb0fa | ||
|
|
15f727dc2f | ||
|
|
dcfec52b11 | ||
|
|
7ca4ca8972 | ||
|
|
76ed8d8086 | ||
|
|
1f126cd91a | ||
|
|
5e520884cd | ||
|
|
1c5b318207 | ||
|
|
1b1760a9c9 | ||
|
|
751ff68268 | ||
|
|
3c785c88fb | ||
|
|
8efa01bd62 | ||
|
|
e17709a2d3 | ||
|
|
c50400e186 | ||
|
|
ff965af067 | ||
|
|
48d642e9e0 | ||
|
|
e197b7c3a0 | ||
|
|
95e466628b | ||
|
|
41dda11802 | ||
|
|
8ba332b43a | ||
|
|
52894121ea | ||
|
|
a5e83189df | ||
|
|
405e2d1517 | ||
|
|
483b73c4bf | ||
|
|
cb97baed22 | ||
|
|
01df0e6ef0 | ||
|
|
08aa40c570 | ||
|
|
82fcb38005 | ||
|
|
fc80683256 | ||
|
|
54be1d7705 | ||
|
|
7eed9d893e | ||
|
|
e77f9036e0 | ||
|
|
5a6ef045aa | ||
|
|
9350f6bc0b | ||
|
|
4ccf6fb284 | ||
|
|
83f2432da6 | ||
|
|
f673a84c75 | ||
|
|
51680dbfdc | ||
|
|
1aa36e27cb | ||
|
|
e6285a1cc8 | ||
|
|
a064ae71ad | ||
|
|
f9e78c419f | ||
|
|
0fb864e0ca | ||
|
|
a4da0acb0e | ||
|
|
f47def8515 | ||
|
|
14398ae27e | ||
|
|
64d351b102 | ||
|
|
6b577a3970 | ||
|
|
a159850cce | ||
|
|
87eedc29d5 | ||
|
|
124392ee98 | ||
|
|
e5421c56b1 | ||
|
|
407f42718c | ||
|
|
a36355cefb | ||
|
|
2d21567271 | ||
|
|
611b296a6a | ||
|
|
317998fdd6 | ||
|
|
ab40b0e054 | ||
|
|
2c3dc5176b | ||
|
|
5fc4538477 | ||
|
|
be0896e204 | ||
|
|
56f1e5a362 | ||
|
|
702da52312 | ||
|
|
2a8956a268 | ||
|
|
86b1aa02b3 | ||
|
|
065eae5a95 | ||
|
|
9fa13aec09 | ||
|
|
3e703c4c76 | ||
|
|
01453be2d1 | ||
|
|
9b32516bcb | ||
|
|
7e787d2a5a | ||
|
|
b7a32b87ab | ||
|
|
0491ff4186 | ||
|
|
943c72c8a1 | ||
|
|
cb6f4b9f4d | ||
|
|
45bd2264e3 | ||
|
|
8733748eb6 | ||
|
|
66fa317390 | ||
|
|
ef0e96a2b2 | ||
|
|
b0d326dfb9 | ||
|
|
517d5ecde9 | ||
|
|
072f2f15ea | ||
|
|
0cd7fa1a63 | ||
|
|
2fe0f90d36 | ||
|
|
0783b4bf0e | ||
|
|
4f96bc416b | ||
|
|
f43ecd8aa2 | ||
|
|
31db26b054 | ||
|
|
f5675284c7 | ||
|
|
98d253d9bb | ||
|
|
9846383b01 | ||
|
|
fbe4ed206a | ||
|
|
15263664b6 | ||
|
|
4611b84352 | ||
|
|
922ff08a80 | ||
|
|
4c933f733b | ||
|
|
f1c3e87a06 | ||
|
|
0bfe3760f6 | ||
|
|
68bc548dce | ||
|
|
7d4cef53a8 | ||
|
|
b400b36ca5 | ||
|
|
36d4f09d28 | ||
|
|
e77e1c1a58 | ||
|
|
6e1ef49ad4 | ||
|
|
2daade39a9 | ||
|
|
ae78441b25 |
45
.github/ISSUE_TEMPLATE/3-typescript-bug-report.yml
vendored
Normal file
45
.github/ISSUE_TEMPLATE/3-typescript-bug-report.yml
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
name: 🇹 TypeScript Type Bug Report
|
||||
description: Report an issue with TypeScript types
|
||||
labels: [bug, typescript]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thank you for submitting a bug report. It helps make Bun better.
|
||||
|
||||
If you need help or support using Bun, and are not reporting a bug, please
|
||||
join our [Discord](https://discord.gg/CXdq2DP29u) server, where you can ask questions in the [`#help`](https://discord.gg/32EtH6p7HN) forum.
|
||||
|
||||
Make sure you are running the [latest](https://bun.sh/docs/installation#upgrading) version of Bun.
|
||||
The bug you are experiencing may already have been fixed.
|
||||
|
||||
Please try to include as much information as possible.
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: What version of Bun is running?
|
||||
description: Copy the output of `bun --revision`
|
||||
- type: input
|
||||
attributes:
|
||||
label: What platform is your computer?
|
||||
description: |
|
||||
For MacOS and Linux: copy the output of `uname -mprs`
|
||||
For Windows: copy the output of `"$([Environment]::OSVersion | ForEach-Object VersionString) $(if ([Environment]::Is64BitOperatingSystem) { "x64" } else { "x86" })"` in the PowerShell console
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What steps can reproduce the bug?
|
||||
description: Explain the bug and provide a code snippet that can reproduce it.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What is the expected behavior?
|
||||
description: If possible, please provide text instead of a screenshot.
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What do you see instead?
|
||||
description: If possible, please provide text instead of a screenshot.
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional information
|
||||
description: Is there anything else you think we should know?
|
||||
2
.github/workflows/bun-linux-build.yml
vendored
2
.github/workflows/bun-linux-build.yml
vendored
@@ -259,6 +259,8 @@ jobs:
|
||||
bun install --cwd=test --verbose
|
||||
bun install --cwd=packages/bun-internal-test --verbose
|
||||
|
||||
bun install --cwd=test/js/third_party/prisma --verbose
|
||||
|
||||
# This is disabled because the cores are ~5.5gb each
|
||||
# so it is easy to hit 50gb coredump downloads. Only enable if you need to retrive one
|
||||
|
||||
|
||||
3
.github/workflows/bun-mac-x64-baseline.yml
vendored
3
.github/workflows/bun-mac-x64-baseline.yml
vendored
@@ -379,7 +379,8 @@ jobs:
|
||||
name: macOS Test
|
||||
runs-on: ${{ matrix.runner }}
|
||||
needs: [macOS]
|
||||
if: github.event_name == 'pull_request' && github.repository_owner == 'oven-sh'
|
||||
# if: github.event_name == 'pull_request' && github.repository_owner == 'oven-sh'
|
||||
if: false
|
||||
permissions:
|
||||
pull-requests: write
|
||||
timeout-minutes: 30
|
||||
|
||||
10
.github/workflows/bun-release.yml
vendored
10
.github/workflows/bun-release.yml
vendored
@@ -111,9 +111,15 @@ jobs:
|
||||
with:
|
||||
node-version: latest
|
||||
- name: Setup Bun
|
||||
if: ${{ env.BUN_VERSION != 'canary' }}
|
||||
uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: "1.0.21"
|
||||
- name: Setup Bun
|
||||
if: ${{ env.BUN_VERSION == 'canary' }}
|
||||
uses: oven-sh/setup-bun@v1
|
||||
with:
|
||||
bun-version: "canary" # Must be 'canary' so tag is correct
|
||||
- name: Install Dependencies
|
||||
run: bun install
|
||||
- name: Setup Tag
|
||||
@@ -131,14 +137,14 @@ jobs:
|
||||
if: ${{ env.BUN_VERSION == 'canary' }}
|
||||
uses: JS-DevTools/npm-publish@v1
|
||||
with:
|
||||
package: packages/bun-types/dist/package.json
|
||||
package: packages/bun-types/package.json
|
||||
token: ${{ secrets.NPM_TOKEN }}
|
||||
tag: canary
|
||||
- name: Release (latest)
|
||||
if: ${{ env.BUN_LATEST == 'true' }}
|
||||
uses: JS-DevTools/npm-publish@v1
|
||||
with:
|
||||
package: packages/bun-types/dist/package.json
|
||||
package: packages/bun-types/package.json
|
||||
token: ${{ secrets.NPM_TOKEN }}
|
||||
docker:
|
||||
name: Release to Dockerhub
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
name: bun-windows-x64
|
||||
name: bun-windows
|
||||
|
||||
concurrency:
|
||||
group: bun-windows-x64-${{ github.ref }}
|
||||
group: bun-windows-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
@@ -9,7 +9,7 @@ env:
|
||||
LLVM_VERSION: 16.0.6
|
||||
BUN_DOWNLOAD_URL_BASE: https://pub-5e11e972747a44bf9aaf9394f185a982.r2.dev/releases/latest
|
||||
|
||||
tag: bun-windows-x64
|
||||
tag: bun-windows
|
||||
# TODO: wire this up to workflow_dispatch.
|
||||
# github's expression syntax makes this hard to set a default to true
|
||||
canary: true
|
||||
@@ -57,6 +57,7 @@ jobs:
|
||||
timeout-minutes: 60
|
||||
if: github.repository_owner == 'oven-sh'
|
||||
steps:
|
||||
- run: git config --global core.autocrlf false && git config --global core.eol lf
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
@@ -103,7 +104,7 @@ jobs:
|
||||
- name: Upload Zig Object
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}-zig${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}-zig${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
path: ${{runner.temp}}/release/bun-zig.o
|
||||
|
||||
windows-dependencies:
|
||||
@@ -116,6 +117,7 @@ jobs:
|
||||
cpu: [haswell, nehalem]
|
||||
arch: [x86_64]
|
||||
steps:
|
||||
- run: git config --global core.autocrlf false && git config --global core.eol lf
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Clone Submodules
|
||||
@@ -127,7 +129,8 @@ jobs:
|
||||
git submodule | Where-Object { $_ -notmatch 'WebKit' }
|
||||
clang --version
|
||||
rustc --version
|
||||
Get-Content -Path (Get-ChildItem -Path 'scripts/build*.sh', 'scripts/all-dependencies.sh' | Sort-Object -Property Name).FullName | Out-String
|
||||
Get-Content -Path (Get-ChildItem -Path 'scripts/build*.ps1', 'scripts/all-dependencies.ps1', 'scripts/env.ps1' | Sort-Object -Property Name).FullName | Out-String
|
||||
echo 1
|
||||
})"
|
||||
$hash = ( -join ((New-Object -TypeName System.Security.Cryptography.SHA1CryptoServiceProvider).ComputeHash([System.Text.Encoding]::UTF8.GetBytes($data)) | ForEach-Object { $_.ToString("x2") } )).Substring(0, 10)
|
||||
echo "sha=${hash}" >> $env:GITHUB_OUTPUT
|
||||
@@ -138,7 +141,7 @@ jobs:
|
||||
uses: actions/cache/restore@v3
|
||||
with:
|
||||
path: bun-deps
|
||||
key: bun-deps-${{ env.tag }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-${{ steps.submodule-versions.outputs.sha }}
|
||||
key: bun-deps-${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-${{ steps.submodule-versions.outputs.sha }}
|
||||
|
||||
- name: Install LLVM ${{ env.LLVM_VERSION }}
|
||||
if: ${{ !steps.cache-deps-restore.outputs.cache-hit }}
|
||||
@@ -164,7 +167,7 @@ jobs:
|
||||
- name: Upload Dependencies
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}-deps${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}-deps${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
path: bun-deps/
|
||||
|
||||
- name: Cache Dependencies
|
||||
@@ -175,11 +178,20 @@ jobs:
|
||||
path: bun-deps
|
||||
key: ${{ steps.cache-deps-restore.outputs.cache-primary-key }}
|
||||
|
||||
# TODO(@paperdave): stop relying on this and use bun.exe to build itself.
|
||||
# we cant do that now because there isn't a tagged release to use.
|
||||
#
|
||||
# and at the time of writing, the minimum canary required to work is not
|
||||
# yet released as it is the one *this* commit.
|
||||
windows-codegen:
|
||||
name: Codegen
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
if: github.repository_owner == 'oven-sh'
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
arch: [x86_64]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- run: |
|
||||
@@ -194,7 +206,7 @@ jobs:
|
||||
echo "canary_revision=$(GITHUB_TOKEN="${{ secrets.GITHUB_TOKEN }}" bash ./scripts/calculate-canary-revision.sh --raw)" > build-codegen-win32-x64/.canary_revision
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}-codegen
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}-codegen
|
||||
path: build-codegen-win32-x64/
|
||||
|
||||
windows-cpp:
|
||||
@@ -209,6 +221,7 @@ jobs:
|
||||
cpu: [haswell, nehalem]
|
||||
arch: [x86_64]
|
||||
steps:
|
||||
- run: git config --global core.autocrlf false && git config --global core.eol lf
|
||||
- uses: actions/checkout@v4
|
||||
- uses: KyleMayes/install-llvm-action@1a3da29f56261a1e1f937ec88f0856a9b8321d7e
|
||||
with:
|
||||
@@ -217,7 +230,7 @@ jobs:
|
||||
- name: Download Codegen
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}-codegen
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}-codegen
|
||||
path: build
|
||||
- name: Build C++
|
||||
run: |
|
||||
@@ -252,7 +265,7 @@ jobs:
|
||||
if ($LASTEXITCODE -ne 0) { throw "C++ compilation failed" }
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}-cpp${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}-cpp${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
path: build/bun-cpp-objects.a
|
||||
|
||||
windows-link:
|
||||
@@ -263,11 +276,12 @@ jobs:
|
||||
arch: [x86_64]
|
||||
name: Link
|
||||
needs: [windows-dependencies, windows-codegen, windows-cpp, windows-zig]
|
||||
runs-on: windows-latest
|
||||
runs-on: windows-small
|
||||
if: github.repository_owner == 'oven-sh'
|
||||
timeout-minutes: 30
|
||||
permissions: write-all
|
||||
steps:
|
||||
- run: git config --global core.autocrlf false && git config --global core.eol lf
|
||||
- uses: actions/checkout@v4
|
||||
- uses: KyleMayes/install-llvm-action@1a3da29f56261a1e1f937ec88f0856a9b8321d7e
|
||||
with:
|
||||
@@ -276,22 +290,22 @@ jobs:
|
||||
- name: Download Codegen
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}-codegen
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}-codegen
|
||||
path: build
|
||||
- name: Download Dependencies
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}-deps${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}-deps${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
path: bun-deps
|
||||
- name: Download Zig Object
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}-zig${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}-zig${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
path: bun-zig
|
||||
- name: Download C++ Objects
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}-cpp${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}-cpp${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
path: bun-cpp
|
||||
- name: Link
|
||||
run: |
|
||||
@@ -313,13 +327,23 @@ jobs:
|
||||
if ($LASTEXITCODE -ne 0) { throw "Link failed!" }
|
||||
- name: Package
|
||||
run: |
|
||||
$Dist = mkdir -Force "${{ env.tag }}"
|
||||
$Dist = mkdir -Force "${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}"
|
||||
cp -r build\bun.exe "$Dist\bun.exe"
|
||||
Compress-Archive $Dist ${{ env.tag }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}.zip
|
||||
Compress-Archive "$Dist" "${Dist}.zip"
|
||||
$Dist = "$Dist-profile"
|
||||
MkDir -Force "$Dist"
|
||||
cp -r build\bun.exe "$Dist\bun.exe"
|
||||
cp -r build\bun.pdb "$Dist\bun.pdb"
|
||||
Compress-Archive "$Dist" "$Dist.zip"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
path: ${{ env.tag }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}.zip
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}
|
||||
path: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}.zip
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile
|
||||
path: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile.zip
|
||||
- name: Release
|
||||
id: release
|
||||
uses: ncipollo/release-action@v1
|
||||
@@ -336,7 +360,7 @@ jobs:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
name: "Canary (${{github.sha}})"
|
||||
tag: "canary"
|
||||
artifacts: "${{env.tag}}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}.zip"
|
||||
artifacts: "${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}.zip,${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile.zip"
|
||||
- uses: sarisia/actions-status-discord@v1
|
||||
if: failure() && github.repository_owner == 'oven-sh' && github.event_name == 'pull_request'
|
||||
with:
|
||||
@@ -346,13 +370,128 @@ jobs:
|
||||
noprefix: true
|
||||
nocontext: true
|
||||
description: |
|
||||
Pull Request
|
||||
### [${{github.event.pull_request.title}}](https://github.com/oven-sh/bun/pull/${{github.event.number}})
|
||||
|
||||
@${{ github.actor }}
|
||||
|
||||
Build failed on ${{ env.tag }}:
|
||||
Build failed on Windows ${{ matrix.arch }}${{ matrix.cpu == 'nehalem' && ' Baseline' || '' }}
|
||||
|
||||
**[View build output](https://github.com/oven-sh/bun/actions/runs/${{github.run_id}})**
|
||||
**[Build Output](https://github.com/oven-sh/bun/actions/runs/${{github.run_id}})** | [Commit](https://github.com/oven-sh/bun/commits/${{github.sha}})
|
||||
windows-test:
|
||||
name: Test
|
||||
runs-on: windows-small
|
||||
needs: [windows-link]
|
||||
if: github.event_name == 'pull_request' && github.repository_owner == 'oven-sh'
|
||||
permissions:
|
||||
pull-requests: write
|
||||
timeout-minutes: 180
|
||||
outputs:
|
||||
failing_tests: ${{ steps.test.outputs.failing_tests }}
|
||||
failing_tests_count: ${{ steps.test.outputs.failing_tests_count }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# TODO: test baseline, disabled due to noise
|
||||
cpu: [haswell]
|
||||
arch: [x86_64]
|
||||
steps:
|
||||
- run: git config --global core.autocrlf false && git config --global core.eol lf
|
||||
- id: checkout
|
||||
name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
- id: download
|
||||
name: Download Release
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ${{ env.tag }}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile
|
||||
path: ${{runner.temp}}/release
|
||||
- name: Install Bun
|
||||
run: |
|
||||
cd ${{runner.temp}}/release
|
||||
unzip ${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile.zip
|
||||
cd ${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile
|
||||
pwd >> $env:GITHUB_PATH
|
||||
- name: Install Node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
# bun install --verbose
|
||||
# bun install --cwd=test --verbose
|
||||
# bun install --cwd=packages/bun-internal-test --verbose
|
||||
|
||||
[Commit ${{github.sha}}](https://github.com/oven-sh/bun/commits/${{github.sha}})
|
||||
npm install
|
||||
cd test && npm install
|
||||
cd ../packages/bun-internal-test && npm install
|
||||
cd ../..
|
||||
- id: test
|
||||
name: Run tests
|
||||
env:
|
||||
SMTP_SENDGRID_SENDER: ${{ secrets.SMTP_SENDGRID_SENDER }}
|
||||
TLS_MONGODB_DATABASE_URL: ${{ secrets.TLS_MONGODB_DATABASE_URL }}
|
||||
TLS_POSTGRES_DATABASE_URL: ${{ secrets.TLS_POSTGRES_DATABASE_URL }}
|
||||
run: |
|
||||
try {
|
||||
$ErrorActionPreference = "SilentlyContinue"
|
||||
$null = node packages/bun-internal-test/src/runner.node.mjs ${{runner.temp}}/release/${{env.tag}}-${{ matrix.arch == 'x86_64' && 'x64' || 'aarch64' }}${{ matrix.cpu == 'nehalem' && '-baseline' || '' }}-profile/bun.exe || $true
|
||||
} catch {}
|
||||
$ErrorActionPreference = "Stop"
|
||||
- uses: sarisia/actions-status-discord@v1
|
||||
if: always() && steps.test.outputs.failing_tests != '' && github.event_name == 'pull_request'
|
||||
with:
|
||||
title: ""
|
||||
webhook: ${{ secrets.DISCORD_WEBHOOK_WINTEST }}
|
||||
status: "failure"
|
||||
noprefix: true
|
||||
nocontext: true
|
||||
description: |
|
||||
### ❌🪟 [${{github.event.pull_request.title}}](https://github.com/oven-sh/bun/pull/${{github.event.number}})
|
||||
|
||||
@${{ github.actor }}, there are **${{ steps.test.outputs.failing_test_count }} failing tests** on Windows ${{ matrix.arch }}${{ matrix.cpu == 'nehalem' && ' Baseline' || '' }}
|
||||
|
||||
${{ steps.test.outputs.failing_tests }}
|
||||
|
||||
[Full Test Output](https://github.com/oven-sh/bun/actions/runs/${{github.run_id}})
|
||||
- uses: sarisia/actions-status-discord@v1
|
||||
if: always() && steps.test.outputs.regressing_tests != '' && github.event_name == 'pull_request'
|
||||
with:
|
||||
title: ""
|
||||
webhook: ${{ secrets.DISCORD_WEBHOOK }}
|
||||
status: "failure"
|
||||
noprefix: true
|
||||
nocontext: true
|
||||
description: |
|
||||
### ❌🪟 [${{github.event.pull_request.title}}](https://github.com/oven-sh/bun/pull/${{github.event.number}})
|
||||
|
||||
@${{ github.actor }}, there are **${{ steps.test.outputs.regressing_test_count }} test regressions** on Windows ${{ matrix.arch }}${{ matrix.cpu == 'nehalem' && ' Baseline' || '' }}
|
||||
|
||||
${{ steps.test.outputs.regressing_tests }}
|
||||
|
||||
[Full Test Output](https://github.com/oven-sh/bun/actions/runs/${{github.run_id}})
|
||||
- name: Comment on PR
|
||||
if: always() && steps.test.outputs.regressing_tests != '' && github.event_name == 'pull_request'
|
||||
uses: thollander/actions-comment-pull-request@v2
|
||||
with:
|
||||
comment_tag: test-windows-${{ matrix.arch }}-${{ matrix.cpu }}
|
||||
message: |
|
||||
### ❌🪟 @${{ github.actor }}, there are **${{ steps.test.outputs.regressing_test_count }} test regressions** on Windows ${{ matrix.arch }}${{ matrix.cpu == 'nehalem' && ' Baseline' || '' }}
|
||||
|
||||
${{ steps.test.outputs.regressing_tests }}
|
||||
|
||||
[Full Test Output](https://github.com/oven-sh/bun/actions/runs/${{github.run_id}})
|
||||
- name: Uncomment on PR
|
||||
if: steps.test.outputs.regressing_tests == '' && github.event_name == 'pull_request'
|
||||
uses: thollander/actions-comment-pull-request@v2
|
||||
with:
|
||||
comment_tag: test-windows-${{ matrix.arch }}-${{ matrix.cpu }}
|
||||
mode: upsert
|
||||
create_if_not_exists: false
|
||||
message: |
|
||||
✅🪟 Test regressions on Windows ${{ matrix.arch }}${{ matrix.cpu == 'nehalem' && ' Baseline' || '' }} have been resolved.
|
||||
- id: fail
|
||||
name: Fail the build
|
||||
if: steps.test.outputs.regressing_tests != '' && github.event_name == 'pull_request'
|
||||
run: exit 1
|
||||
332
.gitignore
vendored
332
.gitignore
vendored
@@ -1,164 +1,168 @@
|
||||
.DS_Store
|
||||
zig-cache
|
||||
packages/*/*.wasm
|
||||
*.o
|
||||
*.a
|
||||
profile.json
|
||||
|
||||
node_modules
|
||||
.envrc
|
||||
.swcrc
|
||||
yarn.lock
|
||||
dist
|
||||
*.tmp
|
||||
*.log
|
||||
*.out.js
|
||||
*.out.refresh.js
|
||||
**/package-lock.json
|
||||
build
|
||||
*.wat
|
||||
zig-out
|
||||
pnpm-lock.yaml
|
||||
README.md.template
|
||||
src/deps/zig-clap/example
|
||||
src/deps/zig-clap/README.md
|
||||
src/deps/zig-clap/.github
|
||||
src/deps/zig-clap/.gitattributes
|
||||
out
|
||||
outdir
|
||||
|
||||
.trace
|
||||
cover
|
||||
coverage
|
||||
coverv
|
||||
*.trace
|
||||
github
|
||||
out.*
|
||||
out
|
||||
.parcel-cache
|
||||
esbuilddir
|
||||
*.bun
|
||||
parceldist
|
||||
esbuilddir
|
||||
outdir/
|
||||
outcss
|
||||
.next
|
||||
txt.js
|
||||
.idea
|
||||
.vscode/cpp*
|
||||
.vscode/clang*
|
||||
|
||||
node_modules_*
|
||||
*.jsb
|
||||
*.zip
|
||||
bun-zigld
|
||||
bun-singlehtreaded
|
||||
bun-nomimalloc
|
||||
bun-mimalloc
|
||||
examples/lotta-modules/bun-yday
|
||||
examples/lotta-modules/bun-old
|
||||
examples/lotta-modules/bun-nofscache
|
||||
|
||||
src/node-fallbacks/out/*
|
||||
src/node-fallbacks/node_modules
|
||||
sign.json
|
||||
release/
|
||||
*.dmg
|
||||
sign.*.json
|
||||
packages/debug-*
|
||||
packages/bun-cli/postinstall.js
|
||||
packages/bun-*/bun
|
||||
packages/bun-*/bun-profile
|
||||
packages/bun-*/debug-bun
|
||||
packages/bun-*/*.o
|
||||
packages/bun-cli/postinstall.js
|
||||
|
||||
packages/bun-cli/bin/*
|
||||
bun-test-scratch
|
||||
misctools/fetch
|
||||
|
||||
src/deps/libiconv
|
||||
src/deps/openssl
|
||||
src/tests.zig
|
||||
*.blob
|
||||
src/deps/s2n-tls
|
||||
.npm
|
||||
.npm.gz
|
||||
|
||||
bun-binary
|
||||
|
||||
src/deps/PLCrashReporter/
|
||||
|
||||
*.dSYM
|
||||
*.crash
|
||||
misctools/sha
|
||||
packages/bun-wasm/*.mjs
|
||||
packages/bun-wasm/*.cjs
|
||||
packages/bun-wasm/*.map
|
||||
packages/bun-wasm/*.js
|
||||
packages/bun-wasm/*.d.ts
|
||||
packages/bun-wasm/*.d.cts
|
||||
packages/bun-wasm/*.d.mts
|
||||
*.bc
|
||||
|
||||
src/fallback.version
|
||||
src/runtime.version
|
||||
*.sqlite
|
||||
*.database
|
||||
*.db
|
||||
misctools/machbench
|
||||
*.big
|
||||
.eslintcache
|
||||
|
||||
/bun-webkit
|
||||
|
||||
src/deps/c-ares/build
|
||||
src/bun.js/bindings-obj
|
||||
src/bun.js/debug-bindings-obj
|
||||
|
||||
failing-tests.txt
|
||||
test.txt
|
||||
myscript.sh
|
||||
|
||||
cold-jsc-start
|
||||
cold-jsc-start.d
|
||||
|
||||
/test.ts
|
||||
/test.js
|
||||
|
||||
src/js/out/modules*
|
||||
src/js/out/functions*
|
||||
src/js/out/tmp
|
||||
src/js/out/DebugPath.h
|
||||
|
||||
make-dev-stats.csv
|
||||
|
||||
.uuid
|
||||
tsconfig.tsbuildinfo
|
||||
|
||||
test/js/bun/glob/fixtures
|
||||
*.lib
|
||||
*.pdb
|
||||
CMakeFiles
|
||||
build.ninja
|
||||
.ninja_deps
|
||||
.ninja_log
|
||||
CMakeCache.txt
|
||||
cmake_install.cmake
|
||||
compile_commands.json
|
||||
|
||||
*.lib
|
||||
x64
|
||||
**/*.vcxproj*
|
||||
**/*.sln*
|
||||
**/*.dir
|
||||
**/*.pdb
|
||||
|
||||
/.webkit-cache
|
||||
/.cache
|
||||
/src/deps/libuv
|
||||
/build-*/
|
||||
|
||||
.vs
|
||||
|
||||
**/.verdaccio-db.json
|
||||
.DS_Store
|
||||
zig-cache
|
||||
packages/*/*.wasm
|
||||
*.o
|
||||
*.a
|
||||
profile.json
|
||||
|
||||
.env
|
||||
node_modules
|
||||
.envrc
|
||||
.swcrc
|
||||
yarn.lock
|
||||
dist
|
||||
*.tmp
|
||||
*.log
|
||||
*.out.js
|
||||
*.out.refresh.js
|
||||
**/package-lock.json
|
||||
build
|
||||
*.wat
|
||||
zig-out
|
||||
pnpm-lock.yaml
|
||||
README.md.template
|
||||
src/deps/zig-clap/example
|
||||
src/deps/zig-clap/README.md
|
||||
src/deps/zig-clap/.github
|
||||
src/deps/zig-clap/.gitattributes
|
||||
out
|
||||
outdir
|
||||
|
||||
.trace
|
||||
cover
|
||||
coverage
|
||||
coverv
|
||||
*.trace
|
||||
github
|
||||
out.*
|
||||
out
|
||||
.parcel-cache
|
||||
esbuilddir
|
||||
*.bun
|
||||
parceldist
|
||||
esbuilddir
|
||||
outdir/
|
||||
outcss
|
||||
.next
|
||||
txt.js
|
||||
.idea
|
||||
.vscode/cpp*
|
||||
.vscode/clang*
|
||||
|
||||
node_modules_*
|
||||
*.jsb
|
||||
*.zip
|
||||
bun-zigld
|
||||
bun-singlehtreaded
|
||||
bun-nomimalloc
|
||||
bun-mimalloc
|
||||
examples/lotta-modules/bun-yday
|
||||
examples/lotta-modules/bun-old
|
||||
examples/lotta-modules/bun-nofscache
|
||||
|
||||
src/node-fallbacks/out/*
|
||||
src/node-fallbacks/node_modules
|
||||
sign.json
|
||||
release/
|
||||
*.dmg
|
||||
sign.*.json
|
||||
packages/debug-*
|
||||
packages/bun-cli/postinstall.js
|
||||
packages/bun-*/bun
|
||||
packages/bun-*/bun-profile
|
||||
packages/bun-*/debug-bun
|
||||
packages/bun-*/*.o
|
||||
packages/bun-cli/postinstall.js
|
||||
|
||||
packages/bun-cli/bin/*
|
||||
bun-test-scratch
|
||||
misctools/fetch
|
||||
|
||||
src/deps/libiconv
|
||||
src/deps/openssl
|
||||
src/tests.zig
|
||||
*.blob
|
||||
src/deps/s2n-tls
|
||||
.npm
|
||||
.npm.gz
|
||||
|
||||
bun-binary
|
||||
|
||||
src/deps/PLCrashReporter/
|
||||
|
||||
*.dSYM
|
||||
*.crash
|
||||
misctools/sha
|
||||
packages/bun-wasm/*.mjs
|
||||
packages/bun-wasm/*.cjs
|
||||
packages/bun-wasm/*.map
|
||||
packages/bun-wasm/*.js
|
||||
packages/bun-wasm/*.d.ts
|
||||
packages/bun-wasm/*.d.cts
|
||||
packages/bun-wasm/*.d.mts
|
||||
*.bc
|
||||
|
||||
src/fallback.version
|
||||
src/runtime.version
|
||||
*.sqlite
|
||||
*.database
|
||||
*.db
|
||||
misctools/machbench
|
||||
*.big
|
||||
.eslintcache
|
||||
|
||||
/bun-webkit
|
||||
|
||||
src/deps/c-ares/build
|
||||
src/bun.js/bindings-obj
|
||||
src/bun.js/debug-bindings-obj
|
||||
|
||||
failing-tests.txt
|
||||
test.txt
|
||||
myscript.sh
|
||||
|
||||
cold-jsc-start
|
||||
cold-jsc-start.d
|
||||
|
||||
/testdir
|
||||
/test.ts
|
||||
/test.js
|
||||
|
||||
src/js/out/modules*
|
||||
src/js/out/functions*
|
||||
src/js/out/tmp
|
||||
src/js/out/DebugPath.h
|
||||
|
||||
make-dev-stats.csv
|
||||
|
||||
.uuid
|
||||
tsconfig.tsbuildinfo
|
||||
|
||||
test/js/bun/glob/fixtures
|
||||
*.lib
|
||||
*.pdb
|
||||
CMakeFiles
|
||||
build.ninja
|
||||
.ninja_deps
|
||||
.ninja_log
|
||||
CMakeCache.txt
|
||||
cmake_install.cmake
|
||||
compile_commands.json
|
||||
|
||||
*.lib
|
||||
x64
|
||||
**/*.vcxproj*
|
||||
**/*.sln*
|
||||
**/*.dir
|
||||
**/*.pdb
|
||||
|
||||
/.webkit-cache
|
||||
/.cache
|
||||
/src/deps/libuv
|
||||
/build-*/
|
||||
|
||||
.vs
|
||||
|
||||
**/.verdaccio-db.json
|
||||
/test-report.md
|
||||
/test-report.json
|
||||
@@ -1,13 +0,0 @@
|
||||
src/fallback.html
|
||||
src/bun.js/WebKit
|
||||
src/js/out
|
||||
src/*.out.js
|
||||
src/*out.*.js
|
||||
src/deps
|
||||
src/test/fixtures
|
||||
src/react-refresh.js
|
||||
test/snapshots
|
||||
test/snapshots-no-hmr
|
||||
test/js/deno/*.test.ts
|
||||
test/js/deno/**/*.test.ts
|
||||
bench/react-hello-world/react-hello-world.node.js
|
||||
@@ -1,15 +0,0 @@
|
||||
module.exports = {
|
||||
arrowParens: "avoid",
|
||||
printWidth: 120,
|
||||
trailingComma: "all",
|
||||
useTabs: false,
|
||||
quoteProps: "preserve",
|
||||
overrides: [
|
||||
{
|
||||
files: ["*.md"],
|
||||
options: {
|
||||
printWidth: 80,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
1
.vscode/c_cpp_properties.json
vendored
1
.vscode/c_cpp_properties.json
vendored
@@ -3,6 +3,7 @@
|
||||
{
|
||||
"name": "Debug",
|
||||
"forcedInclude": ["${workspaceFolder}/src/bun.js/bindings/root.h"],
|
||||
"compileCommands": "${workspaceFolder}/build/compile_commands.json",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/build/bun-webkit/include",
|
||||
"${workspaceFolder}/build/codegen",
|
||||
|
||||
27
.vscode/extensions.json
vendored
27
.vscode/extensions.json
vendored
@@ -1,10 +1,33 @@
|
||||
{
|
||||
"recommendations": [
|
||||
// Zig
|
||||
"ziglang.vscode-zig",
|
||||
"esbenp.prettier-vscode",
|
||||
|
||||
// C/C++
|
||||
"clang.clangd",
|
||||
"ms-vscode.cmake-tools",
|
||||
"xaver.clang-format",
|
||||
"vadimcn.vscode-lldb",
|
||||
|
||||
// JavaScript
|
||||
"oven.bun-vscode",
|
||||
"biomejs.biome",
|
||||
|
||||
// TypeScript
|
||||
"better-ts-errors.better-ts-errors",
|
||||
"MylesMurphy.prettify-ts",
|
||||
|
||||
// Markdown
|
||||
"bierner.markdown-preview-github-styles",
|
||||
"bierner.markdown-emoji",
|
||||
"bierner.emojisense",
|
||||
"bierner.markdown-checkbox",
|
||||
"bierner.jsdoc-markdown-highlighting",
|
||||
|
||||
// TOML
|
||||
"tamasfe.even-better-toml",
|
||||
|
||||
// Other
|
||||
"bierner.comment-tagged-templates",
|
||||
"ms-vscode.cpptools"
|
||||
]
|
||||
}
|
||||
|
||||
1213
.vscode/launch.json
generated
vendored
1213
.vscode/launch.json
generated
vendored
File diff suppressed because it is too large
Load Diff
228
.vscode/settings.json
vendored
228
.vscode/settings.json
vendored
@@ -1,48 +1,89 @@
|
||||
{
|
||||
"git.autoRepositoryDetection": "openEditors",
|
||||
// Editor
|
||||
"editor.tabSize": 2,
|
||||
"editor.insertSpaces": true,
|
||||
"editor.formatOnSave": true,
|
||||
"editor.formatOnSaveMode": "file",
|
||||
|
||||
// Search
|
||||
"search.quickOpen.includeSymbols": false,
|
||||
"search.seedWithNearestWord": true,
|
||||
"search.smartCase": true,
|
||||
"search.exclude": {
|
||||
"node_modules": true,
|
||||
"src/bun.js/WebKit": true,
|
||||
".git": true,
|
||||
"src/bun.js/WebKit": true,
|
||||
"src/deps/*/**": true
|
||||
},
|
||||
"search.followSymlinks": false,
|
||||
"search.useIgnoreFiles": true,
|
||||
|
||||
// Git
|
||||
"git.autoRepositoryDetection": "openEditors",
|
||||
"git.ignoreSubmodules": true,
|
||||
"git.ignoreLimitWarning": true,
|
||||
|
||||
// Zig
|
||||
"zig.initialSetupDone": true,
|
||||
"zig.buildOnSave": false,
|
||||
"zig.formattingProvider": "zls",
|
||||
"zig.buildOption": "build",
|
||||
"zig.buildFilePath": "${workspaceFolder}/build.zig",
|
||||
"zig.initialSetupDone": true,
|
||||
"editor.formatOnSave": true,
|
||||
"zig.path": "${workspaceFolder}/.cache/zig/zig.exe",
|
||||
"zig.formattingProvider": "zls",
|
||||
"zig.zls.enableInlayHints": false,
|
||||
"[zig]": {
|
||||
"editor.tabSize": 4,
|
||||
"editor.useTabStops": false,
|
||||
"editor.defaultFormatter": "ziglang.vscode-zig"
|
||||
},
|
||||
"[ts]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
|
||||
// C++
|
||||
"lldb.verboseLogging": false,
|
||||
"cmake.configureOnOpen": false,
|
||||
"C_Cpp.errorSquiggles": "enabled",
|
||||
"[cpp]": {
|
||||
"editor.defaultFormatter": "xaver.clang-format"
|
||||
},
|
||||
"[js]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
"[c]": {
|
||||
"editor.defaultFormatter": "xaver.clang-format"
|
||||
},
|
||||
"zig.zls.enableInlayHints": false,
|
||||
"zig.path": "${workspaceFolder}/.cache/zig/zig",
|
||||
"git.ignoreSubmodules": true,
|
||||
"[jsx]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
"[h]": {
|
||||
"editor.defaultFormatter": "xaver.clang-format"
|
||||
},
|
||||
"[tsx]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
|
||||
// JavaScript
|
||||
"prettier.enable": false,
|
||||
"eslint.workingDirectories": ["${workspaceFolder}/packages/bun-types"],
|
||||
"[javascript]": {
|
||||
"editor.defaultFormatter": "biomejs.biome",
|
||||
},
|
||||
"[yaml]": {},
|
||||
"[javascriptreact]": {
|
||||
"editor.defaultFormatter": "biomejs.biome"
|
||||
},
|
||||
|
||||
// TypeScript
|
||||
"typescript.tsdk": "${workspaceFolder}/node_modules/typescript/lib",
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "biomejs.biome"
|
||||
},
|
||||
"[typescriptreact]": {
|
||||
"editor.defaultFormatter": "biomejs.biome"
|
||||
},
|
||||
|
||||
// JSON
|
||||
"[json]": {
|
||||
"editor.defaultFormatter": "biomejs.biome",
|
||||
},
|
||||
"[jsonc]": {
|
||||
"editor.defaultFormatter": "biomejs.biome",
|
||||
},
|
||||
|
||||
// Markdown
|
||||
"[markdown]": {
|
||||
"editor.defaultFormatter": "biomejs.biome",
|
||||
"editor.unicodeHighlight.ambiguousCharacters": false,
|
||||
"editor.unicodeHighlight.invisibleCharacters": false,
|
||||
"diffEditor.ignoreTrimWhitespace": false,
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.wordWrap": "on",
|
||||
"editor.quickSuggestions": {
|
||||
"comments": "off",
|
||||
@@ -50,7 +91,18 @@
|
||||
"other": "off"
|
||||
}
|
||||
},
|
||||
"lldb.verboseLogging": false,
|
||||
|
||||
// TOML
|
||||
"[toml]": {
|
||||
"editor.defaultFormatter": "biomejs.biome",
|
||||
},
|
||||
|
||||
// YAML
|
||||
"[yaml]": {
|
||||
"editor.defaultFormatter": "biomejs.biome",
|
||||
},
|
||||
|
||||
// Files
|
||||
"files.exclude": {
|
||||
"**/.git": true,
|
||||
"**/.svn": true,
|
||||
@@ -60,7 +112,6 @@
|
||||
"**/Thumbs.db": true,
|
||||
"**/*.xcworkspacedata": true,
|
||||
"**/*.xcscheme": true,
|
||||
"**/*.pem": true,
|
||||
"**/*.xcodeproj": true,
|
||||
"src/bun.js/WebKit": true,
|
||||
"src/deps/libarchive": true,
|
||||
@@ -75,7 +126,10 @@
|
||||
"src/deps/tinycc": true,
|
||||
"src/deps/zstd": true,
|
||||
"**/*.i": true,
|
||||
"packages/bun-uws/fuzzing/seed-corpus/**/*": true
|
||||
"packages/bun-uws/fuzzing/seed-corpus": true
|
||||
},
|
||||
"files.associations": {
|
||||
"*.idl": "cpp"
|
||||
},
|
||||
"C_Cpp.files.exclude": {
|
||||
"**/.vscode": true,
|
||||
@@ -95,136 +149,4 @@
|
||||
"WebKit/WebKitBuild": true,
|
||||
"WebKit/WebInspectorUI": true
|
||||
},
|
||||
"[cpp]": {
|
||||
"editor.defaultFormatter": "xaver.clang-format"
|
||||
},
|
||||
"[h]": {
|
||||
"editor.defaultFormatter": "xaver.clang-format"
|
||||
},
|
||||
"[c]": {
|
||||
"editor.defaultFormatter": "xaver.clang-format"
|
||||
},
|
||||
"files.associations": {
|
||||
"*.lock": "yarnlock",
|
||||
"*.idl": "cpp",
|
||||
"memory": "cpp",
|
||||
"iostream": "cpp",
|
||||
"algorithm": "cpp",
|
||||
"random": "cpp",
|
||||
"ios": "cpp",
|
||||
"filesystem": "cpp",
|
||||
"__locale": "cpp",
|
||||
"type_traits": "cpp",
|
||||
"__mutex_base": "cpp",
|
||||
"__string": "cpp",
|
||||
"string": "cpp",
|
||||
"string_view": "cpp",
|
||||
"typeinfo": "cpp",
|
||||
"__config": "cpp",
|
||||
"__nullptr": "cpp",
|
||||
"exception": "cpp",
|
||||
"__bit_reference": "cpp",
|
||||
"atomic": "cpp",
|
||||
"utility": "cpp",
|
||||
"sstream": "cpp",
|
||||
"__functional_base": "cpp",
|
||||
"new": "cpp",
|
||||
"__debug": "cpp",
|
||||
"__errc": "cpp",
|
||||
"__hash_table": "cpp",
|
||||
"__node_handle": "cpp",
|
||||
"__split_buffer": "cpp",
|
||||
"__threading_support": "cpp",
|
||||
"__tuple": "cpp",
|
||||
"array": "cpp",
|
||||
"bit": "cpp",
|
||||
"bitset": "cpp",
|
||||
"cctype": "cpp",
|
||||
"chrono": "cpp",
|
||||
"clocale": "cpp",
|
||||
"cmath": "cpp",
|
||||
"complex": "cpp",
|
||||
"condition_variable": "cpp",
|
||||
"cstdarg": "cpp",
|
||||
"cstddef": "cpp",
|
||||
"cstdint": "cpp",
|
||||
"cstdio": "cpp",
|
||||
"cstdlib": "cpp",
|
||||
"cstring": "cpp",
|
||||
"ctime": "cpp",
|
||||
"cwchar": "cpp",
|
||||
"cwctype": "cpp",
|
||||
"deque": "cpp",
|
||||
"fstream": "cpp",
|
||||
"functional": "cpp",
|
||||
"initializer_list": "cpp",
|
||||
"iomanip": "cpp",
|
||||
"iosfwd": "cpp",
|
||||
"istream": "cpp",
|
||||
"iterator": "cpp",
|
||||
"limits": "cpp",
|
||||
"locale": "cpp",
|
||||
"mutex": "cpp",
|
||||
"optional": "cpp",
|
||||
"ostream": "cpp",
|
||||
"ratio": "cpp",
|
||||
"stack": "cpp",
|
||||
"stdexcept": "cpp",
|
||||
"streambuf": "cpp",
|
||||
"system_error": "cpp",
|
||||
"thread": "cpp",
|
||||
"tuple": "cpp",
|
||||
"unordered_map": "cpp",
|
||||
"unordered_set": "cpp",
|
||||
"vector": "cpp",
|
||||
"__bits": "cpp",
|
||||
"__tree": "cpp",
|
||||
"map": "cpp",
|
||||
"numeric": "cpp",
|
||||
"set": "cpp",
|
||||
"__memory": "cpp",
|
||||
"memory_resource": "cpp",
|
||||
"*.tcc": "cpp",
|
||||
"list": "cpp",
|
||||
"shared_mutex": "cpp",
|
||||
"cinttypes": "cpp",
|
||||
"variant": "cpp",
|
||||
"sysctl.h": "c",
|
||||
"queue": "cpp",
|
||||
"compare": "cpp",
|
||||
"concepts": "cpp",
|
||||
"typeindex": "cpp",
|
||||
"__verbose_abort": "cpp",
|
||||
"__std_stream": "cpp",
|
||||
"any": "cpp",
|
||||
"charconv": "cpp",
|
||||
"csignal": "cpp",
|
||||
"format": "cpp",
|
||||
"forward_list": "cpp",
|
||||
"future": "cpp",
|
||||
"regex": "cpp",
|
||||
"span": "cpp",
|
||||
"valarray": "cpp",
|
||||
"codecvt": "cpp",
|
||||
"xtr1common": "cpp",
|
||||
"stop_token": "cpp",
|
||||
"xfacet": "cpp",
|
||||
"xhash": "cpp",
|
||||
"xiosbase": "cpp",
|
||||
"xlocale": "cpp",
|
||||
"xlocbuf": "cpp",
|
||||
"xlocinfo": "cpp",
|
||||
"xlocmes": "cpp",
|
||||
"xlocmon": "cpp",
|
||||
"xlocnum": "cpp",
|
||||
"xloctime": "cpp",
|
||||
"xmemory": "cpp",
|
||||
"xstring": "cpp",
|
||||
"xtree": "cpp",
|
||||
"xutility": "cpp"
|
||||
},
|
||||
"C_Cpp.errorSquiggles": "enabled",
|
||||
"eslint.workingDirectories": ["packages/bun-types"],
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"cmake.configureOnOpen": false
|
||||
}
|
||||
|
||||
49
.vscode/tasks.json
vendored
49
.vscode/tasks.json
vendored
@@ -2,10 +2,51 @@
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "Rebuild Debug",
|
||||
"command": "ninja",
|
||||
"args": ["-Cbuild"],
|
||||
"type": "process",
|
||||
}
|
||||
"label": "Install Dependencies",
|
||||
"command": "scripts/all-dependencies.sh",
|
||||
"windows": {
|
||||
"command": "scripts/all-dependencies.ps1"
|
||||
},
|
||||
"icon": {
|
||||
"id": "arrow-down"
|
||||
},
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
},
|
||||
{
|
||||
"type": "process",
|
||||
"label": "Setup Environment",
|
||||
"dependsOn": ["Install Dependencies"],
|
||||
"command": "scripts/setup.sh",
|
||||
"windows": {
|
||||
"command": "scripts/setup.ps1"
|
||||
},
|
||||
"icon": {
|
||||
"id": "check"
|
||||
},
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
},
|
||||
{
|
||||
"type": "process",
|
||||
"label": "Build Bun",
|
||||
"dependsOn": ["Setup Environment"],
|
||||
"command": "bun",
|
||||
"args": ["run", "build"],
|
||||
"icon": {
|
||||
"id": "gear"
|
||||
},
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
"isBuildCommand": true,
|
||||
"runOptions": {
|
||||
"instanceLimit": 1,
|
||||
"reevaluateOnRerun": true,
|
||||
},
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
2673
CMakeLists.txt
2673
CMakeLists.txt
File diff suppressed because it is too large
Load Diff
@@ -290,7 +290,6 @@ ENV CCACHE_DIR=/ccache
|
||||
|
||||
COPY Makefile ${BUN_DIR}/Makefile
|
||||
COPY src/deps/zstd ${BUN_DIR}/src/deps/zstd
|
||||
COPY .prettierrc.cjs ${BUN_DIR}/.prettierrc.cjs
|
||||
|
||||
WORKDIR $BUN_DIR
|
||||
|
||||
@@ -378,9 +377,9 @@ RUN --mount=type=cache,target=/ccache mkdir ${BUN_DIR}/build \
|
||||
|
||||
FROM bun-base-with-zig as bun-codegen-for-zig
|
||||
|
||||
COPY package.json bun.lockb Makefile .gitmodules .prettierrc.cjs ${BUN_DIR}/
|
||||
COPY package.json bun.lockb Makefile .gitmodules ${BUN_DIR}/
|
||||
COPY src/runtime ${BUN_DIR}/src/runtime
|
||||
COPY src/runtime.js src/runtime.footer*.js src/react-refresh.js ${BUN_DIR}/src/
|
||||
COPY src/runtime.js src/runtime.bun.js ${BUN_DIR}/src/
|
||||
COPY packages/bun-error ${BUN_DIR}/packages/bun-error
|
||||
COPY src/fallback.ts ${BUN_DIR}/src/fallback.ts
|
||||
COPY src/api ${BUN_DIR}/src/api
|
||||
|
||||
17
Makefile
17
Makefile
@@ -673,7 +673,7 @@ assert-deps:
|
||||
@echo "You have the dependencies installed! Woo"
|
||||
|
||||
# the following allows you to run `make submodule` to update or init submodules. but we will exclude webkit
|
||||
# unless you explicity clone it yourself (a huge download)
|
||||
# unless you explicitly clone it yourself (a huge download)
|
||||
SUBMODULE_NAMES=$(shell cat .gitmodules | grep 'path = ' | awk '{print $$3}')
|
||||
ifeq ("$(wildcard src/bun.js/WebKit/.git)", "")
|
||||
SUBMODULE_NAMES := $(filter-out src/bun.js/WebKit, $(SUBMODULE_NAMES))
|
||||
@@ -823,7 +823,6 @@ fmt: fmt-cpp fmt-zig
|
||||
api:
|
||||
./node_modules/.bin/peechy --schema src/api/schema.peechy --esm src/api/schema.js --ts src/api/schema.d.ts --zig src/api/schema.zig
|
||||
$(ZIG) fmt src/api/schema.zig
|
||||
$(PRETTIER) --config=.prettierrc.cjs --write src/api/schema.js src/api/schema.d.ts
|
||||
|
||||
.PHONY: node-fallbacks
|
||||
node-fallbacks:
|
||||
@@ -836,17 +835,7 @@ fallback_decoder:
|
||||
|
||||
.PHONY: runtime_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
|
||||
@NODE_ENV=production $(ESBUILD) --define:process.env.NODE_ENV=\"production\" --target=esnext --bundle src/runtime/index-with-refresh.ts --format=iife --platform=browser --global-name=BUN_RUNTIME --minify --external:/bun:* > src/runtime.out.refresh.js; cat src/runtime.footer.with-refresh.js >> src/runtime.out.refresh.js
|
||||
@NODE_ENV=production $(ESBUILD) --define:process.env.NODE_ENV=\"production\" --target=esnext --bundle src/runtime/index-without-hmr.ts --format=iife --platform=node --global-name=BUN_RUNTIME --minify --external:/bun:* > src/runtime.node.pre.out.js; cat src/runtime.node.pre.out.js src/runtime.footer.node.js > src/runtime.node.out.js
|
||||
@NODE_ENV=production $(ESBUILD) --define:process.env.NODE_ENV=\"production\" --target=esnext --bundle src/runtime/index-without-hmr.ts --format=iife --platform=node --global-name=BUN_RUNTIME --minify --external:/bun:* > src/runtime.bun.pre.out.js; cat src/runtime.bun.pre.out.js src/runtime.footer.bun.js > src/runtime.bun.out.js
|
||||
|
||||
.PHONY: runtime_js_dev
|
||||
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
|
||||
@NODE_ENV=development $(ESBUILD) --define:process.env.NODE_ENV="development" --target=esnext --bundle src/runtime/index-with-refresh.ts --format=iife --platform=browser --global-name=BUN_RUNTIME --external:/bun:* > src/runtime.out.refresh.js; cat src/runtime.footer.with-refresh.js >> src/runtime.out.refresh.js
|
||||
@NODE_ENV=development $(ESBUILD) --define:process.env.NODE_ENV="development" --target=esnext --bundle src/runtime/index-without-hmr.ts --format=iife --platform=node --global-name=BUN_RUNTIME --external:/bun:* > src/runtime.node.pre.out.js; cat src/runtime.node.pre.out.js src/runtime.footer.node.js > src/runtime.node.out.js
|
||||
@NODE_ENV=development $(ESBUILD) --define:process.env.NODE_ENV="development" --target=esnext --bundle src/runtime/index-without-hmr.ts --format=iife --platform=node --global-name=BUN_RUNTIME --external:/bun:* > src/runtime.bun.pre.out.js; cat src/runtime.bun.pre.out.js src/runtime.footer.bun.js > src/runtime.bun.out.js
|
||||
@NODE_ENV=production $(ESBUILD) --define:process.env.NODE_ENV=\"production\" --target=esnext --bundle src/runtime.bun.js --format=esm --platform=node --minify --external:/bun:* > src/runtime.out.js
|
||||
|
||||
.PHONY: bun_error
|
||||
bun_error:
|
||||
@@ -1733,7 +1722,7 @@ sizegen:
|
||||
# Linux uses bundled SQLite3
|
||||
ifeq ($(OS_NAME),linux)
|
||||
sqlite:
|
||||
$(CC) $(EMIT_LLVM_FOR_RELEASE) $(CFLAGS) $(INCLUDE_DIRS) -DSQLITE_ENABLE_COLUMN_METADATA= -DSQLITE_MAX_VARIABLE_NUMBER=250000 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_JSON1=1 $(SRC_DIR)/sqlite/sqlite3.c -c -o $(SQLITE_OBJECT)
|
||||
$(CC) $(EMIT_LLVM_FOR_RELEASE) $(CFLAGS) $(INCLUDE_DIRS) -DSQLITE_ENABLE_COLUMN_METADATA= -DSQLITE_MAX_VARIABLE_NUMBER=250000 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_MATH_FUNCTIONS=1 $(SRC_DIR)/sqlite/sqlite3.c -c -o $(SQLITE_OBJECT)
|
||||
endif
|
||||
|
||||
picohttp:
|
||||
|
||||
BIN
bench/bun.lockb
BIN
bench/bun.lockb
Binary file not shown.
@@ -1,7 +1,7 @@
|
||||
import { bench, run } from "mitata";
|
||||
import { groupForEmitter } from "./implementations.mjs";
|
||||
|
||||
// Psuedo RNG is derived from https://stackoverflow.com/a/424445
|
||||
// Pseudo RNG is derived from https://stackoverflow.com/a/424445
|
||||
let rngState = 123456789;
|
||||
function nextInt() {
|
||||
const m = 0x80000000; // 2**31;
|
||||
|
||||
37
bench/glob/braces.mjs
Normal file
37
bench/glob/braces.mjs
Normal file
@@ -0,0 +1,37 @@
|
||||
import braces from "braces";
|
||||
import { group, bench, run } from "mitata";
|
||||
|
||||
// const iterations = 1000;
|
||||
const iterations = 100;
|
||||
|
||||
const simplePattern = "foo.{js,jsx,ts,tsx}";
|
||||
const complexPattern = "{a,b,HI{c,e,LMAO{d,f}Q}} wow {a,b}";
|
||||
const veryComplexPattern = "{a,b,HI{c,e,LMAO{d,f}Q}}{1,2,{3,4},5}";
|
||||
|
||||
console.log(braces(complexPattern, { expand: true }));
|
||||
function benchPattern(pattern, name) {
|
||||
group({ name: `${name} pattern: "${pattern}"`, summary: true }, () => {
|
||||
if (typeof Bun !== "undefined")
|
||||
bench("Bun", () => {
|
||||
for (let i = 0; i < iterations; i++) {
|
||||
Bun.$.braces(pattern);
|
||||
}
|
||||
});
|
||||
|
||||
bench("micromatch/braces", () => {
|
||||
for (let i = 0; i < iterations; i++) {
|
||||
braces(pattern, { expand: true });
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
benchPattern(simplePattern, "simple");
|
||||
benchPattern(complexPattern, "complex");
|
||||
benchPattern(veryComplexPattern, "very complex pattern");
|
||||
|
||||
await run({
|
||||
avg: true,
|
||||
min_max: true,
|
||||
percentiles: true,
|
||||
});
|
||||
@@ -25,7 +25,7 @@ pub var all_timestamps: [RUN_COUNT + 1]usize = undefined;
|
||||
// 1. file path
|
||||
// 2. Byte offset in file
|
||||
// 3. ms update interval
|
||||
var color_buf: [8096 + SIMULATE_LONG_FILE.len]u8 = undefined;
|
||||
var color_buf: [8192 + SIMULATE_LONG_FILE.len]u8 = undefined;
|
||||
|
||||
pub fn main() anyerror!void {
|
||||
var allocator = std.heap.c_allocator;
|
||||
|
||||
@@ -25,7 +25,7 @@ pub var all_timestamps: [RUN_COUNT + 1]usize = undefined;
|
||||
// 1. file path
|
||||
// 2. Byte offset in file
|
||||
// 3. ms update interval
|
||||
var color_buf: [8096 + SIMULATE_LONG_FILE.len]u8 = undefined;
|
||||
var color_buf: [8192 + SIMULATE_LONG_FILE.len]u8 = undefined;
|
||||
|
||||
pub fn main() anyerror!void {
|
||||
var allocator = std.heap.c_allocator;
|
||||
|
||||
@@ -7,280 +7,166 @@
|
||||
"version": "0.0.34"
|
||||
},
|
||||
"timestamps": [
|
||||
16336202536562, 16336202536908, 16336202537294, 16336202537705,
|
||||
16336202538114, 16336202538534, 16336202538941, 16336202539323,
|
||||
16336202539742, 16336202540159, 16336202540877, 16336202541310,
|
||||
16336202541749, 16336202542159, 16336202542565, 16336202542996,
|
||||
16336202543333, 16336202543761, 16336202544159, 16336202544534,
|
||||
16336202544944, 16336202545345, 16336202545744, 16336202546159,
|
||||
16336202546573, 16336202546986, 16336202547399, 16336202547781,
|
||||
16336202548202, 16336202548564, 16336202548949, 16336202549329,
|
||||
16336202549762, 16336202550168, 16336202550534, 16336202550887,
|
||||
16336202551305, 16336202551659, 16336202552060, 16336202552449,
|
||||
16336202552854, 16336202553270, 16336202553609, 16336202554034,
|
||||
16336202554437, 16336202554783, 16336202555191, 16336202555623,
|
||||
16336202556034, 16336202556449, 16336202556890, 16336202557283,
|
||||
16336202557669, 16336202558084, 16336202558496, 16336202558863,
|
||||
16336202559271, 16336202559659, 16336202560051, 16336202560452,
|
||||
16336202560873, 16336202561290, 16336202561659, 16336202562035,
|
||||
16336202562440, 16336202562862, 16336202563284, 16336202563659,
|
||||
16336202564034, 16336202564444, 16336202564853, 16336202565245,
|
||||
16336202565659, 16336202566034, 16336202566455, 16336202566873,
|
||||
16336202567284, 16336202567659, 16336202568034, 16336202568386,
|
||||
16336202568790, 16336202569204, 16336202569620, 16336202570384,
|
||||
16336202570768, 16336202571188, 16336202571551, 16336202572327,
|
||||
16336202572717, 16336202573116, 16336202573541, 16336202573959,
|
||||
16336202574319, 16336202574682, 16336202575040, 16336202575375,
|
||||
16336202577001, 16336202577342, 16336202577680, 16336202578066,
|
||||
16336202578451, 16336202579166, 16336202579534, 16336202579960,
|
||||
16336202580370, 16336202580789, 16336202581159, 16336202581576,
|
||||
16336202581949, 16336202582294, 16336202583087, 16336202583496,
|
||||
16336202583858, 16336202584203, 16336202584606, 16336202585034,
|
||||
16336202585386, 16336202585788, 16336202586211, 16336202586604,
|
||||
16336202587034, 16336202587459, 16336202587869, 16336202588295,
|
||||
16336202588668, 16336202589092, 16336202589452, 16336202589831,
|
||||
16336202590197, 16336202590608, 16336202591034, 16336202591460,
|
||||
16336202591880, 16336202592295, 16336202592727, 16336202593172,
|
||||
16336202593567, 16336202593994, 16336202594397, 16336202594795,
|
||||
16336202595224, 16336202595659, 16336202596058, 16336202596463,
|
||||
16336202596890, 16336202597322, 16336202597732, 16336202598159,
|
||||
16336202598534, 16336202598951, 16336202599365, 16336202599785,
|
||||
16336202600159, 16336202600593, 16336202601005, 16336202601402,
|
||||
16336202601807, 16336202602214, 16336202602556, 16336202602895,
|
||||
16336202603307, 16336202603661, 16336202604075, 16336202604491,
|
||||
16336202604853, 16336202605268, 16336202605670, 16336202606034,
|
||||
16336202606393, 16336202606748, 16336202607170, 16336202607568,
|
||||
16336202607982, 16336202608411, 16336202608836, 16336202609197,
|
||||
16336202609596, 16336202609965, 16336202610333, 16336202610740,
|
||||
16336202611159, 16336202611573, 16336202611975, 16336202612317,
|
||||
16336202612691, 16336202613060, 16336202613474, 16336202613903,
|
||||
16336202614341, 16336202614707, 16336202615094, 16336202615534,
|
||||
16336202615883, 16336202616296, 16336202616671, 16336202617034,
|
||||
16336202617391, 16336202617727, 16336202618159, 16336202618534,
|
||||
16336202618937, 16336202619360, 16336202619770, 16336202620179,
|
||||
16336202620716, 16336202621143, 16336202621534, 16336202622303,
|
||||
16336202622659, 16336202623085, 16336202623498, 16336202623850,
|
||||
16336202624220, 16336202624606, 16336202625034, 16336202625387,
|
||||
16336202625805, 16336202626210, 16336202626599, 16336202627034,
|
||||
16336202627386, 16336202627748, 16336202628159, 16336202628534,
|
||||
16336202628954, 16336202629373, 16336202629809, 16336202630197,
|
||||
16336202630535, 16336202630916, 16336202631290, 16336202631666,
|
||||
16336202632034, 16336202632369, 16336202633152, 16336202633534,
|
||||
16336202633883, 16336202634309, 16336202634717, 16336202635106,
|
||||
16336202635871, 16336202636253, 16336202636671, 16336202637070,
|
||||
16336202637434, 16336202637798, 16336202638184, 16336202638539,
|
||||
16336202638938, 16336202639307, 16336202639666, 16336202640095,
|
||||
16336202640534, 16336202640962, 16336202641307, 16336202641659,
|
||||
16336202642087, 16336202642521, 16336202642886, 16336202643309,
|
||||
16336202643662, 16336202644067, 16336202644491, 16336202644853,
|
||||
16336202645226, 16336202645659, 16336202646074, 16336202646497,
|
||||
16336202646890, 16336202647311, 16336202647749, 16336202648169,
|
||||
16336202648976, 16336202649378, 16336202649810, 16336202650165,
|
||||
16336202650534, 16336202650875, 16336202651250, 16336202651659,
|
||||
16336202652093, 16336202652516, 16336202652921, 16336202653332,
|
||||
16336202653722, 16336202654142, 16336202654534, 16336202654880,
|
||||
16336202655221, 16336202655562, 16336202655997, 16336202656378,
|
||||
16336202656811, 16336202657161, 16336202657588, 16336202657944,
|
||||
16336202658360, 16336202658708, 16336202659089, 16336202659428,
|
||||
16336202659849, 16336202660273, 16336202660685, 16336202661105,
|
||||
16336202661534, 16336202661873, 16336202662228, 16336202662658,
|
||||
16336202663438, 16336202663843, 16336202664219, 16336202664646,
|
||||
16336202665050, 16336202665487, 16336202665838, 16336202666211,
|
||||
16336202666573, 16336202666927, 16336202667334, 16336202667746,
|
||||
16336202668158, 16336202668563, 16336202668980, 16336202669406,
|
||||
16336202669753, 16336202670192, 16336202670554, 16336202670903,
|
||||
16336202671324, 16336202671734, 16336202672159, 16336202672573,
|
||||
16336202672982, 16336202673346, 16336202673680, 16336202674087,
|
||||
16336202674499, 16336202674909, 16336202675260, 16336202676110,
|
||||
16336202676535, 16336202676913, 16336202677312, 16336202677658,
|
||||
16336202678044, 16336202678413, 16336202678793, 16336202679208,
|
||||
16336202679604, 16336202680034, 16336202680385, 16336202680799,
|
||||
16336202681213, 16336202681595, 16336202682004, 16336202682346,
|
||||
16336202682726, 16336202683158, 16336202683586, 16336202683990,
|
||||
16336202684323, 16336202684742, 16336202685175, 16336202685578,
|
||||
16336202685979, 16336202686805, 16336202687206, 16336202687614,
|
||||
16336202688038, 16336202688473, 16336202688848, 16336202689221,
|
||||
16336202689559, 16336202689971, 16336202690368, 16336202690776,
|
||||
16336202691159, 16336202691585, 16336202692010, 16336202692373,
|
||||
16336202692780, 16336202693179, 16336202693580, 16336202693991,
|
||||
16336202694324, 16336202694727, 16336202695159, 16336202695588,
|
||||
16336202695991, 16336202696335, 16336202697160, 16336202697542,
|
||||
16336202697929, 16336202698323, 16336202698674, 16336202699060,
|
||||
16336202699492, 16336202699835, 16336202700238, 16336202700658,
|
||||
16336202701059, 16336202701420, 16336202701815, 16336202702229,
|
||||
16336202702659, 16336202703857, 16336202704256, 16336202704659,
|
||||
16336202705497, 16336202706309, 16336202706660, 16336202707085,
|
||||
16336202707511, 16336202707866, 16336202708210, 16336202708552,
|
||||
16336202708925, 16336202709287, 16336202709670, 16336202710045,
|
||||
16336202710402, 16336202710802, 16336202711167, 16336202711533,
|
||||
16336202712249, 16336202712660, 16336202713088, 16336202713519,
|
||||
16336202713936, 16336202714355, 16336202714740, 16336202715160,
|
||||
16336202715533, 16336202715878, 16336202716290, 16336202716708,
|
||||
16336202717102, 16336202718290, 16336202718699, 16336202719052,
|
||||
16336202719388, 16336202719808, 16336202720225, 16336202720659,
|
||||
16336202721052, 16336202721414, 16336202721828, 16336202722925,
|
||||
16336202723664, 16336202724063, 16336202724405, 16336202726003,
|
||||
16336202726736, 16336202727158, 16336202727543, 16336202727930,
|
||||
16336202728336, 16336202728703, 16336202729061, 16336202729483,
|
||||
16336202729832, 16336202730222, 16336202730659, 16336202731084,
|
||||
16336202731500, 16336202731911, 16336202732326, 16336202733158,
|
||||
16336202733585, 16336202734001, 16336202734691, 16336202735042,
|
||||
16336202735442, 16336202735863, 16336202736255, 16336202736671,
|
||||
16336202737043, 16336202737884, 16336202738671, 16336202739110,
|
||||
16336202739533, 16336202739886, 16336202740283, 16336202740706,
|
||||
16336202741143, 16336202741534, 16336202741942, 16336202742352,
|
||||
16336202742697, 16336202743103, 16336202743940, 16336202745172,
|
||||
16336202745542, 16336202745937, 16336202746339, 16336202746758,
|
||||
16336202747531, 16336202747877, 16336202748232, 16336202748658,
|
||||
16336202749055, 16336202749468, 16336202749859, 16336202750416,
|
||||
16336202750839, 16336202751178, 16336202751572, 16336202752002,
|
||||
16336202752419, 16336202753269, 16336202753678, 16336202754086,
|
||||
16336202754432, 16336202754835, 16336202755260, 16336202755683,
|
||||
16336202756059, 16336202756402, 16336202756837, 16336202758084,
|
||||
16336202758507, 16336202758879, 16336202759270, 16336202759674,
|
||||
16336202760044, 16336202760400, 16336202760801, 16336202761659,
|
||||
16336202762053, 16336202762397, 16336202763199, 16336202763547,
|
||||
16336202763948, 16336202764714, 16336202765113, 16336202765947,
|
||||
16336202766329, 16336202766664, 16336202767085, 16336202768233,
|
||||
16336202769056, 16336202769758, 16336202770178, 16336202770585,
|
||||
16336202770929, 16336202771325, 16336202772158, 16336202772594,
|
||||
16336202773033, 16336202773403, 16336202773801, 16336202774179,
|
||||
16336202774555, 16336202774989, 16336202775393, 16336202775809,
|
||||
16336202776209, 16336202776618, 16336202777033, 16336202777421,
|
||||
16336202777845, 16336202778246, 16336202778658, 16336202779055,
|
||||
16336202779411, 16336202779761, 16336202780175, 16336202780594,
|
||||
16336202781002, 16336202781848, 16336202782658, 16336202783033,
|
||||
16336202783857, 16336202784211, 16336202784557, 16336202784972,
|
||||
16336202785377, 16336202785810, 16336202786172, 16336202786934,
|
||||
16336202787343, 16336202787765, 16336202788201, 16336202788563,
|
||||
16336202788970, 16336202789329, 16336202789672, 16336202790055,
|
||||
16336202790456, 16336202790802, 16336202791580, 16336202791920,
|
||||
16336202792326, 16336202793158, 16336202793953, 16336202794368,
|
||||
16336202795187, 16336202795622, 16336202796033, 16336202796393,
|
||||
16336202796777, 16336202797173, 16336202797540, 16336202797975,
|
||||
16336202798317, 16336202798739, 16336202799158, 16336202799567,
|
||||
16336202799966, 16336202800378, 16336202800803, 16336202801232,
|
||||
16336202801658, 16336202802033, 16336202802374, 16336202802759,
|
||||
16336202803158, 16336202803533, 16336202803947, 16336202804354,
|
||||
16336202804729, 16336202805158, 16336202805534, 16336202805950,
|
||||
16336202806390, 16336202806805, 16336202807219, 16336202807643,
|
||||
16336202808033, 16336202808377, 16336202808790, 16336202809211,
|
||||
16336202809560, 16336202809920, 16336202810355, 16336202810758,
|
||||
16336202811187, 16336202811596, 16336202811943, 16336202812348,
|
||||
16336202812710, 16336202813060, 16336202813398, 16336202813791,
|
||||
16336202814158, 16336202814533, 16336202814878, 16336202815246,
|
||||
16336202815658, 16336202816079, 16336202816851, 16336202817202,
|
||||
16336202817540, 16336202817905, 16336202818244, 16336202818663,
|
||||
16336202819068, 16336202819418, 16336202819777, 16336202820193,
|
||||
16336202820599, 16336202821033, 16336202821395, 16336202821745,
|
||||
16336202822158, 16336202822590, 16336202822996, 16336202823396,
|
||||
16336202823804, 16336202824210, 16336202824581, 16336202824991,
|
||||
16336202825406, 16336202825806, 16336202826210, 16336202826598,
|
||||
16336202827033, 16336202827446, 16336202827839, 16336202828201,
|
||||
16336202828577, 16336202828968, 16336202829362, 16336202829709,
|
||||
16336202830096, 16336202830533, 16336202830917, 16336202831290,
|
||||
16336202831699, 16336202832035, 16336202832406, 16336202832804,
|
||||
16336202833200, 16336202833604, 16336202834033, 16336202834386,
|
||||
16336202834759, 16336202835190, 16336202835621, 16336202836033,
|
||||
16336202836405, 16336202837191, 16336202837613, 16336202838033,
|
||||
16336202838374, 16336202838798, 16336202839200, 16336202839603,
|
||||
16336202840034, 16336202840389, 16336202840783, 16336202841200,
|
||||
16336202841617, 16336202842034, 16336202842390, 16336202842737,
|
||||
16336202843158, 16336202843585, 16336202843923, 16336202844313,
|
||||
16336202844724, 16336202845158, 16336202845576, 16336202845939,
|
||||
16336202846368, 16336202846728, 16336202847158, 16336202847568,
|
||||
16336202847911, 16336202848291, 16336202848695, 16336202849103,
|
||||
16336202849533, 16336202849942, 16336202850368, 16336202850747,
|
||||
16336202851158, 16336202851549, 16336202851978, 16336202852383,
|
||||
16336202852725, 16336202853158, 16336202853554, 16336202853961,
|
||||
16336202854308, 16336202854704, 16336202855060, 16336202855418,
|
||||
16336202855776, 16336202856203, 16336202856617, 16336202857036,
|
||||
16336202857455, 16336202857884, 16336202858262, 16336202858658,
|
||||
16336202859071, 16336202859847, 16336202860237, 16336202860658,
|
||||
16336202861037, 16336202861452, 16336202861869, 16336202862218,
|
||||
16336202862590, 16336202863001, 16336202863422, 16336202863857,
|
||||
16336202864219, 16336202864658, 16336202865047, 16336202865404,
|
||||
16336202865789, 16336202866210, 16336202866624, 16336202867033,
|
||||
16336202867380, 16336202867797, 16336202868227, 16336202868658,
|
||||
16336202869083, 16336202869500, 16336202869906, 16336202870246,
|
||||
16336202870658, 16336202871086, 16336202871441, 16336202871820,
|
||||
16336202872204, 16336202872546, 16336202872943, 16336202873380,
|
||||
16336202873811, 16336202874213, 16336202874566, 16336202874918,
|
||||
16336202875261, 16336202875655, 16336202876047, 16336202876771,
|
||||
16336202877202, 16336202877612, 16336202878033, 16336202878412,
|
||||
16336202878846, 16336202879241, 16336202879658, 16336202880072,
|
||||
16336202880508, 16336202880901, 16336202881308, 16336202881725,
|
||||
16336202882158, 16336202882579, 16336202882945, 16336202883286,
|
||||
16336202883657, 16336202884048, 16336202884404, 16336202884752,
|
||||
16336202885158, 16336202885533, 16336202885938, 16336202886364,
|
||||
16336202886759, 16336202887175, 16336202887585, 16336202887929,
|
||||
16336202888345, 16336202888743, 16336202889157, 16336202889570,
|
||||
16336202889970, 16336202890382, 16336202890761, 16336202891187,
|
||||
16336202891600, 16336202892033, 16336202892454, 16336202892794,
|
||||
16336202893178, 16336202893533, 16336202893903, 16336202894264,
|
||||
16336202894668, 16336202895049, 16336202895400, 16336202895774,
|
||||
16336202896157, 16336202896537, 16336202896883, 16336202897232,
|
||||
16336202897658, 16336202898065, 16336202898493, 16336202898884,
|
||||
16336202899251, 16336202899673, 16336202900047, 16336202900467,
|
||||
16336202900883, 16336202901300, 16336202901676, 16336202902068,
|
||||
16336202902479, 16336202902902, 16336202903260, 16336202903675,
|
||||
16336202904094, 16336202904476, 16336202904824, 16336202905158,
|
||||
16336202905533, 16336202905934, 16336202906289, 16336202906717,
|
||||
16336202907158, 16336202907547, 16336202907904, 16336202908294,
|
||||
16336202908717, 16336202909157, 16336202909582, 16336202910005,
|
||||
16336202910399, 16336202910800, 16336202911220, 16336202911657,
|
||||
16336202912064, 16336202912405, 16336202912779, 16336202913158,
|
||||
16336202913553, 16336202913966, 16336202914376, 16336202914719,
|
||||
16336202915091, 16336202915515, 16336202915887, 16336202916293,
|
||||
16336202916649, 16336202917438, 16336202917869, 16336202918221,
|
||||
16336202919053, 16336202919425, 16336202919833, 16336202920234,
|
||||
16336202920658, 16336202921033, 16336202921433, 16336202921801,
|
||||
16336202922161, 16336202922589, 16336202923017, 16336202923418,
|
||||
16336202923804, 16336202924199, 16336202924593, 16336202925033,
|
||||
16336202925449, 16336202925818, 16336202926223, 16336202926662,
|
||||
16336202927431, 16336202927812, 16336202928227, 16336202928658,
|
||||
16336202929061, 16336202929473, 16336202929891, 16336202930241,
|
||||
16336202930657, 16336202931057, 16336202931396, 16336202931811,
|
||||
16336202932225, 16336202932657, 16336202933058, 16336202933445,
|
||||
16336202933790, 16336202934157, 16336202934562, 16336202934988,
|
||||
16336202935391, 16336202935777, 16336202936160, 16336202936562,
|
||||
16336202936986, 16336202937396, 16336202937751, 16336202938158,
|
||||
16336202938578, 16336202938985, 16336202939396, 16336202939752,
|
||||
16336202940157, 16336202940585
|
||||
16336202536562, 16336202536908, 16336202537294, 16336202537705, 16336202538114, 16336202538534, 16336202538941,
|
||||
16336202539323, 16336202539742, 16336202540159, 16336202540877, 16336202541310, 16336202541749, 16336202542159,
|
||||
16336202542565, 16336202542996, 16336202543333, 16336202543761, 16336202544159, 16336202544534, 16336202544944,
|
||||
16336202545345, 16336202545744, 16336202546159, 16336202546573, 16336202546986, 16336202547399, 16336202547781,
|
||||
16336202548202, 16336202548564, 16336202548949, 16336202549329, 16336202549762, 16336202550168, 16336202550534,
|
||||
16336202550887, 16336202551305, 16336202551659, 16336202552060, 16336202552449, 16336202552854, 16336202553270,
|
||||
16336202553609, 16336202554034, 16336202554437, 16336202554783, 16336202555191, 16336202555623, 16336202556034,
|
||||
16336202556449, 16336202556890, 16336202557283, 16336202557669, 16336202558084, 16336202558496, 16336202558863,
|
||||
16336202559271, 16336202559659, 16336202560051, 16336202560452, 16336202560873, 16336202561290, 16336202561659,
|
||||
16336202562035, 16336202562440, 16336202562862, 16336202563284, 16336202563659, 16336202564034, 16336202564444,
|
||||
16336202564853, 16336202565245, 16336202565659, 16336202566034, 16336202566455, 16336202566873, 16336202567284,
|
||||
16336202567659, 16336202568034, 16336202568386, 16336202568790, 16336202569204, 16336202569620, 16336202570384,
|
||||
16336202570768, 16336202571188, 16336202571551, 16336202572327, 16336202572717, 16336202573116, 16336202573541,
|
||||
16336202573959, 16336202574319, 16336202574682, 16336202575040, 16336202575375, 16336202577001, 16336202577342,
|
||||
16336202577680, 16336202578066, 16336202578451, 16336202579166, 16336202579534, 16336202579960, 16336202580370,
|
||||
16336202580789, 16336202581159, 16336202581576, 16336202581949, 16336202582294, 16336202583087, 16336202583496,
|
||||
16336202583858, 16336202584203, 16336202584606, 16336202585034, 16336202585386, 16336202585788, 16336202586211,
|
||||
16336202586604, 16336202587034, 16336202587459, 16336202587869, 16336202588295, 16336202588668, 16336202589092,
|
||||
16336202589452, 16336202589831, 16336202590197, 16336202590608, 16336202591034, 16336202591460, 16336202591880,
|
||||
16336202592295, 16336202592727, 16336202593172, 16336202593567, 16336202593994, 16336202594397, 16336202594795,
|
||||
16336202595224, 16336202595659, 16336202596058, 16336202596463, 16336202596890, 16336202597322, 16336202597732,
|
||||
16336202598159, 16336202598534, 16336202598951, 16336202599365, 16336202599785, 16336202600159, 16336202600593,
|
||||
16336202601005, 16336202601402, 16336202601807, 16336202602214, 16336202602556, 16336202602895, 16336202603307,
|
||||
16336202603661, 16336202604075, 16336202604491, 16336202604853, 16336202605268, 16336202605670, 16336202606034,
|
||||
16336202606393, 16336202606748, 16336202607170, 16336202607568, 16336202607982, 16336202608411, 16336202608836,
|
||||
16336202609197, 16336202609596, 16336202609965, 16336202610333, 16336202610740, 16336202611159, 16336202611573,
|
||||
16336202611975, 16336202612317, 16336202612691, 16336202613060, 16336202613474, 16336202613903, 16336202614341,
|
||||
16336202614707, 16336202615094, 16336202615534, 16336202615883, 16336202616296, 16336202616671, 16336202617034,
|
||||
16336202617391, 16336202617727, 16336202618159, 16336202618534, 16336202618937, 16336202619360, 16336202619770,
|
||||
16336202620179, 16336202620716, 16336202621143, 16336202621534, 16336202622303, 16336202622659, 16336202623085,
|
||||
16336202623498, 16336202623850, 16336202624220, 16336202624606, 16336202625034, 16336202625387, 16336202625805,
|
||||
16336202626210, 16336202626599, 16336202627034, 16336202627386, 16336202627748, 16336202628159, 16336202628534,
|
||||
16336202628954, 16336202629373, 16336202629809, 16336202630197, 16336202630535, 16336202630916, 16336202631290,
|
||||
16336202631666, 16336202632034, 16336202632369, 16336202633152, 16336202633534, 16336202633883, 16336202634309,
|
||||
16336202634717, 16336202635106, 16336202635871, 16336202636253, 16336202636671, 16336202637070, 16336202637434,
|
||||
16336202637798, 16336202638184, 16336202638539, 16336202638938, 16336202639307, 16336202639666, 16336202640095,
|
||||
16336202640534, 16336202640962, 16336202641307, 16336202641659, 16336202642087, 16336202642521, 16336202642886,
|
||||
16336202643309, 16336202643662, 16336202644067, 16336202644491, 16336202644853, 16336202645226, 16336202645659,
|
||||
16336202646074, 16336202646497, 16336202646890, 16336202647311, 16336202647749, 16336202648169, 16336202648976,
|
||||
16336202649378, 16336202649810, 16336202650165, 16336202650534, 16336202650875, 16336202651250, 16336202651659,
|
||||
16336202652093, 16336202652516, 16336202652921, 16336202653332, 16336202653722, 16336202654142, 16336202654534,
|
||||
16336202654880, 16336202655221, 16336202655562, 16336202655997, 16336202656378, 16336202656811, 16336202657161,
|
||||
16336202657588, 16336202657944, 16336202658360, 16336202658708, 16336202659089, 16336202659428, 16336202659849,
|
||||
16336202660273, 16336202660685, 16336202661105, 16336202661534, 16336202661873, 16336202662228, 16336202662658,
|
||||
16336202663438, 16336202663843, 16336202664219, 16336202664646, 16336202665050, 16336202665487, 16336202665838,
|
||||
16336202666211, 16336202666573, 16336202666927, 16336202667334, 16336202667746, 16336202668158, 16336202668563,
|
||||
16336202668980, 16336202669406, 16336202669753, 16336202670192, 16336202670554, 16336202670903, 16336202671324,
|
||||
16336202671734, 16336202672159, 16336202672573, 16336202672982, 16336202673346, 16336202673680, 16336202674087,
|
||||
16336202674499, 16336202674909, 16336202675260, 16336202676110, 16336202676535, 16336202676913, 16336202677312,
|
||||
16336202677658, 16336202678044, 16336202678413, 16336202678793, 16336202679208, 16336202679604, 16336202680034,
|
||||
16336202680385, 16336202680799, 16336202681213, 16336202681595, 16336202682004, 16336202682346, 16336202682726,
|
||||
16336202683158, 16336202683586, 16336202683990, 16336202684323, 16336202684742, 16336202685175, 16336202685578,
|
||||
16336202685979, 16336202686805, 16336202687206, 16336202687614, 16336202688038, 16336202688473, 16336202688848,
|
||||
16336202689221, 16336202689559, 16336202689971, 16336202690368, 16336202690776, 16336202691159, 16336202691585,
|
||||
16336202692010, 16336202692373, 16336202692780, 16336202693179, 16336202693580, 16336202693991, 16336202694324,
|
||||
16336202694727, 16336202695159, 16336202695588, 16336202695991, 16336202696335, 16336202697160, 16336202697542,
|
||||
16336202697929, 16336202698323, 16336202698674, 16336202699060, 16336202699492, 16336202699835, 16336202700238,
|
||||
16336202700658, 16336202701059, 16336202701420, 16336202701815, 16336202702229, 16336202702659, 16336202703857,
|
||||
16336202704256, 16336202704659, 16336202705497, 16336202706309, 16336202706660, 16336202707085, 16336202707511,
|
||||
16336202707866, 16336202708210, 16336202708552, 16336202708925, 16336202709287, 16336202709670, 16336202710045,
|
||||
16336202710402, 16336202710802, 16336202711167, 16336202711533, 16336202712249, 16336202712660, 16336202713088,
|
||||
16336202713519, 16336202713936, 16336202714355, 16336202714740, 16336202715160, 16336202715533, 16336202715878,
|
||||
16336202716290, 16336202716708, 16336202717102, 16336202718290, 16336202718699, 16336202719052, 16336202719388,
|
||||
16336202719808, 16336202720225, 16336202720659, 16336202721052, 16336202721414, 16336202721828, 16336202722925,
|
||||
16336202723664, 16336202724063, 16336202724405, 16336202726003, 16336202726736, 16336202727158, 16336202727543,
|
||||
16336202727930, 16336202728336, 16336202728703, 16336202729061, 16336202729483, 16336202729832, 16336202730222,
|
||||
16336202730659, 16336202731084, 16336202731500, 16336202731911, 16336202732326, 16336202733158, 16336202733585,
|
||||
16336202734001, 16336202734691, 16336202735042, 16336202735442, 16336202735863, 16336202736255, 16336202736671,
|
||||
16336202737043, 16336202737884, 16336202738671, 16336202739110, 16336202739533, 16336202739886, 16336202740283,
|
||||
16336202740706, 16336202741143, 16336202741534, 16336202741942, 16336202742352, 16336202742697, 16336202743103,
|
||||
16336202743940, 16336202745172, 16336202745542, 16336202745937, 16336202746339, 16336202746758, 16336202747531,
|
||||
16336202747877, 16336202748232, 16336202748658, 16336202749055, 16336202749468, 16336202749859, 16336202750416,
|
||||
16336202750839, 16336202751178, 16336202751572, 16336202752002, 16336202752419, 16336202753269, 16336202753678,
|
||||
16336202754086, 16336202754432, 16336202754835, 16336202755260, 16336202755683, 16336202756059, 16336202756402,
|
||||
16336202756837, 16336202758084, 16336202758507, 16336202758879, 16336202759270, 16336202759674, 16336202760044,
|
||||
16336202760400, 16336202760801, 16336202761659, 16336202762053, 16336202762397, 16336202763199, 16336202763547,
|
||||
16336202763948, 16336202764714, 16336202765113, 16336202765947, 16336202766329, 16336202766664, 16336202767085,
|
||||
16336202768233, 16336202769056, 16336202769758, 16336202770178, 16336202770585, 16336202770929, 16336202771325,
|
||||
16336202772158, 16336202772594, 16336202773033, 16336202773403, 16336202773801, 16336202774179, 16336202774555,
|
||||
16336202774989, 16336202775393, 16336202775809, 16336202776209, 16336202776618, 16336202777033, 16336202777421,
|
||||
16336202777845, 16336202778246, 16336202778658, 16336202779055, 16336202779411, 16336202779761, 16336202780175,
|
||||
16336202780594, 16336202781002, 16336202781848, 16336202782658, 16336202783033, 16336202783857, 16336202784211,
|
||||
16336202784557, 16336202784972, 16336202785377, 16336202785810, 16336202786172, 16336202786934, 16336202787343,
|
||||
16336202787765, 16336202788201, 16336202788563, 16336202788970, 16336202789329, 16336202789672, 16336202790055,
|
||||
16336202790456, 16336202790802, 16336202791580, 16336202791920, 16336202792326, 16336202793158, 16336202793953,
|
||||
16336202794368, 16336202795187, 16336202795622, 16336202796033, 16336202796393, 16336202796777, 16336202797173,
|
||||
16336202797540, 16336202797975, 16336202798317, 16336202798739, 16336202799158, 16336202799567, 16336202799966,
|
||||
16336202800378, 16336202800803, 16336202801232, 16336202801658, 16336202802033, 16336202802374, 16336202802759,
|
||||
16336202803158, 16336202803533, 16336202803947, 16336202804354, 16336202804729, 16336202805158, 16336202805534,
|
||||
16336202805950, 16336202806390, 16336202806805, 16336202807219, 16336202807643, 16336202808033, 16336202808377,
|
||||
16336202808790, 16336202809211, 16336202809560, 16336202809920, 16336202810355, 16336202810758, 16336202811187,
|
||||
16336202811596, 16336202811943, 16336202812348, 16336202812710, 16336202813060, 16336202813398, 16336202813791,
|
||||
16336202814158, 16336202814533, 16336202814878, 16336202815246, 16336202815658, 16336202816079, 16336202816851,
|
||||
16336202817202, 16336202817540, 16336202817905, 16336202818244, 16336202818663, 16336202819068, 16336202819418,
|
||||
16336202819777, 16336202820193, 16336202820599, 16336202821033, 16336202821395, 16336202821745, 16336202822158,
|
||||
16336202822590, 16336202822996, 16336202823396, 16336202823804, 16336202824210, 16336202824581, 16336202824991,
|
||||
16336202825406, 16336202825806, 16336202826210, 16336202826598, 16336202827033, 16336202827446, 16336202827839,
|
||||
16336202828201, 16336202828577, 16336202828968, 16336202829362, 16336202829709, 16336202830096, 16336202830533,
|
||||
16336202830917, 16336202831290, 16336202831699, 16336202832035, 16336202832406, 16336202832804, 16336202833200,
|
||||
16336202833604, 16336202834033, 16336202834386, 16336202834759, 16336202835190, 16336202835621, 16336202836033,
|
||||
16336202836405, 16336202837191, 16336202837613, 16336202838033, 16336202838374, 16336202838798, 16336202839200,
|
||||
16336202839603, 16336202840034, 16336202840389, 16336202840783, 16336202841200, 16336202841617, 16336202842034,
|
||||
16336202842390, 16336202842737, 16336202843158, 16336202843585, 16336202843923, 16336202844313, 16336202844724,
|
||||
16336202845158, 16336202845576, 16336202845939, 16336202846368, 16336202846728, 16336202847158, 16336202847568,
|
||||
16336202847911, 16336202848291, 16336202848695, 16336202849103, 16336202849533, 16336202849942, 16336202850368,
|
||||
16336202850747, 16336202851158, 16336202851549, 16336202851978, 16336202852383, 16336202852725, 16336202853158,
|
||||
16336202853554, 16336202853961, 16336202854308, 16336202854704, 16336202855060, 16336202855418, 16336202855776,
|
||||
16336202856203, 16336202856617, 16336202857036, 16336202857455, 16336202857884, 16336202858262, 16336202858658,
|
||||
16336202859071, 16336202859847, 16336202860237, 16336202860658, 16336202861037, 16336202861452, 16336202861869,
|
||||
16336202862218, 16336202862590, 16336202863001, 16336202863422, 16336202863857, 16336202864219, 16336202864658,
|
||||
16336202865047, 16336202865404, 16336202865789, 16336202866210, 16336202866624, 16336202867033, 16336202867380,
|
||||
16336202867797, 16336202868227, 16336202868658, 16336202869083, 16336202869500, 16336202869906, 16336202870246,
|
||||
16336202870658, 16336202871086, 16336202871441, 16336202871820, 16336202872204, 16336202872546, 16336202872943,
|
||||
16336202873380, 16336202873811, 16336202874213, 16336202874566, 16336202874918, 16336202875261, 16336202875655,
|
||||
16336202876047, 16336202876771, 16336202877202, 16336202877612, 16336202878033, 16336202878412, 16336202878846,
|
||||
16336202879241, 16336202879658, 16336202880072, 16336202880508, 16336202880901, 16336202881308, 16336202881725,
|
||||
16336202882158, 16336202882579, 16336202882945, 16336202883286, 16336202883657, 16336202884048, 16336202884404,
|
||||
16336202884752, 16336202885158, 16336202885533, 16336202885938, 16336202886364, 16336202886759, 16336202887175,
|
||||
16336202887585, 16336202887929, 16336202888345, 16336202888743, 16336202889157, 16336202889570, 16336202889970,
|
||||
16336202890382, 16336202890761, 16336202891187, 16336202891600, 16336202892033, 16336202892454, 16336202892794,
|
||||
16336202893178, 16336202893533, 16336202893903, 16336202894264, 16336202894668, 16336202895049, 16336202895400,
|
||||
16336202895774, 16336202896157, 16336202896537, 16336202896883, 16336202897232, 16336202897658, 16336202898065,
|
||||
16336202898493, 16336202898884, 16336202899251, 16336202899673, 16336202900047, 16336202900467, 16336202900883,
|
||||
16336202901300, 16336202901676, 16336202902068, 16336202902479, 16336202902902, 16336202903260, 16336202903675,
|
||||
16336202904094, 16336202904476, 16336202904824, 16336202905158, 16336202905533, 16336202905934, 16336202906289,
|
||||
16336202906717, 16336202907158, 16336202907547, 16336202907904, 16336202908294, 16336202908717, 16336202909157,
|
||||
16336202909582, 16336202910005, 16336202910399, 16336202910800, 16336202911220, 16336202911657, 16336202912064,
|
||||
16336202912405, 16336202912779, 16336202913158, 16336202913553, 16336202913966, 16336202914376, 16336202914719,
|
||||
16336202915091, 16336202915515, 16336202915887, 16336202916293, 16336202916649, 16336202917438, 16336202917869,
|
||||
16336202918221, 16336202919053, 16336202919425, 16336202919833, 16336202920234, 16336202920658, 16336202921033,
|
||||
16336202921433, 16336202921801, 16336202922161, 16336202922589, 16336202923017, 16336202923418, 16336202923804,
|
||||
16336202924199, 16336202924593, 16336202925033, 16336202925449, 16336202925818, 16336202926223, 16336202926662,
|
||||
16336202927431, 16336202927812, 16336202928227, 16336202928658, 16336202929061, 16336202929473, 16336202929891,
|
||||
16336202930241, 16336202930657, 16336202931057, 16336202931396, 16336202931811, 16336202932225, 16336202932657,
|
||||
16336202933058, 16336202933445, 16336202933790, 16336202934157, 16336202934562, 16336202934988, 16336202935391,
|
||||
16336202935777, 16336202936160, 16336202936562, 16336202936986, 16336202937396, 16336202937751, 16336202938158,
|
||||
16336202938578, 16336202938985, 16336202939396, 16336202939752, 16336202940157, 16336202940585
|
||||
],
|
||||
"frameTimes": [
|
||||
346, 411, 420, 382, 417, 433, 410, 431, 428, 375, 401, 415, 413, 382, 362,
|
||||
380, 406, 353, 354, 389, 416, 425, 346, 432, 415, 393, 415, 367, 388, 401,
|
||||
417, 376, 422, 375, 410, 392, 375, 418, 375, 352, 414, 764, 420, 776, 399,
|
||||
418, 363, 335, 341, 386, 715, 426, 419, 417, 345, 409, 345, 428, 402, 393,
|
||||
425, 426, 424, 379, 411, 426, 415, 445, 427, 398, 435, 405, 432, 427, 417,
|
||||
420, 434, 397, 407, 339, 354, 416, 415, 364, 355, 398, 429, 361, 369, 407,
|
||||
414, 342, 369, 429, 366, 440, 413, 363, 336, 375, 423, 409, 427, 769, 426,
|
||||
352, 386, 353, 405, 435, 362, 375, 419, 388, 381, 376, 335, 382, 426, 389,
|
||||
382, 399, 364, 355, 369, 429, 428, 352, 434, 423, 405, 362, 433, 423, 421,
|
||||
420, 402, 355, 341, 409, 423, 411, 420, 346, 341, 381, 350, 356, 348, 339,
|
||||
424, 420, 339, 430, 405, 427, 437, 373, 354, 412, 405, 426, 439, 349, 410,
|
||||
414, 364, 407, 410, 850, 378, 346, 369, 415, 430, 414, 382, 342, 432, 404,
|
||||
419, 403, 826, 408, 435, 373, 412, 408, 426, 363, 399, 411, 403, 429, 344,
|
||||
382, 394, 386, 343, 420, 361, 414, 1198, 403, 812, 425, 355, 342, 362, 375,
|
||||
400, 366, 411, 431, 419, 420, 345, 418, 1188, 353, 420, 434, 362, 1097, 399,
|
||||
1598, 422, 387, 367, 422, 390, 425, 411, 832, 416, 351, 421, 416, 841, 439,
|
||||
353, 423, 391, 410, 406, 1232, 395, 419, 346, 426, 413, 557, 339, 430, 850,
|
||||
408, 403, 423, 343, 1247, 372, 404, 356, 858, 344, 348, 766, 834, 335, 1148,
|
||||
702, 407, 396, 436, 370, 378, 434, 416, 409, 388, 401, 397, 350, 419, 846,
|
||||
375, 354, 415, 433, 762, 422, 362, 359, 383, 346, 340, 832, 415, 435, 360,
|
||||
396, 435, 422, 409, 412, 429, 375, 385, 375, 407, 429, 416, 415, 424, 344,
|
||||
421, 360, 403, 409, 405, 350, 393, 375, 368, 421, 351, 365, 419, 350, 416,
|
||||
434, 350, 432, 400, 406, 410, 400, 388, 413, 362, 391, 347, 437, 373, 336,
|
||||
398, 404, 353, 431, 412, 786, 420, 424, 403, 355, 417, 417, 347, 427, 390,
|
||||
434, 363, 360, 410, 380, 408, 409, 379, 391, 405, 433, 407, 396, 358, 427,
|
||||
419, 429, 396, 776, 421, 415, 349, 411, 435, 439, 357, 421, 409, 417, 431,
|
||||
417, 340, 428, 379, 342, 437, 402, 352, 394, 724, 410, 379, 395, 414, 393,
|
||||
417, 421, 341, 391, 348, 375, 426, 416, 344, 398, 413, 412, 426, 433, 340,
|
||||
355, 361, 381, 374, 380, 349, 407, 391, 422, 420, 417, 392, 423, 415, 382,
|
||||
334, 401, 428, 389, 390, 440, 423, 401, 437, 341, 379, 413, 343, 424, 406,
|
||||
789, 352, 372, 401, 375, 368, 428, 401, 395, 440, 369, 439, 381, 431, 412,
|
||||
350, 400, 415, 432, 387, 367, 426, 386, 402, 410, 407, 407, 356, 428
|
||||
346, 411, 420, 382, 417, 433, 410, 431, 428, 375, 401, 415, 413, 382, 362, 380, 406, 353, 354, 389, 416, 425, 346,
|
||||
432, 415, 393, 415, 367, 388, 401, 417, 376, 422, 375, 410, 392, 375, 418, 375, 352, 414, 764, 420, 776, 399, 418,
|
||||
363, 335, 341, 386, 715, 426, 419, 417, 345, 409, 345, 428, 402, 393, 425, 426, 424, 379, 411, 426, 415, 445, 427,
|
||||
398, 435, 405, 432, 427, 417, 420, 434, 397, 407, 339, 354, 416, 415, 364, 355, 398, 429, 361, 369, 407, 414, 342,
|
||||
369, 429, 366, 440, 413, 363, 336, 375, 423, 409, 427, 769, 426, 352, 386, 353, 405, 435, 362, 375, 419, 388, 381,
|
||||
376, 335, 382, 426, 389, 382, 399, 364, 355, 369, 429, 428, 352, 434, 423, 405, 362, 433, 423, 421, 420, 402, 355,
|
||||
341, 409, 423, 411, 420, 346, 341, 381, 350, 356, 348, 339, 424, 420, 339, 430, 405, 427, 437, 373, 354, 412, 405,
|
||||
426, 439, 349, 410, 414, 364, 407, 410, 850, 378, 346, 369, 415, 430, 414, 382, 342, 432, 404, 419, 403, 826, 408,
|
||||
435, 373, 412, 408, 426, 363, 399, 411, 403, 429, 344, 382, 394, 386, 343, 420, 361, 414, 1198, 403, 812, 425, 355,
|
||||
342, 362, 375, 400, 366, 411, 431, 419, 420, 345, 418, 1188, 353, 420, 434, 362, 1097, 399, 1598, 422, 387, 367,
|
||||
422, 390, 425, 411, 832, 416, 351, 421, 416, 841, 439, 353, 423, 391, 410, 406, 1232, 395, 419, 346, 426, 413, 557,
|
||||
339, 430, 850, 408, 403, 423, 343, 1247, 372, 404, 356, 858, 344, 348, 766, 834, 335, 1148, 702, 407, 396, 436, 370,
|
||||
378, 434, 416, 409, 388, 401, 397, 350, 419, 846, 375, 354, 415, 433, 762, 422, 362, 359, 383, 346, 340, 832, 415,
|
||||
435, 360, 396, 435, 422, 409, 412, 429, 375, 385, 375, 407, 429, 416, 415, 424, 344, 421, 360, 403, 409, 405, 350,
|
||||
393, 375, 368, 421, 351, 365, 419, 350, 416, 434, 350, 432, 400, 406, 410, 400, 388, 413, 362, 391, 347, 437, 373,
|
||||
336, 398, 404, 353, 431, 412, 786, 420, 424, 403, 355, 417, 417, 347, 427, 390, 434, 363, 360, 410, 380, 408, 409,
|
||||
379, 391, 405, 433, 407, 396, 358, 427, 419, 429, 396, 776, 421, 415, 349, 411, 435, 439, 357, 421, 409, 417, 431,
|
||||
417, 340, 428, 379, 342, 437, 402, 352, 394, 724, 410, 379, 395, 414, 393, 417, 421, 341, 391, 348, 375, 426, 416,
|
||||
344, 398, 413, 412, 426, 433, 340, 355, 361, 381, 374, 380, 349, 407, 391, 422, 420, 417, 392, 423, 415, 382, 334,
|
||||
401, 428, 389, 390, 440, 423, 401, 437, 341, 379, 413, 343, 424, 406, 789, 352, 372, 401, 375, 368, 428, 401, 395,
|
||||
440, 369, 439, 381, 431, 412, 350, 400, 415, 432, 387, 367, 426, 386, 402, 410, 407, 407, 356, 428
|
||||
],
|
||||
"percentileMs": {
|
||||
"50": 40.7,
|
||||
|
||||
@@ -5,11 +5,15 @@
|
||||
"@babel/preset-react": "^7.16.7",
|
||||
"@swc/core": "^1.2.133",
|
||||
"benchmark": "^2.1.4",
|
||||
"braces": "^3.0.2",
|
||||
"esbuild": "^0.14.12",
|
||||
"eventemitter3": "^5.0.0",
|
||||
"execa": "^8.0.1",
|
||||
"fast-glob": "3.3.1",
|
||||
"fdir": "^6.1.0",
|
||||
"mitata": "^0.1.6"
|
||||
"mitata": "^0.1.6",
|
||||
"string-width": "^7.0.0",
|
||||
"zx": "^7.2.3"
|
||||
},
|
||||
"scripts": {
|
||||
"ffi": "cd ffi && bun run deps && bun run build && bun run bench",
|
||||
@@ -21,6 +25,5 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"fast-deep-equal": "^3.1.3"
|
||||
},
|
||||
"prettier": "../.prettierrc.cjs"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@ for (let size of [32, 2048, 1024 * 16, 1024 * 1024 * 2, 1024 * 1024 * 16]) {
|
||||
size > 1024 * 1024
|
||||
? new Intl.NumberFormat(undefined, { unit: "megabyte", style: "unit" })
|
||||
: size > 1024
|
||||
? new Intl.NumberFormat(undefined, { unit: "kilobyte", style: "unit" })
|
||||
: new Intl.NumberFormat(undefined, { unit: "byte", style: "unit" });
|
||||
? new Intl.NumberFormat(undefined, { unit: "kilobyte", style: "unit" })
|
||||
: new Intl.NumberFormat(undefined, { unit: "byte", style: "unit" });
|
||||
|
||||
bench(
|
||||
`Buffer.concat(${fmt.format(
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { bench, run } from "../node_modules/mitata/src/cli.mjs";
|
||||
|
||||
// pure JS implementation will optimze this out
|
||||
// bench("new Headers", function () {
|
||||
// return new Headers();
|
||||
// });
|
||||
bench("new Headers", function () {
|
||||
return new Headers();
|
||||
});
|
||||
|
||||
var big = new Headers({
|
||||
"Content-Type": "text/plain",
|
||||
@@ -17,17 +17,128 @@ var big = new Headers({
|
||||
"X-Yet-Another-Custom-Headz": "Hello Worlda",
|
||||
});
|
||||
|
||||
// bench("Header.get", function () {
|
||||
// return big.get("Content-Type");
|
||||
// });
|
||||
bench("new Headers([])", () => {
|
||||
return new Headers([]);
|
||||
});
|
||||
|
||||
// bench("Header.set (standard)", function () {
|
||||
// return big.set("Content-Type", "text/html");
|
||||
// });
|
||||
bench("new Headers({})", () => {
|
||||
return new Headers({});
|
||||
});
|
||||
|
||||
// bench("Header.set (non-standard)", function () {
|
||||
// return big.set("X-My-Custom", "text/html123");
|
||||
// });
|
||||
bench("new Headers(object)", () => {
|
||||
return new Headers({
|
||||
"Content-Type": "text/plain",
|
||||
"Content-Length": "123",
|
||||
"User-Agent": "node-fetch/1.0",
|
||||
});
|
||||
});
|
||||
|
||||
bench("new Headers(hugeObject)", () => {
|
||||
return new Headers({
|
||||
"Accept": "123",
|
||||
"Accept-Charset": "123",
|
||||
"Accept-Language": "123",
|
||||
"Accept-Encoding": "123",
|
||||
"Accept-Ranges": "123",
|
||||
"Access-Control-Allow-Credentials": "123",
|
||||
"Access-Control-Allow-Headers": "123",
|
||||
"Access-Control-Allow-Methods": "123",
|
||||
"Access-Control-Allow-Origin": "123",
|
||||
"Access-Control-Expose-Headers": "123",
|
||||
"Access-Control-Max-Age": "123",
|
||||
"Access-Control-Request-Headers": "123",
|
||||
"Access-Control-Request-Method": "123",
|
||||
"Age": "123",
|
||||
"Authorization": "123",
|
||||
"Cache-Control": "123",
|
||||
"Connection": "123",
|
||||
"Content-Disposition": "123",
|
||||
"Content-Encoding": "123",
|
||||
"Content-Language": "123",
|
||||
"Content-Length": "123",
|
||||
"Content-Location": "123",
|
||||
"Content-Security-Policy": "123",
|
||||
"Content-Security-Policy-Report-Only": "123",
|
||||
"Content-Type": "123",
|
||||
"Content-Range": "123",
|
||||
"Cookie": "123",
|
||||
"Cookie2": "123",
|
||||
"Cross-Origin-Embedder-Policy": "123",
|
||||
"Cross-Origin-Embedder-Policy-Report-Only": "123",
|
||||
"Cross-Origin-Opener-Policy": "123",
|
||||
"Cross-Origin-Opener-Policy-Report-Only": "123",
|
||||
"Cross-Origin-Resource-Policy": "123",
|
||||
"Date": "123",
|
||||
"DNT": "123",
|
||||
"Default-Style": "123",
|
||||
"ETag": "123",
|
||||
"Expect": "123",
|
||||
"Expires": "123",
|
||||
"Host": "123",
|
||||
"If-Match": "123",
|
||||
"If-Modified-Since": "123",
|
||||
"If-None-Match": "123",
|
||||
"If-Range": "123",
|
||||
"If-Unmodified-Since": "123",
|
||||
"Keep-Alive": "123",
|
||||
"Last-Event-ID": "123",
|
||||
"Last-Modified": "123",
|
||||
"Link": "123",
|
||||
"Location": "123",
|
||||
"Origin": "123",
|
||||
"Ping-From": "123",
|
||||
"Ping-To": "123",
|
||||
"Purpose": "123",
|
||||
"Pragma": "123",
|
||||
"Proxy-Authorization": "123",
|
||||
"Range": "123",
|
||||
"Referer": "123",
|
||||
"Referrer-Policy": "123",
|
||||
"Refresh": "123",
|
||||
"Report-To": "123",
|
||||
"Sec-Fetch-Dest": "123",
|
||||
"Sec-Fetch-Mode": "123",
|
||||
"Sec-WebSocket-Accept": "123",
|
||||
"Sec-WebSocket-Extensions": "123",
|
||||
"Sec-WebSocket-Key": "123",
|
||||
"Sec-WebSocket-Protocol": "123",
|
||||
"Sec-WebSocket-Version": "123",
|
||||
"Server-Timing": "123",
|
||||
"Service-Worker": "123",
|
||||
"Service-Worker-Allowed": "123",
|
||||
"Service-Worker-Navigation-Preload": "123",
|
||||
"Set-Cookie": "123",
|
||||
"Set-Cookie2": "123",
|
||||
"SourceMap": "123",
|
||||
"TE": "123",
|
||||
"Timing-Allow-Origin": "123",
|
||||
"Trailer": "123",
|
||||
"Transfer-Encoding": "123",
|
||||
"Upgrade": "123",
|
||||
"Upgrade-Insecure-Requests": "123",
|
||||
"User-Agent": "123",
|
||||
"Vary": "123",
|
||||
"Via": "123",
|
||||
"X-Content-Type-Options": "123",
|
||||
"X-DNS-Prefetch-Control": "123",
|
||||
"X-Frame-Options": "123",
|
||||
"X-SourceMap": "123",
|
||||
"X-XSS-Protection": "123",
|
||||
"X-Temp-Tablet": "123",
|
||||
});
|
||||
});
|
||||
|
||||
bench("Header.get", function () {
|
||||
return big.get("Content-Type");
|
||||
});
|
||||
|
||||
bench("Header.set (standard)", function () {
|
||||
return big.set("Content-Type", "text/html");
|
||||
});
|
||||
|
||||
bench("Header.set (non-standard)", function () {
|
||||
return big.set("X-My-Custom", "text/html123");
|
||||
});
|
||||
|
||||
if (big.toJSON)
|
||||
bench("Headers.toJSON", function () {
|
||||
@@ -42,4 +153,4 @@ bench("Object.fromEntries(headers)", function () {
|
||||
return Object.fromEntries(big);
|
||||
});
|
||||
|
||||
run();
|
||||
await run();
|
||||
|
||||
37
bench/snippets/shell-spawn.mjs
Normal file
37
bench/snippets/shell-spawn.mjs
Normal file
@@ -0,0 +1,37 @@
|
||||
import { $ as zx } from "zx";
|
||||
import { $ as execa$ } from "execa";
|
||||
import { bench, run, group } from "./runner.mjs";
|
||||
|
||||
const execa = execa$({ stdio: "ignore", cwd: import.meta.dirname });
|
||||
|
||||
group("echo hi", () => {
|
||||
if (typeof Bun !== "undefined")
|
||||
bench("$`echo hi`", async () => {
|
||||
await Bun.$`echo hi`.quiet();
|
||||
});
|
||||
|
||||
bench("execa`echo hi`", async () => {
|
||||
await execa`echo hi`;
|
||||
});
|
||||
|
||||
bench("zx`echo hi`", async () => {
|
||||
await zx`echo hi`.quiet();
|
||||
});
|
||||
});
|
||||
|
||||
group("ls .", () => {
|
||||
if (typeof Bun !== "undefined")
|
||||
bench("$`ls .`", async () => {
|
||||
await Bun.$`ls .`.quiet();
|
||||
});
|
||||
|
||||
bench("execa`ls .`", async () => {
|
||||
await execa`ls .`;
|
||||
});
|
||||
|
||||
bench("zx`ls .`", async () => {
|
||||
await zx`ls .`.quiet();
|
||||
});
|
||||
});
|
||||
|
||||
await run();
|
||||
44
bench/snippets/string-width.mjs
Normal file
44
bench/snippets/string-width.mjs
Normal file
@@ -0,0 +1,44 @@
|
||||
import { bench, run } from "./runner.mjs";
|
||||
import npmStringWidth from "string-width";
|
||||
|
||||
const bunStringWidth = globalThis?.Bun?.stringWidth;
|
||||
|
||||
bench("npm/string-width (ansi + emoji + ascii)", () => {
|
||||
npmStringWidth("hello there! 😀\u001b[31m😀😀");
|
||||
});
|
||||
|
||||
bench("npm/string-width (ansi + emoji)", () => {
|
||||
npmStringWidth("😀\u001b[31m😀😀");
|
||||
});
|
||||
|
||||
bench("npm/string-width (ansi + ascii)", () => {
|
||||
npmStringWidth("\u001b[31mhello there!");
|
||||
});
|
||||
|
||||
if (bunStringWidth) {
|
||||
bench("Bun.stringWidth (ansi + emoji + ascii)", () => {
|
||||
bunStringWidth("hello there! 😀\u001b[31m😀😀");
|
||||
});
|
||||
|
||||
bench("Bun.stringWidth (ansi + emoji)", () => {
|
||||
bunStringWidth("😀\u001b[31m😀😀");
|
||||
});
|
||||
|
||||
bench("Bun.stringWidth (ansi + ascii)", () => {
|
||||
bunStringWidth("\u001b[31mhello there!");
|
||||
});
|
||||
|
||||
if (npmStringWidth("😀\u001b[31m😀😀") !== bunStringWidth("😀\u001b[31m😀😀")) {
|
||||
console.error("string-width mismatch");
|
||||
}
|
||||
|
||||
if (npmStringWidth("hello there! 😀\u001b[31m😀😀") !== bunStringWidth("hello there! 😀\u001b[31m😀😀")) {
|
||||
console.error("string-width mismatch");
|
||||
}
|
||||
|
||||
if (npmStringWidth("\u001b[31mhello there!") !== bunStringWidth("\u001b[31mhello there!")) {
|
||||
console.error("string-width mismatch");
|
||||
}
|
||||
}
|
||||
|
||||
await run();
|
||||
113
bench/snippets/urlsearchparams.mjs
Normal file
113
bench/snippets/urlsearchparams.mjs
Normal file
@@ -0,0 +1,113 @@
|
||||
import { bench, run } from "./runner.mjs";
|
||||
|
||||
// bench("new URLSearchParams({})", () => {
|
||||
// return new URLSearchParams({});
|
||||
// });
|
||||
|
||||
bench("new URLSearchParams(obj)", () => {
|
||||
return new URLSearchParams({
|
||||
"Content-Type": "text/plain",
|
||||
"Content-Length": "123",
|
||||
"User-Agent": "node-fetch/1.0",
|
||||
"Accept-Encoding": "gzip,deflate",
|
||||
"Content-Length": "0",
|
||||
"Content-Range": "bytes 0-9/10",
|
||||
});
|
||||
});
|
||||
|
||||
bench("new URLSearchParams(absurdlyHugeObject)", () => {
|
||||
return new URLSearchParams({
|
||||
"Accept": "123",
|
||||
"Accept-Charset": "123",
|
||||
"Accept-Language": "123",
|
||||
"Accept-Encoding": "123",
|
||||
"Accept-Ranges": "123",
|
||||
"Access-Control-Allow-Credentials": "123",
|
||||
"Access-Control-Allow-Headers": "123",
|
||||
"Access-Control-Allow-Methods": "123",
|
||||
"Access-Control-Allow-Origin": "123",
|
||||
"Access-Control-Expose-Headers": "123",
|
||||
"Access-Control-Max-Age": "123",
|
||||
"Access-Control-Request-Headers": "123",
|
||||
"Access-Control-Request-Method": "123",
|
||||
"Age": "123",
|
||||
"Authorization": "123",
|
||||
"Cache-Control": "123",
|
||||
"Connection": "123",
|
||||
"Content-Disposition": "123",
|
||||
"Content-Encoding": "123",
|
||||
"Content-Language": "123",
|
||||
"Content-Length": "123",
|
||||
"Content-Location": "123",
|
||||
"Content-Security-Policy": "123",
|
||||
"Content-Security-Policy-Report-Only": "123",
|
||||
"Content-Type": "123",
|
||||
"Content-Range": "123",
|
||||
"Cookie": "123",
|
||||
"Cookie2": "123",
|
||||
"Cross-Origin-Embedder-Policy": "123",
|
||||
"Cross-Origin-Embedder-Policy-Report-Only": "123",
|
||||
"Cross-Origin-Opener-Policy": "123",
|
||||
"Cross-Origin-Opener-Policy-Report-Only": "123",
|
||||
"Cross-Origin-Resource-Policy": "123",
|
||||
"Date": "123",
|
||||
"DNT": "123",
|
||||
"Default-Style": "123",
|
||||
"ETag": "123",
|
||||
"Expect": "123",
|
||||
"Expires": "123",
|
||||
"Host": "123",
|
||||
"If-Match": "123",
|
||||
"If-Modified-Since": "123",
|
||||
"If-None-Match": "123",
|
||||
"If-Range": "123",
|
||||
"If-Unmodified-Since": "123",
|
||||
"Keep-Alive": "123",
|
||||
"Last-Event-ID": "123",
|
||||
"Last-Modified": "123",
|
||||
"Link": "123",
|
||||
"Location": "123",
|
||||
"Origin": "123",
|
||||
"Ping-From": "123",
|
||||
"Ping-To": "123",
|
||||
"Purpose": "123",
|
||||
"Pragma": "123",
|
||||
"Proxy-Authorization": "123",
|
||||
"Range": "123",
|
||||
"Referer": "123",
|
||||
"Referrer-Policy": "123",
|
||||
"Refresh": "123",
|
||||
"Report-To": "123",
|
||||
"Sec-Fetch-Dest": "123",
|
||||
"Sec-Fetch-Mode": "123",
|
||||
"Sec-WebSocket-Accept": "123",
|
||||
"Sec-WebSocket-Extensions": "123",
|
||||
"Sec-WebSocket-Key": "123",
|
||||
"Sec-WebSocket-Protocol": "123",
|
||||
"Sec-WebSocket-Version": "123",
|
||||
"Server-Timing": "123",
|
||||
"Service-Worker": "123",
|
||||
"Service-Worker-Allowed": "123",
|
||||
"Service-Worker-Navigation-Preload": "123",
|
||||
"Set-Cookie": "123",
|
||||
"Set-Cookie2": "123",
|
||||
"SourceMap": "123",
|
||||
"TE": "123",
|
||||
"Timing-Allow-Origin": "123",
|
||||
"Trailer": "123",
|
||||
"Transfer-Encoding": "123",
|
||||
"Upgrade": "123",
|
||||
"Upgrade-Insecure-Requests": "123",
|
||||
"User-Agent": "123",
|
||||
"Vary": "123",
|
||||
"Via": "123",
|
||||
"X-Content-Type-Options": "123",
|
||||
"X-DNS-Prefetch-Control": "123",
|
||||
"X-Frame-Options": "123",
|
||||
"X-SourceMap": "123",
|
||||
"X-XSS-Protection": "123",
|
||||
"X-Temp-Tablet": "123",
|
||||
});
|
||||
});
|
||||
|
||||
await run();
|
||||
70
biome.json
Normal file
70
biome.json
Normal file
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
|
||||
"organizeImports": {
|
||||
"enabled": true
|
||||
},
|
||||
"linter": {
|
||||
"enabled": false
|
||||
},
|
||||
"javascript": {
|
||||
"parser": {
|
||||
"unsafeParameterDecoratorsEnabled": true
|
||||
},
|
||||
"formatter": {
|
||||
"arrowParentheses": "asNeeded",
|
||||
"quoteProperties": "preserve",
|
||||
"semicolons": "always",
|
||||
"trailingComma": "all",
|
||||
"indentStyle": "space",
|
||||
"quoteStyle": "double"
|
||||
}
|
||||
},
|
||||
"json": {
|
||||
"formatter": {
|
||||
"indentStyle": "space"
|
||||
},
|
||||
"parser": {
|
||||
"allowComments": true,
|
||||
"allowTrailingCommas": true
|
||||
}
|
||||
},
|
||||
"vcs": {
|
||||
"clientKind": "git",
|
||||
"enabled": false,
|
||||
"root": "./"
|
||||
},
|
||||
"files": {
|
||||
"maxSize": 9128312873
|
||||
},
|
||||
"formatter": {
|
||||
"enabled": true,
|
||||
"indentWidth": 2,
|
||||
"lineEnding": "lf",
|
||||
"formatWithErrors": true,
|
||||
"lineWidth": 120,
|
||||
"indentStyle": "space",
|
||||
"ignore": [
|
||||
"node_modules/**",
|
||||
"test/snapshots",
|
||||
"test/fixtures",
|
||||
".next",
|
||||
"test/js/deno",
|
||||
"./src/deps",
|
||||
"./src/bun.js/WebKit/**",
|
||||
"packages/bun-polyfills",
|
||||
"./build-*",
|
||||
"./build",
|
||||
".cache",
|
||||
"out/",
|
||||
"test/transpiler/property-non-ascii-fixture.js",
|
||||
"test/transpiler/macro-test.test.ts",
|
||||
"test/transpiler/decorator-metadata.test.ts",
|
||||
"src/react-refresh.js",
|
||||
"bindings-obj/*",
|
||||
"src/deps/**",
|
||||
"./bench/react-hello-world/react-hello-world.node.js",
|
||||
"./test/cli/run/require-cache-bug-leak-fixture-large-ast.js",
|
||||
"./test/cli/run/esm-leak-fixture-large-ast.mjs"
|
||||
]
|
||||
}
|
||||
}
|
||||
39
build.zig
39
build.zig
@@ -79,6 +79,7 @@ const BunBuildOptions = struct {
|
||||
fallback_html_version: u64 = 0,
|
||||
|
||||
tinycc: bool = true,
|
||||
project: [:0]const u8 = "",
|
||||
|
||||
pub fn updateRuntime(this: *BunBuildOptions) anyerror!void {
|
||||
if (std.fs.cwd().openFile("src/runtime.out.js", .{ .mode = .read_only })) |file| {
|
||||
@@ -192,16 +193,30 @@ pub fn build_(b: *Build) !void {
|
||||
const bin_label = if (optimize == std.builtin.OptimizeMode.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";
|
||||
target.os_version_min = std.zig.CrossTarget.OsVersion{ .semver = .{ .major = 11, .minor = 0, .patch = 0 } };
|
||||
} else if (target.isLinux()) {
|
||||
target.setGnuLibCVersion(2, 27, 0);
|
||||
var os_tagname = @tagName(target.getOs().tag);
|
||||
|
||||
switch (target.getOs().tag) {
|
||||
.macos => {
|
||||
os_tagname = "darwin";
|
||||
target.os_version_min = std.zig.CrossTarget.OsVersion{ .semver = .{ .major = 11, .minor = 0, .patch = 0 } };
|
||||
},
|
||||
.windows => {
|
||||
target.os_version_min = std.zig.CrossTarget.OsVersion{
|
||||
// Windows 1809
|
||||
// Minimum version for a syscall related to bun.sys.renameat
|
||||
// if you update this please update install.ps1
|
||||
.windows = .win10_rs5,
|
||||
};
|
||||
},
|
||||
.linux => {
|
||||
target.setGnuLibCVersion(2, 27, 0);
|
||||
},
|
||||
else => {},
|
||||
}
|
||||
|
||||
@memcpy(triplet_buf[0..].ptr, os_tagname);
|
||||
const osname = triplet_buf[0..os_tagname.len];
|
||||
triplet_buf[osname.len] = '-';
|
||||
@@ -330,10 +345,12 @@ pub fn build_(b: *Build) !void {
|
||||
obj.target.cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v2 };
|
||||
} else if (arch.isX86()) {
|
||||
obj.target.cpu_model = .{ .explicit = &std.Target.x86.cpu.haswell };
|
||||
} else if (arch.isAARCH64() and target.isDarwin()) {
|
||||
obj.target.cpu_model = .{ .explicit = &std.Target.aarch64.cpu.apple_m1 };
|
||||
} else if (arch.isAARCH64() and target.isLinux()) {
|
||||
obj.target.cpu_model = .{ .explicit = &std.Target.aarch64.cpu.generic };
|
||||
} else if (arch.isAARCH64()) {
|
||||
if (target.isDarwin()) {
|
||||
obj.target.cpu_model = .{ .explicit = &std.Target.aarch64.cpu.apple_m1 };
|
||||
} else {
|
||||
obj.target.cpu_model = .{ .explicit = &std.Target.aarch64.cpu.generic };
|
||||
}
|
||||
}
|
||||
|
||||
try default_build_options.updateRuntime();
|
||||
@@ -362,6 +379,7 @@ pub fn build_(b: *Build) !void {
|
||||
actual_build_options.sizegen = true;
|
||||
}
|
||||
|
||||
actual_build_options.project = "bun";
|
||||
obj.addOptions("build_options", actual_build_options.step(b));
|
||||
|
||||
// Generated Code
|
||||
@@ -573,6 +591,7 @@ pub fn build_(b: *Build) !void {
|
||||
\\For more info, see https://bun.sh/docs/project/contributing
|
||||
\\
|
||||
});
|
||||
|
||||
b.default_step.dependOn(&mistake_message.step);
|
||||
}
|
||||
|
||||
|
||||
@@ -65,19 +65,19 @@ Below we create a new `DataView` and set the first byte to 5.
|
||||
|
||||
```ts
|
||||
const buf = new ArrayBuffer(4);
|
||||
// [0x0, 0x0, 0x0, 0x0]
|
||||
// [0b00000000, 0b00000000, 0b00000000, 0b00000000]
|
||||
|
||||
const dv = new DataView(buf);
|
||||
dv.setUint8(0, 3); // write value 3 at byte offset 0
|
||||
dv.getUint8(0); // => 3
|
||||
// [0x11, 0x0, 0x0, 0x0]
|
||||
// [0b00000011, 0b00000000, 0b00000000, 0b00000000]
|
||||
```
|
||||
|
||||
Now let's write a `Uint16` at byte offset `1`. This requires two bytes. We're using the value `513`, which is `2 * 256 + 1`; in bytes, that's `00000010 00000001`.
|
||||
|
||||
```ts
|
||||
dv.setUint16(1, 513);
|
||||
// [0x11, 0x10, 0x1, 0x0]
|
||||
// [0b00000011, 0b00000010, 0b00000001, 0b00000000]
|
||||
|
||||
console.log(dv.getUint16(1)); // => 513
|
||||
```
|
||||
|
||||
@@ -249,6 +249,42 @@ writer.unref();
|
||||
writer.ref();
|
||||
```
|
||||
|
||||
## Directories
|
||||
|
||||
Bun's implementation of `node:fs` is fast, and we haven't implemented a Bun-specific API for reading directories just yet. For now, you should use `node:fs` for working with directories in Bun.
|
||||
|
||||
### Reading directories (readdir)
|
||||
|
||||
To read a directory in Bun, use `readdir` from `node:fs`.
|
||||
|
||||
```ts
|
||||
import { readdir } from "node:fs/promises";
|
||||
|
||||
// read all the files in the current directory
|
||||
const files = await readdir(import.meta.dir);
|
||||
```
|
||||
|
||||
#### Reading directories recursively
|
||||
|
||||
To recursively read a directory in Bun, use `readdir` with `recursive: true`.
|
||||
|
||||
```ts
|
||||
import { readdir } from "node:fs/promises";
|
||||
|
||||
// read all the files in the current directory, recursively
|
||||
const files = await readdir("../", { recursive: true });
|
||||
```
|
||||
|
||||
### Creating directories (mkdir)
|
||||
|
||||
To recursively create a directory, use `mkdir` in `node:fs`:
|
||||
|
||||
```ts
|
||||
import { mkdir } from "node:fs/promises";
|
||||
|
||||
await mkdir("path/to/dir", { recursive: true });
|
||||
```
|
||||
|
||||
## Benchmarks
|
||||
|
||||
The following is a 3-line implementation of the Linux `cat` command.
|
||||
|
||||
@@ -7,7 +7,7 @@ Bun includes a fast native implementation of file globbing.
|
||||
```ts
|
||||
import { Glob } from "bun";
|
||||
|
||||
const glob = new Glob("*.ts");
|
||||
const glob = new Glob("**/*.ts");
|
||||
|
||||
// Scans the current working directory and each of its sub-directories recursively
|
||||
for await (const file of glob.scan(".")) {
|
||||
|
||||
@@ -23,6 +23,11 @@ import.meta.resolveSync("zod")
|
||||
|
||||
---
|
||||
|
||||
- `import.meta.dirname`
|
||||
- An alias to `import.meta.dir`, for Node.js compatibility
|
||||
|
||||
---
|
||||
|
||||
- `import.meta.file`
|
||||
- The name of the current file, e.g. `index.tsx`
|
||||
|
||||
@@ -33,6 +38,16 @@ import.meta.resolveSync("zod")
|
||||
|
||||
---
|
||||
|
||||
- `import.meta.filename`
|
||||
- An alias to `import.meta.path`, for Node.js compatibility
|
||||
|
||||
---
|
||||
|
||||
- `import.meta.url`
|
||||
- A string url to the current file, e.g. `file:///path/to/project/index.tx`
|
||||
|
||||
---
|
||||
|
||||
- `import.meta.main`
|
||||
- `boolean` Indicates whether the current file is the entrypoint to the current `bun` process. Is the file being directly executed by `bun run` or is it being imported?
|
||||
|
||||
|
||||
@@ -57,6 +57,23 @@ import { Database } from "bun:sqlite";
|
||||
const db = new Database("mydb.sqlite", { create: true });
|
||||
```
|
||||
|
||||
### Load via ES module import
|
||||
|
||||
You can also use an import attribute to load a database.
|
||||
|
||||
```ts
|
||||
import db from "./mydb.sqlite" with {"type": "sqlite"};
|
||||
|
||||
console.log(db.query("select * from users LIMIT 1").get());
|
||||
```
|
||||
|
||||
This is equivalent to the following:
|
||||
|
||||
```ts
|
||||
import { Database } from "bun:sqlite";
|
||||
const db = new Database("./mydb.sqlite");
|
||||
```
|
||||
|
||||
### `.close()`
|
||||
|
||||
To close a database:
|
||||
|
||||
@@ -56,6 +56,45 @@ const stream = new ReadableStream({
|
||||
|
||||
When using a direct `ReadableStream`, all chunk queueing is handled by the destination. The consumer of the stream receives exactly what is passed to `controller.write()`, without any encoding or modification.
|
||||
|
||||
## Async generator streams
|
||||
|
||||
Bun also supports async generator functions as a source for `Response` and `Request`. This is an easy way to create a `ReadableStream` that fetches data from an asynchronous source.
|
||||
|
||||
```ts
|
||||
const response = new Response(async function* () {
|
||||
yield "hello";
|
||||
yield "world";
|
||||
}());
|
||||
|
||||
await response.text(); // "helloworld"
|
||||
```
|
||||
|
||||
You can also use `[Symbol.asyncIterator]` directly.
|
||||
|
||||
```ts
|
||||
const response = new Response({
|
||||
[Symbol.asyncIterator]: async function* () {
|
||||
yield "hello";
|
||||
yield "world";
|
||||
},
|
||||
});
|
||||
|
||||
await response.text(); // "helloworld"
|
||||
```
|
||||
|
||||
If you need more granular control over the stream, `yield` will return the direct ReadableStream controller.
|
||||
|
||||
```ts
|
||||
const response = new Response({
|
||||
[Symbol.asyncIterator]: async function* () {
|
||||
const controller = yield "hello";
|
||||
await controller.end();
|
||||
},
|
||||
});
|
||||
|
||||
await response.text(); // "hello"
|
||||
```
|
||||
|
||||
## `Bun.ArrayBufferSink`
|
||||
|
||||
The `Bun.ArrayBufferSink` class is a fast incremental writer for constructing an `ArrayBuffer` of unknown size.
|
||||
|
||||
@@ -50,7 +50,7 @@ export default jsx(
|
||||
To override the default loader specified in the `new Bun.Transpiler()` constructor, pass a second argument to `.transformSync()`.
|
||||
|
||||
```ts
|
||||
await transpiler.transform("<div>hi!</div>", "tsx");
|
||||
transpiler.transformSync("<div>hi!</div>", "tsx");
|
||||
```
|
||||
|
||||
{% details summary="Nitty gritty" %}
|
||||
|
||||
@@ -261,6 +261,24 @@ This function is optimized for large input. On an M1X, it processes 480 MB/s -
|
||||
20 GB/s, depending on how much data is being escaped and whether there is non-ascii
|
||||
text. Non-string types will be converted to a string before escaping.
|
||||
|
||||
## `Bun.stringWidth()`
|
||||
|
||||
```ts
|
||||
Bun.stringWidth(input: string, options?: { countAnsiEscapeCodes?: boolean = false }): number
|
||||
```
|
||||
|
||||
Returns the number of columns required to display a string. This is useful for aligning text in a terminal. By default, ANSI escape codes are removed before measuring the string. To include them, pass `{ countAnsiEscapeCodes: true }` as the second argument.
|
||||
|
||||
```ts
|
||||
Bun.stringWidth("hello"); // => 5
|
||||
Bun.stringWidth("\u001b[31mhello\u001b[0m"); // => 5
|
||||
Bun.stringWidth("\u001b[31mhello\u001b[0m", { countAnsiEscapeCodes: true }); // => 12
|
||||
```
|
||||
|
||||
Compared with the popular `string-width` npm package, `bun`'s implementation is > [100x faster](https://github.com/oven-sh/bun/blob/8abd1fb088bcf2e78bd5d0d65ba4526872d2ab61/bench/snippets/string-width.mjs#L22)
|
||||
|
||||
|
||||
|
||||
<!-- ## `Bun.enableANSIColors()` -->
|
||||
|
||||
## `Bun.fileURLToPath()`
|
||||
|
||||
@@ -182,12 +182,12 @@ const server = Bun.serve<{ username: string }>({
|
||||
open(ws) {
|
||||
const msg = `${ws.data.username} has entered the chat`;
|
||||
ws.subscribe("the-group-chat");
|
||||
ws.publish("the-group-chat", msg);
|
||||
server.publish("the-group-chat", msg);
|
||||
},
|
||||
message(ws, message) {
|
||||
// this is a group chat
|
||||
// so the server re-broadcasts incoming message to everyone
|
||||
ws.publish("the-group-chat", `${ws.data.username}: ${message}`);
|
||||
server.publish("the-group-chat", `${ws.data.username}: ${message}`);
|
||||
},
|
||||
close(ws) {
|
||||
const msg = `${ws.data.username} has left the chat`;
|
||||
@@ -245,6 +245,34 @@ The `.send(message)` method of `ServerWebSocket` returns a `number` indicating t
|
||||
|
||||
This gives you better control over backpressure in your server.
|
||||
|
||||
### Timeouts and limits
|
||||
|
||||
By default, Bun will close a WebSocket connection if it is idle for 120 seconds. This can be configured with the `idleTimeout` parameter.
|
||||
|
||||
```ts
|
||||
Bun.serve({
|
||||
fetch(req, server) {}, // upgrade logic
|
||||
websocket: {
|
||||
idleTimeout: 60, // 60 seconds
|
||||
|
||||
// ...
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
Bun will also close a WebSocket connection if it receives a message that is larger than 16 MB. This can be configured with the `maxPayloadLength` parameter.
|
||||
|
||||
```ts
|
||||
Bun.serve({
|
||||
fetch(req, server) {}, // upgrade logic
|
||||
websocket: {
|
||||
maxPayloadLength: 1024 * 1024, // 1 MB
|
||||
|
||||
// ...
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
## Connect to a `Websocket` server
|
||||
|
||||
Bun implements the `WebSocket` class. To create a WebSocket client that connects to a `ws://` or `wss://` server, create an instance of `WebSocket`, as you would in the browser.
|
||||
@@ -296,6 +324,14 @@ namespace Bun {
|
||||
close?: (ws: ServerWebSocket) => void;
|
||||
error?: (ws: ServerWebSocket, error: Error) => void;
|
||||
drain?: (ws: ServerWebSocket) => void;
|
||||
|
||||
maxPayloadLength?: number; // default: 16 * 1024 * 1024 = 16 MB
|
||||
idleTimeout?: number; // default: 120 (seconds)
|
||||
backpressureLimit?: number; // default: 1024 * 1024 = 1 MB
|
||||
closeOnBackpressureLimit?: boolean; // default: false
|
||||
sendPings?: boolean; // default: true
|
||||
publishToSelf?: boolean; // default: false
|
||||
|
||||
perMessageDeflate?:
|
||||
| boolean
|
||||
| {
|
||||
|
||||
@@ -32,6 +32,25 @@ All imported files and packages are bundled into the executable, along with a co
|
||||
|
||||
{% /callout %}
|
||||
|
||||
## SQLite
|
||||
|
||||
You can use `bun:sqlite` imports with `bun build --compile`.
|
||||
|
||||
By default, the database is resolved relative to the current working directory of the process.
|
||||
|
||||
```js
|
||||
import db from './my.db' with {type: "sqlite"};
|
||||
|
||||
console.log(db.query("select * from users LIMIT 1").get());
|
||||
```
|
||||
|
||||
That means if the executable is located at `/usr/bin/hello`, the user's terminal is located at `/home/me/Desktop`, it will look for `/home/me/Desktop/my.db`.
|
||||
|
||||
```
|
||||
$ cd /home/me/Desktop
|
||||
$ ./hello
|
||||
```
|
||||
|
||||
## Embedding files
|
||||
|
||||
Standalone executables support embedding files.
|
||||
@@ -55,6 +74,30 @@ You may need to specify a `--loader` for it to be treated as a `"file"` loader (
|
||||
|
||||
Embedded files can be read using `Bun.file`'s functions or the Node.js `fs.readFile` function (in `"node:fs"`).
|
||||
|
||||
### Embedding SQLite databases
|
||||
|
||||
If your application wants to embed a SQLite database, set `type: "sqlite"` in the import attribute and the `embed` attribute to `"true"`.
|
||||
|
||||
```js
|
||||
import myEmbeddedDb from "./my.db" with {type: "sqlite", embed: "true"};
|
||||
|
||||
console.log(myEmbeddedDb.query("select * from users LIMIT 1").get());
|
||||
```
|
||||
|
||||
This database is read-write, but all changes are lost when the executable exits (since it's stored in memory).
|
||||
|
||||
### Embedding N-API Addons
|
||||
|
||||
As of Bun v1.0.23, you can embed `.node` files into executables.
|
||||
|
||||
```js
|
||||
const addon = require("./addon.node");
|
||||
|
||||
console.log(addon.hello());
|
||||
```
|
||||
|
||||
Unfortunately, if you're using `@mapbox/node-pre-gyp` or other similar tools, you'll need to make sure the `.node` file is directly required or it won't bundle correctly.
|
||||
|
||||
## Minification
|
||||
|
||||
To trim down the size of the executable a little, pass `--minify` to `bun build --compile`. This uses Bun's minifier to reduce the code size. Overall though, Bun's binary is still way too big and we need to make it smaller.
|
||||
|
||||
@@ -43,7 +43,7 @@ Let's build our first bundle. You have the following two files, which implement
|
||||
import * as ReactDOM from 'react-dom/client';
|
||||
import {Component} from "./Component"
|
||||
|
||||
const root = ReactDOM.createRoot(document.getElementById('root'));
|
||||
const root = ReactDOM.createRoot(document.getElementById('root')!);
|
||||
root.render(<Component message="Sup!" />)
|
||||
```
|
||||
|
||||
@@ -155,7 +155,7 @@ Like the Bun runtime, the bundler supports an array of file types out of the box
|
||||
|
||||
---
|
||||
|
||||
- `.js` `.cjs` `.mjs` `.mts` `.cts` `.ts` `.tsx`
|
||||
- `.js` `.jsx`, `.cjs` `.mjs` `.mts` `.cts` `.ts` `.tsx`
|
||||
- Uses Bun's built-in transpiler to parse the file and transpile TypeScript/JSX syntax to vanilla JavaScript. The bundler executes a set of default transforms, including dead code elimination, tree shaking, and environment variable inlining. At the moment Bun does not attempt to down-convert syntax; if you use recently ECMAScript syntax, that will be reflected in the bundled code.
|
||||
|
||||
---
|
||||
|
||||
@@ -171,6 +171,41 @@ console.log(addon);
|
||||
|
||||
In the bundler, `.node` files are handled using the [`file`](#file) loader.
|
||||
|
||||
### `sqlite`
|
||||
|
||||
**SQLite loader**. `with { "type": "sqlite" }` import attribute
|
||||
|
||||
In the runtime and bundler, SQLite databases can be directly imported. This will load the database using [`bun:sqlite`](/docs/api/sqlite.md).
|
||||
|
||||
```ts
|
||||
import db from "./my.db" with {type: "sqlite"};
|
||||
```
|
||||
|
||||
This is only supported when the `target` is `bun`.
|
||||
|
||||
By default, the database is external to the bundle (so that you can potentially use a database loaded elsewhere), so the database file on-disk won't be bundled into the final output.
|
||||
|
||||
You can change this behavior with the `"embed"` attribute:
|
||||
|
||||
```ts
|
||||
// embed the database into the bundle
|
||||
import db from "./my.db" with {type: "sqlite", embed: "true"};
|
||||
```
|
||||
|
||||
When using a [standalone executable](/docs/bundler/executables), the database is embedded into the single-file executable.
|
||||
|
||||
Otherwise, the database to embed is copied into the `outdir` with a hashed filename.
|
||||
|
||||
### `bunshell` loader
|
||||
|
||||
**Bun Shell loader**. Default for `.bun.sh` files
|
||||
|
||||
This loader is used to parse [Bun Shell](/docs/runtime/shell) scripts. It's only supported when starting bun itself, so it's not available in the bundler or in the runtime.
|
||||
|
||||
```sh
|
||||
$ bun run ./script.bun.sh
|
||||
```
|
||||
|
||||
### `file`
|
||||
|
||||
**File loader**. Default for all unrecognized file types.
|
||||
|
||||
@@ -1,116 +0,0 @@
|
||||
Bundling is currently an important mechanism for building complex web apps.
|
||||
|
||||
Modern apps typically consist of a large number of files and package dependencies. Despite the fact that modern browsers support [ES Module](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules) imports, it's still too slow to fetch each file via individual HTTP requests. _Bundling_ is the process of concatenating several source files into a single large file that can be loaded in a single request.
|
||||
|
||||
{% callout %}
|
||||
**On bundling** — Despite recent advances like [`modulepreload`](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/modulepreload) and [HTTP/3](https://en.wikipedia.org/wiki/HTTP/3), bundling is still the most performant approach.
|
||||
{% /callout %}
|
||||
|
||||
## Bundling your app
|
||||
|
||||
Bun's approach to bundling is a little different from other bundlers. Start by passing your app's entrypoint to `bun bun`.
|
||||
|
||||
```bash
|
||||
$ bun bun ./app.js
|
||||
```
|
||||
|
||||
Your entrypoint can be any `js|jsx|ts|tsx|html` file. With this file as a starting point, Bun will construct a graph of imported files and packages, transpile everything, and generate a file called `node_modules.bun`.
|
||||
|
||||
## What is `.bun`?
|
||||
|
||||
{% callout %}
|
||||
**Note** — [This format may change soon](https://github.com/oven-sh/bun/issues/121)
|
||||
{% /callout %}
|
||||
|
||||
A `.bun` file contains the pre-transpiled source code of your application, plus a bunch of binary-encoded metadata about your application's structure. as a contains:
|
||||
|
||||
- all the bundled source code
|
||||
- all the bundled source code metadata
|
||||
- project metadata & configuration
|
||||
|
||||
Here are some of the questions `.bun` files answer:
|
||||
|
||||
- when I import `react/index.js`, where in the `.bun` is the code for that? (not resolving, just the code)
|
||||
- what modules of a package are used?
|
||||
- what framework is used? (e.g., Next.js)
|
||||
- where is the routes directory?
|
||||
- how big is each imported dependency?
|
||||
- what is the hash of the bundle’s contents? (for etags)
|
||||
- what is the name & version of every npm package exported in this bundle?
|
||||
- what modules from which packages are used in this project? ("project" is defined as all the entry points used to generate the .bun)
|
||||
|
||||
All in one file.
|
||||
|
||||
It’s a little like a build cache, but designed for reuse across builds.
|
||||
|
||||
{% details summary="Position-independent code" %}
|
||||
|
||||
From a design perspective, the most important part of the `.bun` format is how code is organized. Each module is exported by a hash like this:
|
||||
|
||||
```js
|
||||
// preact/dist/preact.module.js
|
||||
export var $eb6819b = $$m({
|
||||
"preact/dist/preact.module.js": (module, exports) => {
|
||||
let 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.
|
||||
{% /details %}
|
||||
|
||||
## Where is the code?
|
||||
|
||||
`.bun` files are marked as executable.
|
||||
|
||||
To print out the code, run `./node_modules.bun` in your terminal or run `bun ./path-to-node_modules.bun`.
|
||||
|
||||
Here is a copy-pastable example:
|
||||
|
||||
```bash
|
||||
$ ./node_modules.bun > node_modules.js
|
||||
```
|
||||
|
||||
This works because every `.bun` file starts with this:
|
||||
|
||||
```
|
||||
#!/usr/bin/env bun
|
||||
```
|
||||
|
||||
To deploy to production with Bun, you’ll want to get the code from the `.bun` file and stick that somewhere your web server can find it (or if you’re using Vercel or a Rails app, in a `public` folder).
|
||||
|
||||
Note that `.bun` is a binary file format, so just opening it in VSCode or vim might render strangely.
|
||||
|
||||
## Advanced
|
||||
|
||||
By default, `bun bun` only bundles external dependencies that are `import`ed or `require`d in either app code or another external dependency. An "external dependency" is defined as, "A JavaScript-like file that has `/node_modules/` in the resolved file path and a corresponding `package.json`".
|
||||
|
||||
To force Bun to bundle packages which are not located in a `node_modules` folder (i.e., the final, resolved path following all symlinks), add a `bun` section to the root project’s `package.json` with `alwaysBundle` set to an array of package names to always bundle. Here’s an example:
|
||||
|
||||
```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.
|
||||
@@ -63,6 +63,12 @@ $ bunx --bun my-cli # good
|
||||
$ bunx my-cli --bun # bad
|
||||
```
|
||||
|
||||
To force bun to always be used with a script, use a shebang.
|
||||
|
||||
```
|
||||
#!/usr/bin/env bun
|
||||
```
|
||||
|
||||
<!-- ## Environment variables
|
||||
|
||||
Bun automatically loads environment variables from `.env` files before running a file, script, or executable. The following files are checked, in order:
|
||||
|
||||
@@ -35,6 +35,6 @@ It creates:
|
||||
|
||||
If you pass `-y` or `--yes`, it will assume you want to continue without asking questions.
|
||||
|
||||
At the end, it runs `bun install` to install `bun-types`.
|
||||
At the end, it runs `bun install` to install `@types/bun`.
|
||||
|
||||
{% /details %}
|
||||
|
||||
@@ -103,7 +103,7 @@ Bun supports the following lifecycle hooks:
|
||||
| `afterEach` | Runs after each test. |
|
||||
| `afterAll` | Runs once after all tests. |
|
||||
|
||||
These hooks can be define inside test files, or in a separate file that is preloaded with the `--preload` flag.
|
||||
These hooks can be defined inside test files, or in a separate file that is preloaded with the `--preload` flag.
|
||||
|
||||
```ts
|
||||
$ bun test --preload ./setup.ts
|
||||
@@ -113,17 +113,13 @@ See [Test > Lifecycle](/docs/test/lifecycle) for complete documentation.
|
||||
|
||||
## Mocks
|
||||
|
||||
{% callout %}
|
||||
Module mocking (`jest.mock()`) is not yet supported. Track support for it [here](https://github.com/oven-sh/bun/issues/5394).
|
||||
{% /callout %}
|
||||
|
||||
Create mock functions with the `mock` function. Mocks are automatically reset between tests.
|
||||
|
||||
```ts
|
||||
import { test, expect, mock } from "bun:test";
|
||||
const random = mock(() => Math.random());
|
||||
|
||||
test("random", async () => {
|
||||
test("random", () => {
|
||||
const val = random();
|
||||
expect(val).toBeGreaterThan(0);
|
||||
expect(random).toHaveBeenCalled();
|
||||
@@ -151,7 +147,7 @@ Snapshots are supported by `bun test`.
|
||||
// example usage of toMatchSnapshot
|
||||
import { test, expect } from "bun:test";
|
||||
|
||||
test("snapshot", async () => {
|
||||
test("snapshot", () => {
|
||||
expect({ a: 1 }).toMatchSnapshot();
|
||||
});
|
||||
```
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
name: Convert a Uint8Array to a string
|
||||
name: Convert a DataView to a string
|
||||
---
|
||||
|
||||
If a [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView) contains ASCII-encoded text, you can convert it to a string using the [`TextDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder) class.
|
||||
|
||||
@@ -21,7 +21,8 @@ $ bun init
|
||||
Then install the Prisma CLI (`prisma`) and Prisma Client (`@prisma/client`) as dependencies.
|
||||
|
||||
```bash
|
||||
$ bun add prisma @prisma/client
|
||||
$ bun add -d prisma
|
||||
$ bun add @prisma/client
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
46
docs/guides/http/server.md
Normal file
46
docs/guides/http/server.md
Normal file
@@ -0,0 +1,46 @@
|
||||
---
|
||||
name: Common HTTP server usage
|
||||
---
|
||||
|
||||
This starts an HTTP server listening on port `3000`. It demonstates basic routing with a number of common responses and also handles POST data from standard forms or as JSON.
|
||||
|
||||
See [`Bun.serve`](/docs/api/http) for details.
|
||||
|
||||
```ts
|
||||
const server = Bun.serve({
|
||||
async fetch (req) {
|
||||
const path = new URL(req.url).pathname;
|
||||
|
||||
// respond with text/html
|
||||
if (path === "/") return new Response("Welcome to Bun!");
|
||||
|
||||
// redirect
|
||||
if (path === "/abc") return Response.redirect("/source", 301);
|
||||
|
||||
// send back a file (in this case, *this* file)
|
||||
if (path === "/source") return new Response(Bun.file(import.meta.file));
|
||||
|
||||
// respond with JSON
|
||||
if (path === "/api") return Response.json({ some: "buns", for: "you" });
|
||||
|
||||
// receive JSON data to a POST request
|
||||
if (req.method === "POST" && path === "/api/post") {
|
||||
const data = await req.json();
|
||||
console.log("Received JSON:", data);
|
||||
return Response.json({ success: true, data });
|
||||
}
|
||||
|
||||
// receive POST data from a form
|
||||
if (req.method === "POST" && path === "/form") {
|
||||
const data = await req.formData();
|
||||
console.log(data.get("someField"));
|
||||
return new Response("Success");
|
||||
}
|
||||
|
||||
// 404s
|
||||
return new Response("Page not found", { status: 404 });
|
||||
}
|
||||
})
|
||||
|
||||
console.log(`Listening on ${server.url}`);
|
||||
```
|
||||
@@ -19,4 +19,39 @@ $ bun run cli.tsx --flag1 --flag2 value
|
||||
|
||||
---
|
||||
|
||||
To parse `argv` into a more useful format, consider using [minimist](https://github.com/minimistjs/minimist) or [commander](https://github.com/tj/commander.js).
|
||||
To parse `argv` into a more useful format, `util.parseArgs` would be helpful.
|
||||
|
||||
Example:
|
||||
|
||||
```ts#cli.ts
|
||||
import { parseArgs } from "util";
|
||||
|
||||
const { values, positionals } = parseArgs({
|
||||
args: Bun.argv,
|
||||
options: {
|
||||
flag1: {
|
||||
type: 'boolean',
|
||||
},
|
||||
flag2: {
|
||||
type: 'string',
|
||||
},
|
||||
},
|
||||
strict: true,
|
||||
allowPositionals: true,
|
||||
});
|
||||
|
||||
console.log(values);
|
||||
console.log(positionals);
|
||||
```
|
||||
|
||||
then it outputs
|
||||
|
||||
```
|
||||
$ bun run cli.tsx --flag1 --flag2 value
|
||||
{
|
||||
flag1: true,
|
||||
flag2: "value",
|
||||
}
|
||||
[ "/path/to/bun", "/path/to/cli.ts" ]
|
||||
```
|
||||
|
||||
|
||||
@@ -15,13 +15,13 @@ Below is the full set of recommended `compilerOptions` for a Bun project. With t
|
||||
```jsonc
|
||||
{
|
||||
"compilerOptions": {
|
||||
// enable latest features
|
||||
// Enable latest features
|
||||
"lib": ["ESNext"],
|
||||
"target": "ESNext",
|
||||
"module": "ESNext",
|
||||
"moduleDetection": "force",
|
||||
"jsx": "react-jsx", // support JSX
|
||||
"allowJs": true, // allow importing `.js` from `.ts`
|
||||
"jsx": "react-jsx",
|
||||
"allowJs": true,
|
||||
|
||||
// Bundler mode
|
||||
"moduleResolution": "bundler",
|
||||
@@ -32,12 +32,11 @@ Below is the full set of recommended `compilerOptions` for a Bun project. With t
|
||||
// Best practices
|
||||
"strict": true,
|
||||
"skipLibCheck": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
|
||||
// Some stricter flags
|
||||
"useUnknownInCatchVariables": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noPropertyAccessFromIndexSignature": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ $ bun test --timeout 10000
|
||||
|
||||
Many other flags become irrelevant or obsolete when using `bun test`.
|
||||
|
||||
- `transform` — Buns supports TypeScript & JSX. Other file types can be configured with [Plugins](/docs/runtime/plugins).
|
||||
- `transform` — Bun supports TypeScript & JSX. Other file types can be configured with [Plugins](/docs/runtime/plugins).
|
||||
- `extensionsToTreatAsEsm`
|
||||
- `haste` — Bun uses it's own internal source maps
|
||||
- `watchman`, `watchPlugins`, `watchPathIgnorePatterns` — use `--watch` to run tests in watch mode
|
||||
|
||||
@@ -20,11 +20,11 @@ const server = Bun.serve<{ username: string }>({
|
||||
open(ws) {
|
||||
const msg = `${ws.data.username} has entered the chat`;
|
||||
ws.subscribe("the-group-chat");
|
||||
ws.publish("the-group-chat", msg);
|
||||
server.publish("the-group-chat", msg);
|
||||
},
|
||||
message(ws, message) {
|
||||
// the server re-broadcasts incoming messages to everyone
|
||||
ws.publish("the-group-chat", `${ws.data.username}: ${message}`);
|
||||
server.publish("the-group-chat", `${ws.data.username}: ${message}`);
|
||||
},
|
||||
close(ws) {
|
||||
const msg = `${ws.data.username} has left the chat`;
|
||||
|
||||
@@ -39,6 +39,10 @@ $ proto install bun
|
||||
|
||||
### Windows
|
||||
|
||||
{% callout %}
|
||||
Bun requires a minimum of Windows 10 version 1809
|
||||
{% /callout %}
|
||||
|
||||
Bun provides a _limited, experimental_ native build for Windows. It is recommended to use Bun within [Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/install) and follow the above instructions. To help catch bugs, the experimental build enables many debugging assertions, which will make the binary slower than what the stable version will be.
|
||||
|
||||
To install, paste this into a terminal:
|
||||
@@ -229,6 +233,10 @@ If you need to remove Bun from your system, use the following commands.
|
||||
$ rm -rf ~/.bun # for macOS, Linux, and WSL
|
||||
```
|
||||
|
||||
```bash#Windows
|
||||
$ Remove-Item ~\.bun -Recurse
|
||||
```
|
||||
|
||||
```bash#NPM
|
||||
$ npm uninstall -g bun
|
||||
```
|
||||
|
||||
12
docs/nav.ts
12
docs/nav.ts
@@ -116,6 +116,9 @@ export default {
|
||||
page("runtime/nodejs-apis", "Node.js compatibility", {
|
||||
description: `Bun aims for full Node.js compatibility. This page tracks the current compatibility status.`,
|
||||
}),
|
||||
page("bundler/executables", "Single-file executable", {
|
||||
description: "Compile a TypeScript or JavaScript file to a standalone executable",
|
||||
}),
|
||||
page("runtime/plugins", "Plugins", {
|
||||
description: `Implement custom loaders and module resolution logic with Bun's plugin system.`,
|
||||
}),
|
||||
@@ -204,9 +207,6 @@ export default {
|
||||
page("bundler/plugins", "Plugins", {
|
||||
description: `Implement custom loaders and module resolution logic with Bun's plugin system.`,
|
||||
}),
|
||||
page("bundler/executables", "Executables", {
|
||||
description: "Compile a TypeScript or JavaScript file to a standalone executable",
|
||||
}),
|
||||
page("bundler/macros", "Macros", {
|
||||
description: `Run JavaScript functions at bundle-time and inline the results into your bundle`,
|
||||
}),
|
||||
@@ -309,6 +309,9 @@ export default {
|
||||
page("api/globals", "Globals", {
|
||||
description: `Bun implements a range of Web APIs, Node.js APIs, and Bun-native APIs that are available in the global scope.`,
|
||||
}), // "`Bun.write`"),
|
||||
page("runtime/shell", "$ Shell", {
|
||||
description: `Bun's cross-platform shell-scripting API makes shell scripting with JavaScript fun`,
|
||||
}), // "`Bun.$`"),
|
||||
page("api/spawn", "Child processes", {
|
||||
description: `Spawn sync and async child processes with easily configurable input and output streams.`,
|
||||
}), // "`Bun.spawn`"),
|
||||
@@ -366,6 +369,9 @@ export default {
|
||||
page("project/contributing", "Contributing", {
|
||||
description: "Learn how to contribute to Bun and get your local development environment up and running.",
|
||||
}),
|
||||
page("project/building-windows", "Building Windows", {
|
||||
description: "Learn how to setup a development environment for contributing to the Windows build of Bun.",
|
||||
}),
|
||||
page("project/licensing", "License", {
|
||||
description: `Bun is a MIT-licensed project with a large number of statically-linked dependencies with various licenses.`,
|
||||
}),
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
The following document is not yet complete, please join the [#windows channel on our Discord](http://bun.sh/discord) for help.
|
||||
This document describes the build process for Windows. If you run into problems, please join the [#windows channel on our Discord](http://bun.sh/discord) for help.
|
||||
|
||||
It is strongly recommended to use [PowerShell 7 (`pwsh.exe`)](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4) instead of the default `powershell.exe`.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
<!--
|
||||
{% details summary="Extra notes for Bun Core Team Members" %}
|
||||
|
||||
Here are the extra steps I ran on my fresh windows machine (some of these are a little opiniated)
|
||||
|
||||
- Change user to a local account (set username to `window` and empty password)
|
||||
- (Empty password will disable the password and auto-login on boot)
|
||||
- Change user to a local account (set username to `window` and 'bun!')
|
||||
- Set Windows Terminal as default terminal
|
||||
- Install latest version of Powershell
|
||||
- Display scale to 100%
|
||||
@@ -30,17 +32,11 @@ Here are the extra steps I ran on my fresh windows machine (some of these are a
|
||||
|
||||
I recommend using VSCode through SSH instead of Tunnels or the Tailscale extension, it seems to be more reliable.
|
||||
|
||||
{% /details %}
|
||||
|
||||
Make sure to use powershell with the proper shell environment loaded. To do so, you can run:
|
||||
|
||||
```ps1
|
||||
.\scripts\env.ps1
|
||||
```
|
||||
{% /details %} -->
|
||||
|
||||
### Enable Scripts
|
||||
|
||||
By default, scripts are blocked.
|
||||
By default, running unverified scripts are blocked.
|
||||
|
||||
```ps1
|
||||
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
|
||||
@@ -48,8 +44,14 @@ Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
|
||||
|
||||
### System Dependencies
|
||||
|
||||
- Bun 1.1 or later. We use Bun to run it's own code generators.
|
||||
|
||||
```ps1
|
||||
irm bun.sh/install.ps1 | iex
|
||||
```
|
||||
|
||||
- [Visual Studio](https://visualstudio.microsoft.com) with the "Desktop Development with C++" workload.
|
||||
- Install Git and CMake from here, if not already installed.
|
||||
- Install Git and CMake from this installer, if not already installed.
|
||||
|
||||
After Visual Studio, you need the following:
|
||||
|
||||
@@ -59,25 +61,31 @@ After Visual Studio, you need the following:
|
||||
- NASM
|
||||
- Perl
|
||||
- Ruby
|
||||
- Node.js (until bun is stable enough on windows)
|
||||
- Node.js
|
||||
|
||||
[Scoop](https://scoop.sh) can be used to install these easily.
|
||||
{% callout %}
|
||||
The Zig compiler is automatically downloaded, installed, and updated by the building process.
|
||||
{% /callout %}
|
||||
|
||||
[Scoop](https://scoop.sh) can be used to install these remaining tools easily:
|
||||
|
||||
```ps1
|
||||
irm https://get.scoop.sh | iex
|
||||
|
||||
```bash
|
||||
scoop install nodejs-lts go rust nasm ruby perl
|
||||
scoop llvm@16.0.4 # scoop bug if you install llvm and the rest at the same time
|
||||
```
|
||||
|
||||
If you intend on building WebKit locally (optional), you should install some more packages:
|
||||
If you intend on building WebKit locally (optional), you should install these packages:
|
||||
|
||||
```bash
|
||||
```ps1
|
||||
scoop install make cygwin python
|
||||
```
|
||||
|
||||
From here on out, it is **expected you use a Developer PowerShell Terminal with `.\scripts\env.ps1 sourced**. This script is available in the Bun repository and can be loaded by executing it.
|
||||
From here on out, it is **expected you use a PowerShell Terminal with `.\scripts\env.ps1` sourced**. This script is available in the Bun repository and can be loaded by executing it:
|
||||
|
||||
```ps1
|
||||
$ .\scripts\env.ps1
|
||||
.\scripts\env.ps1
|
||||
```
|
||||
|
||||
To verify, you can check for an MSVC-only command line such as `mt.exe`
|
||||
@@ -86,55 +94,55 @@ To verify, you can check for an MSVC-only command line such as `mt.exe`
|
||||
Get-Command mt
|
||||
```
|
||||
|
||||
### Zig
|
||||
|
||||
Bun pins a version of Zig. As the compiler is still in development, breaking changes happen often that will break the build. It is recommended to use [Zigup](https://github.com/marler8997/zigup/releases) as it can quickly switch to any version by name, but you can also [manually download Zig](https://ziglang.org/download/).
|
||||
|
||||
```bash
|
||||
$ zigup 0.12.0-dev.1604+caae40c21
|
||||
```
|
||||
|
||||
{% callout %}
|
||||
We last updated Zig on **October 26th, 2023**
|
||||
It is not recommended to install `ninja` / `cmake` into your global path, because you may run into a situation where you try to build bun without .\scripts\env.ps1 sourced.
|
||||
{% /callout %}
|
||||
|
||||
### Codegen
|
||||
|
||||
On Unix platforms, we depend on an existing build of Bun to generate code for itself. Since the Windows build is not stable enough for this to run the code generators, you currently need to use another computer or WSL to generate this:
|
||||
|
||||
```bash
|
||||
$ wsl --install # run twice if it doesnt install
|
||||
# in the linux environment
|
||||
$ sudo apt install unzip
|
||||
$ curl -fsSL https://bun.sh/install | bash
|
||||
```
|
||||
|
||||
Whenever codegen-related things are updated, please re-run
|
||||
|
||||
```ps1
|
||||
$ .\scripts\codegen.ps1
|
||||
```
|
||||
|
||||
## Building
|
||||
|
||||
```ps1
|
||||
npm install
|
||||
bun install
|
||||
|
||||
.\scripts\env.ps1
|
||||
.\scripts\update-submodules.ps1
|
||||
.\scripts\all-dependencies.ps1
|
||||
.\scripts\codegen.ps1
|
||||
.\scripts\update-submodules.ps1 # this syncs git submodule state
|
||||
.\scripts\all-dependencies.ps1 # this builds all dependencies
|
||||
.\scripts\make-old-js.ps1 # runs some old code generators
|
||||
|
||||
cd build # this was created by the codegen.ps1 script in the prerequisites
|
||||
# Configure build environment
|
||||
cmake -Bbuild -GNinja -DCMAKE_BUILD_TYPE=Debug
|
||||
|
||||
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Debug
|
||||
ninja
|
||||
# Build bun
|
||||
ninja -Cbuild
|
||||
```
|
||||
|
||||
If this was successful, you should have a `bun-debug.exe` in the `build` folder.
|
||||
|
||||
```ps1
|
||||
.\bun-debug.exe --version
|
||||
.\build\bun-debug.exe --revision
|
||||
```
|
||||
|
||||
You should add this to `$Env:PATH`. The simplest way to do so is to open the start menu, type "Path", and then navigate the environment variables menu to add `C:\.....\bun\build` to the user environment variable `PATH`. You should then restart your editor (if it does not update still, log out and log back in).
|
||||
|
||||
## Extra paths
|
||||
|
||||
- WebKit is extracted to `build/bun-webkit`
|
||||
- Zig is extracted to `.cache/zig/zig.exe`
|
||||
|
||||
## Tests
|
||||
|
||||
You can run the test suite either using `bun test`, or by using the wrapper script `packages\bun-internal-test`. The internal test package is a wrapper cli to run every test file in a separate instance of bun.exe, to prevent a crash in the test runner from stopping the entire suite.
|
||||
|
||||
```ps1
|
||||
# Setup
|
||||
bun i --cwd packages\bun-internal-test
|
||||
|
||||
# Run the entire test suite with reporter
|
||||
# the package.json script "test" uses "build/bun-debug.exe" by default
|
||||
bun run test
|
||||
|
||||
# Run an individual test file:
|
||||
bun-debug test node\fs
|
||||
bun-debug test "C:\bun\test\js\bun\resolve\import-meta.test.js"
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
@@ -105,6 +105,8 @@ $ export PATH="$PATH:/usr/lib/llvm16/bin"
|
||||
|
||||
{% /codetabs %}
|
||||
|
||||
> ⚠️ Ubuntu distributions may require installation of the C++ standard library independently. See the [troubleshooting section](#span-file-not-found-on-ubuntu) for more information.
|
||||
|
||||
## Building Bun
|
||||
|
||||
After cloning the repository, run the following command to run the first build. This may take a while as it will clone submodules and build dependencies.
|
||||
@@ -252,6 +254,16 @@ fatal error: 'span' file not found
|
||||
^~~~~~
|
||||
```
|
||||
|
||||
The issue may manifest when initially running `bun setup` as Clang being unable to compile a simple program:
|
||||
|
||||
```
|
||||
The C++ compiler
|
||||
|
||||
"/usr/bin/clang++-16"
|
||||
|
||||
is not able to compile a simple test program.
|
||||
```
|
||||
|
||||
To fix the error, we need to update the GCC version to 11. To do this, we'll need to check if the latest version is available in the distribution's official repositories or use a third-party repository that provides GCC 11 packages. Here are general steps:
|
||||
|
||||
```bash
|
||||
|
||||
@@ -45,18 +45,25 @@ console.log(`Listening on http://localhost:${server.port} ...`);
|
||||
{% details summary="Seeing TypeScript errors on `Bun`?" %}
|
||||
If you used `bun init`, Bun will have automatically installed Bun's TypeScript declarations and configured your `tsconfig.json`. If you're trying out Bun in an existing project, you may see a type error on the `Bun` global.
|
||||
|
||||
To fix this, first install `bun-types` as a dev dependency.
|
||||
To fix this, first install `@types/bun` as a dev dependency.
|
||||
|
||||
```sh
|
||||
$ bun add -d bun-types
|
||||
$ bun add -d @types/bun
|
||||
```
|
||||
|
||||
Then add the following line to your `compilerOptions` in `tsconfig.json`.
|
||||
Then add the following to your `compilerOptions` in `tsconfig.json`:
|
||||
|
||||
```json-diff#tsconfig.json
|
||||
```json#tsconfig.json
|
||||
{
|
||||
"compilerOptions": {
|
||||
+ "types": ["bun-types"]
|
||||
"lib": ["ESNext"],
|
||||
"target": "ESNext",
|
||||
"module": "ESNext",
|
||||
"moduleDetection": "force",
|
||||
"moduleResolution": "bundler",
|
||||
"allowImportingTsExtensions": true,
|
||||
"verbatimModuleSyntax": true,
|
||||
"noEmit": true,
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -85,7 +92,7 @@ Bun can also execute `"scripts"` from your `package.json`. Add the following scr
|
||||
+ "start": "bun run index.ts"
|
||||
+ },
|
||||
"devDependencies": {
|
||||
"bun-types": "^0.7.0"
|
||||
"@types/bun": "^1.0.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -117,12 +124,12 @@ Update `index.ts` to use `figlet` in the `fetch` handler.
|
||||
+ import figlet from "figlet";
|
||||
|
||||
const server = Bun.serve({
|
||||
fetch() {
|
||||
port: 3000,
|
||||
fetch(req) {
|
||||
+ const body = figlet.textSync("Bun!");
|
||||
+ return new Response(body);
|
||||
- return new Response("Bun!");
|
||||
},
|
||||
port: 3000,
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
@@ -298,7 +298,7 @@ Valid values are:
|
||||
---
|
||||
|
||||
- `"fallback"`
|
||||
- Check local `node_modules` first, the auto-install any packages that aren't found. You can enable this from the CLI with `bun -i`.
|
||||
- Check local `node_modules` first, then auto-install any packages that aren't found. You can enable this from the CLI with `bun -i`.
|
||||
|
||||
{% /table %}
|
||||
|
||||
|
||||
@@ -80,6 +80,17 @@ $ bun run ./my-wasm-app.whatever
|
||||
**Note** — WASI support is based on [wasi-js](https://github.com/sagemathinc/cowasm/tree/main/core/wasi-js). Currently, it only supports WASI binaries that use the `wasi_snapshot_preview1` or `wasi_unstable` APIs. Bun's implementation is not fully optimized for performance; this will become more of a priority as WASM grows in popularity.
|
||||
{% /callout %}
|
||||
|
||||
## SQLite
|
||||
|
||||
You can import sqlite databases directly into your code. Bun will automatically load the database and return a `Database` object.
|
||||
|
||||
```ts
|
||||
import db from "./my.db" with {type: "sqlite"};
|
||||
console.log(db.query("select * from users LIMIT 1").get());
|
||||
```
|
||||
|
||||
This uses [`bun:sqlite`](/docs/api/sqlite).
|
||||
|
||||
## Custom loaders
|
||||
|
||||
Support for additional file types can be implemented with plugins. Refer to [Runtime > Plugins](/docs/bundler/plugins) for full documentation.
|
||||
|
||||
@@ -52,11 +52,11 @@ Some methods are not optimized yet.
|
||||
|
||||
### [`node:events`](https://nodejs.org/api/events.html)
|
||||
|
||||
🟡 Missing `on` `addAbortListener` `getMaxListeners`
|
||||
🟡 Missing `addAbortListener` `events.getMaxListeners`
|
||||
|
||||
### [`node:fs`](https://nodejs.org/api/fs.html)
|
||||
|
||||
🟡 Missing `Dir` `fdatasync` `fdatasyncSync` `openAsBlob` `opendir` `opendirSync` `statfs` `statfsSync`. `fs.promises.open` incorrectly returns a file descriptor instead of a `FileHandle`.
|
||||
🟡 Missing `Dir` `openAsBlob` `opendir` `opendirSync` `statfs` `statfsSync`
|
||||
|
||||
### [`node:http`](https://nodejs.org/api/http.html)
|
||||
|
||||
@@ -76,11 +76,11 @@ Some methods are not optimized yet.
|
||||
|
||||
### [`node:module`](https://nodejs.org/api/module.html)
|
||||
|
||||
🟢 Missing `runMain` `syncBuiltinESMExports`, `Module#load()`. Attempts to override or patch the module cache will fail.
|
||||
🟡 Missing `runMain` `syncBuiltinESMExports`, `Module#load()`. Attempts to override or patch the module cache will fail.
|
||||
|
||||
### [`node:net`](https://nodejs.org/api/net.html)
|
||||
|
||||
🟡 Missing `BlockList` `SocketAddress` `Stream` `getDefaultAutoSelectFamily` `getDefaultAutoSelectFamilyAttemptTimeout` `setDefaultAutoSelectFamily` `setDefaultAutoSelectFamilyAttemptTimeout` `Server#ref()` `Server#unref()` `Socket#ref()` `Socket#unref()`.
|
||||
🟡 Missing `BlockList` `SocketAddress` `Stream` `getDefaultAutoSelectFamily` `getDefaultAutoSelectFamilyAttemptTimeout` `setDefaultAutoSelectFamily` `setDefaultAutoSelectFamilyAttemptTimeout`
|
||||
|
||||
### [`node:os`](https://nodejs.org/api/os.html)
|
||||
|
||||
@@ -92,7 +92,7 @@ Some methods are not optimized yet.
|
||||
|
||||
### [`node:perf_hooks`](https://nodejs.org/api/perf_hooks.html)
|
||||
|
||||
🟡 Only `perf_hooks.performance.now()` and `perf_hooks.performance.timeOrigin` are implemented. Missing `Performance` `PerformanceMark` `PerformanceMeasure` `PerformanceObserverEntryList` `PerformanceResourceTiming` `createHistogram` `monitorEventLoopDelay`. It's recommended to use `performance` global instead of `perf_hooks.performance`.
|
||||
🟡 Missing `createHistogram` `monitorEventLoopDelay`. It's recommended to use `performance` global instead of `perf_hooks.performance`.
|
||||
|
||||
### [`node:process`](https://nodejs.org/api/process.html)
|
||||
|
||||
@@ -116,7 +116,7 @@ Some methods are not optimized yet.
|
||||
|
||||
### [`node:stream`](https://nodejs.org/api/stream.html)
|
||||
|
||||
🟡 Missing `getDefaultHighWaterMark` `setDefaultHighWaterMark`
|
||||
🟡 Missing `getDefaultHighWaterMark` `setDefaultHighWaterMark` `toWeb`
|
||||
|
||||
### [`node:string_decoder`](https://nodejs.org/api/string_decoder.html)
|
||||
|
||||
@@ -168,7 +168,7 @@ Some methods are not optimized yet.
|
||||
|
||||
### [`node:worker_threads`](https://nodejs.org/api/worker_threads.html)
|
||||
|
||||
🟡 `Worker` doesn't support the following options: `eval` `argv` `execArgv` `stdin` `stdout` `stderr` `trackedUnmanagedFds` `resourceLimits`. Missing `markAsUntransferable` `moveMessagePortToContext` `getHeapSnapshot`.
|
||||
🟡 `Worker` doesn't support the following options: `eval` `stdin` `stdout` `stderr` `trackedUnmanagedFds` `resourceLimits`. Missing `markAsUntransferable` `moveMessagePortToContext` `getHeapSnapshot`.
|
||||
|
||||
### [`node:zlib`](https://nodejs.org/api/zlib.html)
|
||||
|
||||
@@ -312,23 +312,23 @@ The table below lists all globals implemented by Node.js and Bun's current compa
|
||||
|
||||
### [`PerformanceEntry`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry)
|
||||
|
||||
🔴 Not implemented.
|
||||
🟢 Fully implemented.
|
||||
|
||||
### [`PerformanceMark`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceMark)
|
||||
|
||||
🔴 Not implemented.
|
||||
🟢 Fully implemented.
|
||||
|
||||
### [`PerformanceMeasure`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceMeasure)
|
||||
|
||||
🔴 Not implemented.
|
||||
🟢 Fully implemented.
|
||||
|
||||
### [`PerformanceObserver`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver)
|
||||
|
||||
🔴 Not implemented.
|
||||
🟢 Fully implemented.
|
||||
|
||||
### [`PerformanceObserverEntryList`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserverEntryList)
|
||||
|
||||
🔴 Not implemented.
|
||||
🟢 Fully implemented.
|
||||
|
||||
### [`PerformanceResourceTiming`](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming)
|
||||
|
||||
@@ -340,7 +340,7 @@ The table below lists all globals implemented by Node.js and Bun's current compa
|
||||
|
||||
### [`process`](https://nodejs.org/api/process.html)
|
||||
|
||||
🟡 Missing `domain` `hasUncaughtExceptionCaptureCallback` `initgroups` `report` `resourceUsage` `setUncaughtExceptionCaptureCallback` `setegid` `seteuid` `setgid` `setgroups` `setuid` `allowedNodeEnvironmentFlags` `getActiveResourcesInfo` `setActiveResourcesInfo` `moduleLoadList` `setSourceMapsEnabled` `channel`. `process.binding` is partially implemented.
|
||||
🟡 Missing `domain` `hasUncaughtExceptionCaptureCallback` `initgroups` `resourceUsage` `setUncaughtExceptionCaptureCallback` `setegid` `seteuid` `setgid` `setgroups` `setuid` `allowedNodeEnvironmentFlags` `getActiveResourcesInfo` `setActiveResourcesInfo` `moduleLoadList` `setSourceMapsEnabled` `channel`. `process.binding` is partially implemented.
|
||||
|
||||
### [`queueMicrotask()`](https://developer.mozilla.org/en-US/docs/Web/API/queueMicrotask)
|
||||
|
||||
@@ -356,11 +356,11 @@ The table below lists all globals implemented by Node.js and Bun's current compa
|
||||
|
||||
### [`ReadableStreamBYOBReader`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader)
|
||||
|
||||
🔴 Not implemented.
|
||||
🟢 Fully implemented.
|
||||
|
||||
### [`ReadableStreamBYOBRequest`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBRequest)
|
||||
|
||||
🔴 Not implemented.
|
||||
🟢 Fully implemented.
|
||||
|
||||
### [`ReadableStreamDefaultController`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultController)
|
||||
|
||||
|
||||
@@ -67,13 +67,12 @@ plugin({
|
||||
name: "YAML",
|
||||
async setup(build) {
|
||||
const { load } = await import("js-yaml");
|
||||
const { readFileSync } = await import("fs");
|
||||
|
||||
// when a .yaml file is imported...
|
||||
build.onLoad({ filter: /\.(yaml|yml)$/ }, (args) => {
|
||||
build.onLoad({ filter: /\.(yaml|yml)$/ }, async (args) => {
|
||||
|
||||
// read and parse the file
|
||||
const text = readFileSync(args.path, "utf8");
|
||||
const text = await Bun.file(args.path).text();
|
||||
const exports = load(text) as Record<string, any>;
|
||||
|
||||
// and returns it as a module
|
||||
@@ -184,13 +183,12 @@ plugin({
|
||||
name: "svelte loader",
|
||||
async setup(build) {
|
||||
const { compile } = await import("svelte/compiler");
|
||||
const { readFileSync } = await import("fs");
|
||||
|
||||
// when a .svelte file is imported...
|
||||
build.onLoad({ filter: /\.svelte$/ }, ({ path }) => {
|
||||
build.onLoad({ filter: /\.svelte$/ }, async ({ path }) => {
|
||||
|
||||
// read and compile it with the Svelte compiler
|
||||
const file = readFileSync(path, "utf8");
|
||||
const file = await Bun.file(path).text();
|
||||
const contents = compile(file, {
|
||||
filename: path,
|
||||
generate: "ssr",
|
||||
@@ -216,7 +214,7 @@ With this plugin, Svelte components can now be directly imported and consumed.
|
||||
import "./sveltePlugin.ts";
|
||||
import MySvelteComponent from "./component.svelte";
|
||||
|
||||
console.log(mySvelteComponent.render());
|
||||
console.log(MySvelteComponent.render());
|
||||
```
|
||||
|
||||
## Virtual Modules
|
||||
@@ -239,7 +237,7 @@ plugin({
|
||||
|
||||
setup(build) {
|
||||
build.module(
|
||||
// The specifier, which can be any string
|
||||
// The specifier, which can be any string - except a built-in, such as "buffer"
|
||||
"my-transpiled-virtual-module",
|
||||
// The callback to run when the module is imported or required for the first time
|
||||
() => {
|
||||
|
||||
370
docs/runtime/shell.md
Normal file
370
docs/runtime/shell.md
Normal file
@@ -0,0 +1,370 @@
|
||||
Bun Shell makes shell scripting with JavaScript & TypeScript fun. It's a cross-platform bash-like shell with seamless JavaScript interop.
|
||||
|
||||
{% callout type="note" %}
|
||||
**Alpha-quality software**: Bun Shell is an unstable API still under development. If you have feature requests or run into bugs, please open an issue. There may be breaking changes in the future.
|
||||
{% /callout %}
|
||||
|
||||
Quickstart:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
const response = await fetch("https://example.com");
|
||||
|
||||
// Use Response as stdin.
|
||||
await $`echo < ${response} > wc -c`; // 120
|
||||
```
|
||||
|
||||
## Features:
|
||||
|
||||
- **Cross-platform**: works on Windows, Linux & macOS. Instead of `rimraf` or `cross-env`', you can use Bun Shell without installing extra dependencies. Common shell commands like `ls`, `cd`, `rm` are implemented natively.
|
||||
- **Familiar**: Bun Shell is a bash-like shell, supporting redirection, pipes, environment variables and more.
|
||||
- **Globs**: Glob patterns are supported natively, including `**`, `*`, `{expansion}`, and more.
|
||||
- **Template literals**: Template literals are used to execute shell commands. This allows for easy interpolation of variables and expressions.
|
||||
- **Safety**: Bun Shell escapes all strings by default, preventing shell injection attacks.
|
||||
- **JavaScript interop**: Use `Response`, `ArrayBuffer`, `Blob`, `Bun.file(path)` and other JavaScript objects as stdin, stdout, and stderr.
|
||||
|
||||
## Getting started
|
||||
|
||||
The simplest shell command is `echo`. To run it, use the `$` template literal tag:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
await $`echo "Hello World!"`; // Hello World!
|
||||
```
|
||||
|
||||
By default, shell commands print to stdout. To quiet the output, call `.quiet()`:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
await $`echo "Hello World!"`.quiet(); // No output
|
||||
```
|
||||
|
||||
What if you want to access the output of the command as text? Use `.text()`:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
// .text() automatically calls .quiet() for you
|
||||
const welcome = await $`echo "Hello World!"`.text();
|
||||
|
||||
console.log(welcome); // Hello World!\n
|
||||
```
|
||||
|
||||
To get stdout, stderr, and the exit code, use await or `.run`:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
const { stdout, stderr, exitCode } = await $`echo "Hello World!"`.quiet();
|
||||
|
||||
console.log(stdout); // Buffer(6) [ 72, 101, 108, 108, 111, 32 ]
|
||||
console.log(stderr); // Buffer(0) []
|
||||
console.log(exitCode); // 0
|
||||
```
|
||||
|
||||
## Redirection
|
||||
|
||||
Bun Shell supports redirection with `<`, `>`, and `|` operators.
|
||||
|
||||
### To JavaScript objects (`>`)
|
||||
|
||||
To redirect stdout to a JavaScript object, use the `>` operator:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
const buffer = Buffer.alloc(100);
|
||||
const result = await $`echo "Hello World!" > ${buffer}`;
|
||||
|
||||
console.log(result.exitCode); // 0
|
||||
console.log(buffer.toString()); // Hello World!\n
|
||||
```
|
||||
|
||||
The following JavaScript objects are supported for redirection to:
|
||||
|
||||
- `Buffer`, `Uint8Array`, `Uint16Array`, `Uint32Array`, `Int8Array`, `Int16Array`, `Int32Array`, `Float32Array`, `Float64Array`, `ArrayBuffer`, `SharedArrayBuffer` (writes to the underlying buffer)
|
||||
- `Bun.file(path)`, `Bun.file(fd)` (writes to the file)
|
||||
|
||||
### From JavaScript objects (`<`)
|
||||
|
||||
To redirect the output from JavaScript objects to stdin, use the `<` operator:
|
||||
|
||||
```js
|
||||
import { $, file } from "bun";
|
||||
|
||||
const response = new Response("hello i am a response body");
|
||||
|
||||
const result = await $`cat < ${response}`.text();
|
||||
|
||||
console.log(result); // hello i am a response body
|
||||
```
|
||||
|
||||
The following JavaScript objects are supported for redirection from:
|
||||
|
||||
- `Buffer`, `Uint8Array`, `Uint16Array`, `Uint32Array`, `Int8Array`, `Int16Array`, `Int32Array`, `Float32Array`, `Float64Array`, `ArrayBuffer`, `SharedArrayBuffer` (reads from the underlying buffer)
|
||||
- `Bun.file(path)`, `Bun.file(fd)` (reads from the file)
|
||||
- `Response` (reads from the body)
|
||||
|
||||
### Piping (`|`)
|
||||
|
||||
Like in bash, you can pipe the output of one command to another:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
const result = await $`echo "Hello World!" | wc -w`.text();
|
||||
|
||||
console.log(result); // 2\n
|
||||
```
|
||||
|
||||
You can also pipe with JavaScript objects:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
const response = new Response("hello i am a response body");
|
||||
|
||||
const result = await $`cat < ${response} | wc -w`.text();
|
||||
|
||||
console.log(result); // 6\n
|
||||
```
|
||||
|
||||
## Environment variables
|
||||
|
||||
Environment variables can be set like in bash:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
await $`FOO=foo bun -e 'console.log(process.env.FOO)'`; // foo\n
|
||||
```
|
||||
|
||||
You can use string interpolation to set environment variables:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
const foo = "bar123";
|
||||
|
||||
await $`FOO=${foo + "456"} bun -e 'console.log(process.env.FOO)'`; // bar123456\n
|
||||
```
|
||||
|
||||
Input is escaped by default, preventing shell injection attacks:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
const foo = "bar123; rm -rf /tmp";
|
||||
|
||||
await $`FOO=${foo} bun -e 'console.log(process.env.FOO)'`; // bar123; rm -rf /tmp\n
|
||||
```
|
||||
|
||||
### Changing the environment variables
|
||||
|
||||
By default, `process.env` is used as the environment variables for all commands.
|
||||
|
||||
You can change the environment variables for a single command by calling `.env()`:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
await $`echo $FOO`.env({ ...process.env, FOO: "bar" }); // bar
|
||||
```
|
||||
|
||||
You can change the default environment variables for all commands by calling `$.env`:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
$.env({ FOO: "bar" });
|
||||
|
||||
// the globally-set $FOO
|
||||
await $`echo $FOO`; // bar
|
||||
|
||||
// the locally-set $FOO
|
||||
await $`echo $FOO`.env({ FOO: "baz" }); // baz
|
||||
```
|
||||
|
||||
You can reset the environment variables to the default by calling `$.env()` with no arguments:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
$.env({ FOO: "bar" });
|
||||
|
||||
// the globally-set $FOO
|
||||
await $`echo $FOO`; // bar
|
||||
|
||||
// the locally-set $FOO
|
||||
await $`echo $FOO`.env(undefined); // ""
|
||||
```
|
||||
|
||||
### Changing the working directory
|
||||
|
||||
You can change the working directory of a command by passing a string to `.cwd()`:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
await $`pwd`.cwd("/tmp"); // /tmp
|
||||
```
|
||||
|
||||
You can change the default working directory for all commands by calling `$.cwd`:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
$.cwd("/tmp");
|
||||
|
||||
// the globally-set working directory
|
||||
await $`pwd`; // /tmp
|
||||
|
||||
// the locally-set working directory
|
||||
await $`pwd`.cwd("/"); // /
|
||||
```
|
||||
|
||||
## Reading output
|
||||
|
||||
To read the output of a command as a string, use `.text()`:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
const result = await $`echo "Hello World!"`.text();
|
||||
|
||||
console.log(result); // Hello World!\n
|
||||
```
|
||||
|
||||
### Reading output as JSON
|
||||
|
||||
To read the output of a command as JSON, use `.json()`:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
const result = await $`echo '{"foo": "bar"}'`.json();
|
||||
|
||||
console.log(result); // { foo: "bar" }
|
||||
```
|
||||
|
||||
### Reading output line-by-line
|
||||
|
||||
To read the output of a command line-by-line, use `.lines()`:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
for await (let line of $`echo "Hello World!"`.lines()) {
|
||||
console.log(line); // Hello World!
|
||||
}
|
||||
```
|
||||
|
||||
You can also use `.lines()` on a completed command:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
const search = "bun";
|
||||
|
||||
for await (let line of $`cat list.txt | grep ${search}`.lines()) {
|
||||
console.log(line);
|
||||
}
|
||||
```
|
||||
|
||||
### Reading output as a Blob
|
||||
|
||||
To read the output of a command as a Blob, use `.blob()`:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
const result = await $`echo "Hello World!"`.blob();
|
||||
|
||||
console.log(result); // Blob(13) { size: 13, type: "text/plain" }
|
||||
```
|
||||
|
||||
## Builtin Commands
|
||||
|
||||
For cross-platform compatibility, Bun Shell implements a set of builtin commands, in addition to reading commands from the PATH environment variable.
|
||||
|
||||
- `cd`: change the working directory
|
||||
- `ls`: list files in a directory
|
||||
- `rm`: remove files and directories
|
||||
- `echo`: print text
|
||||
- `pwd`: print the working directory
|
||||
- `bun`: run bun in bun
|
||||
|
||||
**Partially** implemented:
|
||||
|
||||
- `mv`: move files and directories (missing cross-device support)
|
||||
|
||||
**Not** implemented yet, but planned:
|
||||
|
||||
- `mkdir`: create directories
|
||||
- `cp`: copy files and directories
|
||||
- `cat`: concatenate files
|
||||
|
||||
## Utilities
|
||||
|
||||
Bun Shell also implements a set of utilities for working with shells.
|
||||
|
||||
### `$.braces` (brace expansion)
|
||||
|
||||
This function implements simple [brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) for shell commands:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
await $.braces(`echo {1,2,3}`);
|
||||
// => ["echo 1", "echo 2", "echo 3"]
|
||||
```
|
||||
|
||||
### `$.escape` (escape strings)
|
||||
|
||||
Exposes Bun Shell's escaping logic as a function:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
console.log($.escape('$(foo) `bar` "baz"'))
|
||||
// => \$(foo) \`bar\` \"baz\"
|
||||
```
|
||||
|
||||
If you do not want your string to be escaped, wrap it in a `{ raw: 'str' }` object:
|
||||
|
||||
```js
|
||||
import { $ } from "bun";
|
||||
|
||||
await $`echo ${{ raw: '$(foo) `bar` "baz"' }}`
|
||||
// => bun: command not found: foo
|
||||
// => bun: command not found: bar
|
||||
// => baz
|
||||
```
|
||||
|
||||
## .bun.sh file loader
|
||||
|
||||
For simple shell scripts, instead of `sh`, you can use Bun Shell to run shell scripts.
|
||||
|
||||
To do that, run any file with bun that ends with `.bun.sh`:
|
||||
|
||||
```sh
|
||||
$ echo "echo Hello World!" > script.bun.sh
|
||||
$ bun ./script.bun.sh
|
||||
> Hello World!
|
||||
```
|
||||
|
||||
On Windows, Bun Shell is used automatically to run `.sh` files when using Bun:
|
||||
|
||||
```sh
|
||||
$ echo "echo Hello World!" > script.sh
|
||||
# On windows, .bun.sh is not needed, just .sh
|
||||
$ bun ./script.sh
|
||||
> Hello World!
|
||||
```
|
||||
|
||||
## Credits
|
||||
|
||||
Large parts of this API were inspired by [zx](https://github.com/google/zx), [dax](https://github.com/dsherret/dax), and [bnx](https://github.com/wobsoriano/bnx). Thank you to the authors of those projects.
|
||||
@@ -52,7 +52,7 @@ It is possible to specify a coverage threshold in `bunfig.toml`. If your test su
|
||||
coverageThreshold = 0.9
|
||||
|
||||
# to set different thresholds for lines and functions
|
||||
coverageThreshold = { line = 0.9, function = 0.9 }
|
||||
coverageThreshold = { lines = 0.9, functions = 0.9 }
|
||||
```
|
||||
|
||||
### Sourcemaps
|
||||
|
||||
@@ -60,7 +60,7 @@ test("unlike in jest", () => {
|
||||
To reset the system time, pass no arguments to `setSystemTime`:
|
||||
|
||||
```ts
|
||||
import { setSystemTime, beforeAll } from "bun:test";
|
||||
import { setSystemTime, expect, test } from "bun:test";
|
||||
|
||||
test("it was 2020, for a moment.", () => {
|
||||
// Set it to something!
|
||||
|
||||
@@ -109,7 +109,7 @@ $ bun test --todo
|
||||
|
||||
## `test.only`
|
||||
|
||||
To run a particular test or suite of tests use `test.only()` or `describe.only()`. Once declared, running `bun test --only` will only execute tests/suites that have been marked with `.only()`.
|
||||
To run a particular test or suite of tests use `test.only()` or `describe.only()`. Once declared, running `bun test --only` will only execute tests/suites that have been marked with `.only()`. Running `bun test` without the `--only` option with `test.only()` declared will result in all tests in the given suite being executed _up to_ the test with `.only()`. `describe.only()` functions the same in both execution scenarios.
|
||||
|
||||
```ts
|
||||
import { test, describe } from "bun:test";
|
||||
@@ -135,6 +135,12 @@ The following command will only execute tests #2 and #3.
|
||||
$ bun test --only
|
||||
```
|
||||
|
||||
The following command will only execute tests #1, #2 and #3.
|
||||
|
||||
```sh
|
||||
$ bun test
|
||||
```
|
||||
|
||||
## `test.if`
|
||||
|
||||
To run a test conditionally, use `test.if()`. The test will run if the condition is truthy. This is particularly useful for tests that should only run on specific architectures or operating systems.
|
||||
@@ -301,7 +307,7 @@ Bun implements the following matchers. Full Jest compatibility is on the roadmap
|
||||
|
||||
---
|
||||
|
||||
- ❌
|
||||
- ✅
|
||||
- [`.extend`](https://jestjs.io/docs/expect#expectextendmatchers)
|
||||
|
||||
---
|
||||
|
||||
@@ -16,9 +16,9 @@ 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`.
|
||||
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 8192`.
|
||||
|
||||
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.
|
||||
That advice unfortunately **lowers** the hard limit to `8192`. 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:
|
||||
|
||||
|
||||
@@ -17,13 +17,13 @@ Bun supports things like top-level await, JSX, and extensioned `.ts` imports, wh
|
||||
```jsonc
|
||||
{
|
||||
"compilerOptions": {
|
||||
// enable latest features
|
||||
// Enable latest features
|
||||
"lib": ["ESNext"],
|
||||
"target": "ESNext",
|
||||
"module": "ESNext",
|
||||
"moduleDetection": "force",
|
||||
"jsx": "react-jsx", // support JSX
|
||||
"allowJs": true, // allow importing `.js` from `.ts`
|
||||
"jsx": "react-jsx",
|
||||
"allowJs": true,
|
||||
|
||||
// Bundler mode
|
||||
"moduleResolution": "bundler",
|
||||
@@ -34,18 +34,17 @@ Bun supports things like top-level await, JSX, and extensioned `.ts` imports, wh
|
||||
// Best practices
|
||||
"strict": true,
|
||||
"skipLibCheck": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
|
||||
// Some stricter flags
|
||||
"useUnknownInCatchVariables": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noPropertyAccessFromIndexSignature": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
If you run `bun init` in a new directory, this `tsconfig.json` will be generated for you.
|
||||
If you run `bun init` in a new directory, this `tsconfig.json` will be generated for you. (The stricter flags are disabled by default.)
|
||||
|
||||
```sh
|
||||
$ bun init
|
||||
|
||||
192
misctools/ntquery.cpp
Normal file
192
misctools/ntquery.cpp
Normal file
@@ -0,0 +1,192 @@
|
||||
|
||||
#include <ntstatus.h>
|
||||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
#include <winternl.h>
|
||||
|
||||
typedef struct _FILE_DIRECTORY_INFORMATION {
|
||||
ULONG NextEntryOffset;
|
||||
ULONG FileIndex;
|
||||
LARGE_INTEGER CreationTime;
|
||||
LARGE_INTEGER LastAccessTime;
|
||||
LARGE_INTEGER LastWriteTime;
|
||||
LARGE_INTEGER ChangeTime;
|
||||
LARGE_INTEGER EndOfFile;
|
||||
LARGE_INTEGER AllocationSize;
|
||||
ULONG FileAttributes;
|
||||
ULONG FileNameLength;
|
||||
WCHAR FileName[1];
|
||||
} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
|
||||
|
||||
typedef struct _FILE_BOTH_DIR_INFORMATION {
|
||||
ULONG NextEntryOffset;
|
||||
ULONG FileIndex;
|
||||
LARGE_INTEGER CreationTime;
|
||||
LARGE_INTEGER LastAccessTime;
|
||||
LARGE_INTEGER LastWriteTime;
|
||||
LARGE_INTEGER ChangeTime;
|
||||
LARGE_INTEGER EndOfFile;
|
||||
LARGE_INTEGER AllocationSize;
|
||||
ULONG FileAttributes;
|
||||
ULONG FileNameLength;
|
||||
ULONG EaSize;
|
||||
CHAR ShortNameLength;
|
||||
WCHAR ShortName[12];
|
||||
WCHAR FileName[1];
|
||||
} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
|
||||
|
||||
int main_using_file_directory_information(int argc, char *argv[]) {
|
||||
if (argc != 2) {
|
||||
printf("Usage: ntquery <filename>\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto *NtQueryDirectoryFile = (NTSTATUS(WINAPI *)(
|
||||
HANDLE, HANDLE, PVOID, PVOID, PVOID, PVOID, DWORD, FILE_INFORMATION_CLASS,
|
||||
BOOLEAN, PVOID, BOOLEAN))GetProcAddress(GetModuleHandle("ntdll.dll"),
|
||||
"NtQueryDirectoryFile");
|
||||
|
||||
if (NtQueryDirectoryFile == NULL) {
|
||||
printf("Error getting NtQueryDirectoryFile\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// open the current working directory using NT API
|
||||
HANDLE hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
||||
|
||||
// use NtQueryDirectoryFile
|
||||
char buffer[64096];
|
||||
|
||||
IO_STATUS_BLOCK ioStatusBlock;
|
||||
NTSTATUS status = NtQueryDirectoryFile(
|
||||
hFile, NULL, NULL, NULL, &ioStatusBlock, buffer, sizeof(buffer),
|
||||
FileDirectoryInformation, FALSE, NULL, FALSE);
|
||||
if (status != STATUS_SUCCESS) {
|
||||
printf("Error querying directory\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
PFILE_DIRECTORY_INFORMATION pDirInfo = (PFILE_DIRECTORY_INFORMATION)buffer;
|
||||
while (TRUE) {
|
||||
printf("%S\n", pDirInfo->FileName);
|
||||
if (pDirInfo->NextEntryOffset == 0) {
|
||||
// if no more entries, continue to next query directory call
|
||||
status = NtQueryDirectoryFile(
|
||||
hFile, NULL, NULL, NULL, &ioStatusBlock, buffer, sizeof(buffer),
|
||||
FileDirectoryInformation, FALSE, NULL, FALSE);
|
||||
pDirInfo = (PFILE_DIRECTORY_INFORMATION)buffer;
|
||||
|
||||
if (status == STATUS_NO_MORE_FILES) {
|
||||
break;
|
||||
} else if (status != STATUS_SUCCESS) {
|
||||
printf("Error querying directory: %x\n", status);
|
||||
return 1;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
pDirInfo = (PFILE_DIRECTORY_INFORMATION)((LPBYTE)pDirInfo +
|
||||
pDirInfo->NextEntryOffset);
|
||||
}
|
||||
|
||||
CloseHandle(hFile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define FileBothDirectoryInformation static_cast<FILE_INFORMATION_CLASS>(3)
|
||||
|
||||
int main_using_file_both_information(int argc, char *argv[]) {
|
||||
if (argc != 2) {
|
||||
printf("Usage: ntquery <filename>\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto *NtQueryDirectoryFile = (NTSTATUS(WINAPI *)(
|
||||
HANDLE, HANDLE, PVOID, PVOID, PVOID, PVOID, DWORD, FILE_INFORMATION_CLASS,
|
||||
BOOLEAN, PVOID, BOOLEAN))GetProcAddress(GetModuleHandle("ntdll.dll"),
|
||||
"NtQueryDirectoryFile");
|
||||
|
||||
if (NtQueryDirectoryFile == NULL) {
|
||||
printf("Error getting NtQueryDirectoryFile\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// open the current working directory using NT API
|
||||
HANDLE hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
||||
|
||||
// use NtQueryDirectoryFile
|
||||
char buffer[64096];
|
||||
|
||||
IO_STATUS_BLOCK ioStatusBlock;
|
||||
NTSTATUS status = NtQueryDirectoryFile(
|
||||
hFile, NULL, NULL, NULL, &ioStatusBlock, buffer, sizeof(buffer),
|
||||
FileBothDirectoryInformation, FALSE, NULL, FALSE);
|
||||
if (status != STATUS_SUCCESS) {
|
||||
printf("Error querying directory\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
PFILE_BOTH_DIR_INFORMATION pDirInfo = (PFILE_BOTH_DIR_INFORMATION)buffer;
|
||||
while (TRUE) {
|
||||
printf("%S\n", pDirInfo->FileName);
|
||||
if (pDirInfo->NextEntryOffset == 0) {
|
||||
// if no more entries, continue to next query directory call
|
||||
status = NtQueryDirectoryFile(
|
||||
hFile, NULL, NULL, NULL, &ioStatusBlock, buffer, sizeof(buffer),
|
||||
FileBothDirectoryInformation, FALSE, NULL, FALSE);
|
||||
pDirInfo = (PFILE_BOTH_DIR_INFORMATION)buffer;
|
||||
|
||||
if (status == STATUS_NO_MORE_FILES) {
|
||||
break;
|
||||
} else if (status != STATUS_SUCCESS) {
|
||||
printf("Error querying directory: %x\n", status);
|
||||
return 1;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
pDirInfo = (PFILE_BOTH_DIR_INFORMATION)((LPBYTE)pDirInfo +
|
||||
pDirInfo->NextEntryOffset);
|
||||
}
|
||||
|
||||
CloseHandle(hFile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main_using_findfirstfile_ex(int argc, char *argv[]) {
|
||||
if (argc != 2) {
|
||||
printf("Usage: ntquery <filename>\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// open the current working directory using NT API
|
||||
HANDLE hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
||||
|
||||
char buffer[64096];
|
||||
|
||||
WIN32_FIND_DATA findData;
|
||||
HANDLE hFind = FindFirstFileEx(argv[1], FindExInfoBasic, &findData,
|
||||
FindExSearchNameMatch, NULL, 0);
|
||||
if (hFind == INVALID_HANDLE_VALUE) {
|
||||
printf("Error querying directory\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
do {
|
||||
char szPath[MAX_PATH];
|
||||
|
||||
printf("%s\n", findData.cFileName);
|
||||
} while (FindNextFile(hFind, &findData));
|
||||
|
||||
FindClose(hFind);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
return main_using_findfirstfile_ex(argc, argv);
|
||||
}
|
||||
@@ -20,7 +20,7 @@ pub fn main() anyerror!void {
|
||||
Output.Source.set(&output_source);
|
||||
defer Output.flush();
|
||||
|
||||
var args_buffer: [8096 * 2]u8 = undefined;
|
||||
var args_buffer: [8192 * 2]u8 = undefined;
|
||||
var fixed_buffer = std.heap.FixedBufferAllocator.init(&args_buffer);
|
||||
var allocator = fixed_buffer.allocator();
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ pub fn main() anyerror!void {
|
||||
Output.Source.set(&output_source);
|
||||
defer Output.flush();
|
||||
|
||||
var args_buffer: [8096 * 2]u8 = undefined;
|
||||
var args_buffer: [8192 * 2]u8 = undefined;
|
||||
var fixed_buffer = std.heap.FixedBufferAllocator.init(&args_buffer);
|
||||
var allocator = fixed_buffer.allocator();
|
||||
|
||||
|
||||
28
package.json
28
package.json
@@ -1,19 +1,25 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "bun",
|
||||
"dependencies": {
|
||||
"@biomejs/biome": "1.5.3",
|
||||
"@vscode/debugadapter": "^1.61.0",
|
||||
"esbuild": "^0.17.15",
|
||||
"eslint": "^8.20.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"mitata": "^0.1.3",
|
||||
"peechy": "0.4.34",
|
||||
"prettier": "^2.4.1",
|
||||
"prettier": "3.2.2",
|
||||
"react": "next",
|
||||
"react-dom": "next",
|
||||
"source-map-js": "^1.0.2",
|
||||
"typescript": "^5.0.2"
|
||||
},
|
||||
"private": true,
|
||||
"devDependencies": {
|
||||
"@types/react": "^18.0.25",
|
||||
"@typescript-eslint/eslint-plugin": "^5.31.0",
|
||||
"@typescript-eslint/parser": "^5.31.0"
|
||||
},
|
||||
"scripts": {
|
||||
"setup": "./scripts/setup.sh",
|
||||
"build": "if [ ! -e build ]; then bun setup; fi && ninja -C build",
|
||||
@@ -21,16 +27,12 @@
|
||||
"build:release": "cmake . -DCMAKE_BUILD_TYPE=Release -GNinja -Bbuild-release && ninja -Cbuild-release",
|
||||
"build:safe": "cmake . -DZIG_OPTIMIZE=ReleaseSafe -DUSE_DEBUG_JSC=ON -DCMAKE_BUILD_TYPE=Release -GNinja -Bbuild-safe && ninja -Cbuild-safe",
|
||||
"typecheck": "tsc --noEmit && cd test && bun run typecheck",
|
||||
"fmt": "prettier --write --cache './{src,test,bench,packages/{bun-types,bun-inspector-*,bun-vscode,bun-debug-adapter-protocol}}/**/*.{mjs,ts,tsx,js,jsx}'",
|
||||
"fmt:zig": "zig fmt src/*.zig src/**/*.zig",
|
||||
"fmt": "biome format --write {.vscode,src,test,bench,packages/{bun-types,bun-inspector-*,bun-vscode,bun-debug-adapter-protocol}}",
|
||||
"fmt:zig": "zig fmt src/*.zig src/*/*.zig src/*/*/*.zig src/*/*/*/*.zig",
|
||||
"lint": "eslint './**/*.d.ts' --cache",
|
||||
"lint:fix": "eslint './**/*.d.ts' --cache --fix"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^18.0.25",
|
||||
"@typescript-eslint/eslint-plugin": "^5.31.0",
|
||||
"@typescript-eslint/parser": "^5.31.0"
|
||||
},
|
||||
"version": "0.0.0",
|
||||
"prettier": "./.prettierrc.cjs"
|
||||
"lint:fix": "eslint './**/*.d.ts' --cache --fix",
|
||||
"test": "node packages/bun-internal-test/src/runner.node.mjs ./build/bun-debug",
|
||||
"test:release": "node packages/bun-internal-test/src/runner.node.mjs ./build-release/bun",
|
||||
"update-known-failures": "node packages/bun-internal-test/src/update-known-windows-failures.mjs"
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -2215,7 +2215,7 @@ export namespace DAP {
|
||||
*/
|
||||
instructionReference: string;
|
||||
/**
|
||||
* The offset from the instruction reference.
|
||||
* The offset from the instruction reference in bytes.
|
||||
* This can be negative.
|
||||
*/
|
||||
offset?: number;
|
||||
@@ -2278,6 +2278,13 @@ export namespace DAP {
|
||||
* This can be negative.
|
||||
*/
|
||||
offset?: number;
|
||||
/**
|
||||
* A machine-readable explanation of why a breakpoint may not be verified. If a breakpoint is verified or a specific reason is not known, the adapter should omit this property. Possible values include:
|
||||
*
|
||||
* - `pending`: Indicates a breakpoint might be verified in the future, but the adapter cannot verify it in the current state.
|
||||
* - `failed`: Indicates a breakpoint was not able to be verified, and the adapter does not believe it can be verified without intervention.
|
||||
*/
|
||||
reason?: "pending" | "failed";
|
||||
};
|
||||
/**
|
||||
* The granularity of one 'step' in the stepping requests `next`, `stepIn`, `stepOut`, and `stepBack`.
|
||||
@@ -2587,6 +2594,12 @@ export namespace DAP {
|
||||
* The end column of the range that corresponds to this instruction, if any.
|
||||
*/
|
||||
endColumn?: number;
|
||||
/**
|
||||
* A hint for how to present the instruction in the UI.
|
||||
*
|
||||
* A value of `invalid` may be used to indicate this instruction is 'filler' and cannot be reached by the program. For example, unreadable memory addresses may be presented is 'invalid.'
|
||||
*/
|
||||
presentationHint?: "normal" | "invalid";
|
||||
};
|
||||
/**
|
||||
* Logical areas that can be invalidated by the `invalidated` event.
|
||||
|
||||
@@ -3420,7 +3420,7 @@
|
||||
},
|
||||
"offset": {
|
||||
"type": "integer",
|
||||
"description": "The offset from the instruction reference.\nThis can be negative."
|
||||
"description": "The offset from the instruction reference in bytes.\nThis can be negative."
|
||||
},
|
||||
"condition": {
|
||||
"type": "string",
|
||||
@@ -3467,6 +3467,11 @@
|
||||
"offset": {
|
||||
"type": "integer",
|
||||
"description": "The offset from the instruction reference.\nThis can be negative."
|
||||
},
|
||||
"reason": {
|
||||
"type": "string",
|
||||
"description": "A machine-readable explanation of why a breakpoint may not be verified. If a breakpoint is verified or a specific reason is not known, the adapter should omit this property. Possible values include:\n\n- `pending`: Indicates a breakpoint might be verified in the future, but the adapter cannot verify it in the current state.\n - `failed`: Indicates a breakpoint was not able to be verified, and the adapter does not believe it can be verified without intervention.",
|
||||
"enum": ["pending", "failed"]
|
||||
}
|
||||
},
|
||||
"required": ["verified"]
|
||||
@@ -3750,6 +3755,11 @@
|
||||
"endColumn": {
|
||||
"type": "integer",
|
||||
"description": "The end column of the range that corresponds to this instruction, if any."
|
||||
},
|
||||
"presentationHint": {
|
||||
"type": "string",
|
||||
"description": "A hint for how to present the instruction in the UI.\n\nA value of `invalid` may be used to indicate this instruction is 'filler' and cannot be reached by the program. For example, unreadable memory addresses may be presented is 'invalid.'",
|
||||
"enum": ["normal", "invalid"]
|
||||
}
|
||||
},
|
||||
"required": ["address", "instruction"]
|
||||
|
||||
@@ -11,11 +11,7 @@ import type {
|
||||
StackFrame,
|
||||
WebsocketMessageBuildFailure,
|
||||
} from "../../src/api/schema";
|
||||
import {
|
||||
messagesToMarkdown,
|
||||
problemsToMarkdown,
|
||||
withBunInfo,
|
||||
} from "./markdown";
|
||||
import { messagesToMarkdown, problemsToMarkdown, withBunInfo } from "./markdown";
|
||||
import { fetchAllMappings, remapPosition, sourceMappings } from "./sourcemap";
|
||||
|
||||
export enum StackFrameScope {
|
||||
@@ -82,9 +78,7 @@ enum ErrorTagType {
|
||||
}
|
||||
|
||||
const ErrorTag = ({ type }: { type: ErrorTagType }) => (
|
||||
<div className={`BunError-ErrorTag BunError-ErrorTag--${ErrorTagType[type]}`}>
|
||||
{ErrorTagType[type]}
|
||||
</div>
|
||||
<div className={`BunError-ErrorTag BunError-ErrorTag--${ErrorTagType[type]}`}>{ErrorTagType[type]}</div>
|
||||
);
|
||||
|
||||
const errorTags = [
|
||||
@@ -133,11 +127,7 @@ function hasColumnOrLine(filename: string) {
|
||||
return /:\d+/.test(filename);
|
||||
}
|
||||
|
||||
function appendLineColumnIfNeeded(
|
||||
base: string,
|
||||
line?: number,
|
||||
column?: number,
|
||||
) {
|
||||
function appendLineColumnIfNeeded(base: string, line?: number, column?: number) {
|
||||
if (hasColumnOrLine(base)) return base;
|
||||
|
||||
return appendLineColumn(base, line, column);
|
||||
@@ -155,11 +145,7 @@ function appendLineColumn(base: string, line?: number, column?: number) {
|
||||
return base;
|
||||
}
|
||||
|
||||
const blobFileURL = (
|
||||
filename: string,
|
||||
line?: number,
|
||||
column?: number,
|
||||
): string => {
|
||||
const blobFileURL = (filename: string, line?: number, column?: number): string => {
|
||||
var base = `/blob:${filename}`;
|
||||
|
||||
base = appendLineColumnIfNeeded(base, line, column);
|
||||
@@ -167,11 +153,7 @@ const blobFileURL = (
|
||||
return new URL(base, globalThis.location.href).href;
|
||||
};
|
||||
|
||||
const maybeBlobFileURL = (
|
||||
filename: string,
|
||||
line?: number,
|
||||
column?: number,
|
||||
): string => {
|
||||
const maybeBlobFileURL = (filename: string, line?: number, column?: number): string => {
|
||||
if (filename.includes(".bun")) {
|
||||
return blobFileURL(filename, line, column);
|
||||
}
|
||||
@@ -183,9 +165,7 @@ const maybeBlobFileURL = (
|
||||
return srcFileURL(filename, line, column);
|
||||
};
|
||||
|
||||
const openWithoutFlashOfNewTab: React.MouseEventHandler<HTMLAnchorElement> = (
|
||||
event,
|
||||
) => {
|
||||
const openWithoutFlashOfNewTab: React.MouseEventHandler<HTMLAnchorElement> = event => {
|
||||
const target = event.currentTarget;
|
||||
const href = target.getAttribute("href");
|
||||
if (!href || event.button !== 0) {
|
||||
@@ -216,18 +196,13 @@ const openWithoutFlashOfNewTab: React.MouseEventHandler<HTMLAnchorElement> = (
|
||||
})
|
||||
.then(
|
||||
() => {},
|
||||
(er) => {},
|
||||
er => {},
|
||||
);
|
||||
return false;
|
||||
};
|
||||
|
||||
const srcFileURL = (
|
||||
filename: string,
|
||||
line?: number,
|
||||
column?: number,
|
||||
): string => {
|
||||
if (filename.startsWith("http://") || filename.startsWith("https://"))
|
||||
return appendLineColumnIfNeeded(filename);
|
||||
const srcFileURL = (filename: string, line?: number, column?: number): string => {
|
||||
if (filename.startsWith("http://") || filename.startsWith("https://")) return appendLineColumnIfNeeded(filename);
|
||||
|
||||
if (filename.endsWith(".bun")) {
|
||||
return new URL("/" + filename, globalThis.location.href).href;
|
||||
@@ -272,10 +247,7 @@ class FancyTypeError {
|
||||
const nextWord = /(["a-zA-Z0-9_\.]+)\)$/.exec(partial);
|
||||
if (nextWord && nextWord[0]) {
|
||||
this.runtimeTypeName = nextWord[0];
|
||||
this.runtimeTypeName = this.runtimeTypeName.substring(
|
||||
0,
|
||||
this.runtimeTypeName.length - 1,
|
||||
);
|
||||
this.runtimeTypeName = this.runtimeTypeName.substring(0, this.runtimeTypeName.length - 1);
|
||||
switch (this.runtimeTypeName.toLowerCase()) {
|
||||
case "undefined": {
|
||||
this.runtimeType = RuntimeType.Undefined;
|
||||
@@ -312,15 +284,12 @@ class FancyTypeError {
|
||||
}
|
||||
}
|
||||
this.message = exception.message.substring(0, i);
|
||||
this.message = this.message.substring(
|
||||
0,
|
||||
this.message.lastIndexOf("(In "),
|
||||
);
|
||||
this.message = this.message.substring(0, this.message.lastIndexOf("(In "));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const clientURL = (filename) => {
|
||||
export const clientURL = filename => {
|
||||
if (filename.includes(".bun")) {
|
||||
return `/${filename.replace(/^(\/)?/g, "")}`;
|
||||
}
|
||||
@@ -368,22 +337,17 @@ const AsyncSourceLines = ({
|
||||
Accept: "text/plain",
|
||||
},
|
||||
})
|
||||
.then((resp) => {
|
||||
.then(resp => {
|
||||
return resp.text();
|
||||
})
|
||||
.then((text) => {
|
||||
.then(text => {
|
||||
if (cancelled) return;
|
||||
|
||||
// TODO: make this faster
|
||||
const lines = text.split("\n");
|
||||
const startLineNumber = Math.max(
|
||||
Math.min(Math.max(highlight - 4, 0), lines.length - 1),
|
||||
0,
|
||||
);
|
||||
const startLineNumber = Math.max(Math.min(Math.max(highlight - 4, 0), lines.length - 1), 0);
|
||||
const endLineNumber = Math.min(startLineNumber + 8, lines.length);
|
||||
const sourceLines: SourceLine[] = new Array(
|
||||
endLineNumber - startLineNumber,
|
||||
);
|
||||
const sourceLines: SourceLine[] = new Array(endLineNumber - startLineNumber);
|
||||
var index = 0;
|
||||
for (let i = startLineNumber; i < endLineNumber; i++) {
|
||||
const currentLine = lines[i - 1];
|
||||
@@ -394,14 +358,10 @@ const AsyncSourceLines = ({
|
||||
};
|
||||
}
|
||||
|
||||
setSourceLines(
|
||||
index !== sourceLines.length
|
||||
? sourceLines.slice(0, index)
|
||||
: sourceLines,
|
||||
);
|
||||
setSourceLines(index !== sourceLines.length ? sourceLines.slice(0, index) : sourceLines);
|
||||
setLoadState(LoadState.loaded);
|
||||
})
|
||||
.catch((err) => {
|
||||
.catch(err => {
|
||||
if (!cancelled) {
|
||||
console.error(err);
|
||||
setLoadState(LoadState.failed);
|
||||
@@ -499,8 +459,7 @@ const SourceLines = ({
|
||||
}
|
||||
}
|
||||
|
||||
const leftPad =
|
||||
maxLineNumber.toString(10).length - minLineNumber.toString(10).length;
|
||||
const leftPad = maxLineNumber.toString(10).length - minLineNumber.toString(10).length;
|
||||
|
||||
const _sourceLines = sourceLines.slice(start, end);
|
||||
const lines = new Array(_sourceLines.length + React.Children.count(children));
|
||||
@@ -520,15 +479,10 @@ const SourceLines = ({
|
||||
data-line={line}
|
||||
data-column={classes.highlight ? highlightColumnStart : dedent}
|
||||
title={`Open line ${line} in editor`}
|
||||
href={buildURL(
|
||||
line,
|
||||
classes.highlight ? highlightColumnStart : dedent,
|
||||
)}
|
||||
href={buildURL(line, classes.highlight ? highlightColumnStart : dedent)}
|
||||
onClickCapture={openWithoutFlashOfNewTab}
|
||||
key={"highlight-number-" + line}
|
||||
className={`BunError-SourceLine-number ${
|
||||
classes.empty ? "BunError-SourceLine-number--empty" : ""
|
||||
} ${
|
||||
className={`BunError-SourceLine-number ${classes.empty ? "BunError-SourceLine-number--empty" : ""} ${
|
||||
classes.highlight ? "BunError-SourceLine-number--highlight" : ""
|
||||
}`}
|
||||
>
|
||||
@@ -536,9 +490,9 @@ const SourceLines = ({
|
||||
</a>
|
||||
<div
|
||||
tabIndex={i}
|
||||
className={`BunError-SourceLine-text ${
|
||||
classes.empty ? "BunError-SourceLine-text--empty" : ""
|
||||
} ${classes.highlight ? "BunError-SourceLine-text--highlight" : ""}`}
|
||||
className={`BunError-SourceLine-text ${classes.empty ? "BunError-SourceLine-text--empty" : ""} ${
|
||||
classes.highlight ? "BunError-SourceLine-text--highlight" : ""
|
||||
}`}
|
||||
>
|
||||
{_text}
|
||||
</div>
|
||||
@@ -549,9 +503,7 @@ const SourceLines = ({
|
||||
return (
|
||||
<IndentationContext.Provider value={dedent}>
|
||||
<div className="BunError-SourceLines">
|
||||
<div
|
||||
className={`BunError-SourceLines-highlighter--${highlightI}`}
|
||||
></div>
|
||||
<div className={`BunError-SourceLines-highlighter--${highlightI}`}></div>
|
||||
|
||||
{lines}
|
||||
</div>
|
||||
@@ -568,10 +520,7 @@ const BuildErrorSourceLines = ({
|
||||
}) => {
|
||||
const { line, line_text, column } = location;
|
||||
const sourceLines: SourceLine[] = [{ line, text: line_text }];
|
||||
const buildURL = React.useCallback(
|
||||
(line, column) => srcFileURL(filename, line, column),
|
||||
[srcFileURL, filename],
|
||||
);
|
||||
const buildURL = React.useCallback((line, column) => srcFileURL(filename, line, column), [srcFileURL, filename]);
|
||||
return (
|
||||
<SourceLines
|
||||
sourceLines={sourceLines}
|
||||
@@ -613,8 +562,7 @@ export const StackFrameIdentifier = ({
|
||||
}) => {
|
||||
switch (scope) {
|
||||
case StackFrameScope.Constructor: {
|
||||
functionName =
|
||||
markdown && functionName ? "`" + functionName + "`" : functionName;
|
||||
functionName = markdown && functionName ? "`" + functionName + "`" : functionName;
|
||||
return functionName ? `new ${functionName}` : "new (anonymous)";
|
||||
}
|
||||
|
||||
@@ -636,16 +584,12 @@ export const StackFrameIdentifier = ({
|
||||
|
||||
case StackFrameScope.Function:
|
||||
default: {
|
||||
return functionName
|
||||
? markdown
|
||||
? "`" + functionName + "`"
|
||||
: functionName
|
||||
: "λ()";
|
||||
return functionName ? (markdown ? "`" + functionName + "`" : functionName) : "λ()";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const getNativeStackFrameIdentifier = (frame) => {
|
||||
const getNativeStackFrameIdentifier = frame => {
|
||||
const { file, function_name: functionName, scope } = frame;
|
||||
|
||||
return StackFrameIdentifier({
|
||||
@@ -673,11 +617,7 @@ const NativeStackFrame = ({
|
||||
} = frame;
|
||||
const fileName = normalizedFilename(file, cwd);
|
||||
return (
|
||||
<div
|
||||
className={`BunError-StackFrame ${
|
||||
fileName.endsWith(".bun") ? "BunError-StackFrame--muted" : ""
|
||||
}`}
|
||||
>
|
||||
<div className={`BunError-StackFrame ${fileName.endsWith(".bun") ? "BunError-StackFrame--muted" : ""}`}>
|
||||
<div
|
||||
title={StackFrameScope[scope]}
|
||||
className="BunError-StackFrame-identifier"
|
||||
@@ -700,9 +640,7 @@ const NativeStackFrame = ({
|
||||
<div className="BunError-StackFrame-link-content">
|
||||
<div className={`BunError-StackFrame-file`}>{fileName}</div>
|
||||
{line > -1 && <div className="BunError-StackFrame-line">:{line}</div>}
|
||||
{column > -1 && (
|
||||
<div className="BunError-StackFrame-column">:{column}</div>
|
||||
)}
|
||||
{column > -1 && <div className="BunError-StackFrame-column">:{column}</div>}
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
@@ -714,21 +652,11 @@ const NativeStackFrames = ({ frames, urlBuilder }) => {
|
||||
var maxLength = 0;
|
||||
|
||||
for (let i = 0; i < frames.length; i++) {
|
||||
maxLength = Math.max(
|
||||
getNativeStackFrameIdentifier(frames[i]).length,
|
||||
maxLength,
|
||||
);
|
||||
maxLength = Math.max(getNativeStackFrameIdentifier(frames[i]).length, maxLength);
|
||||
}
|
||||
|
||||
for (let i = 0; i < frames.length; i++) {
|
||||
items[i] = (
|
||||
<NativeStackFrame
|
||||
maxLength={maxLength}
|
||||
urlBuilder={urlBuilder}
|
||||
key={i}
|
||||
frame={frames[i]}
|
||||
/>
|
||||
);
|
||||
items[i] = <NativeStackFrame maxLength={maxLength} urlBuilder={urlBuilder} key={i} frame={frames[i]} />;
|
||||
}
|
||||
|
||||
return (
|
||||
@@ -756,10 +684,7 @@ const NativeStackTrace = ({
|
||||
const filename = normalizedFilename(file, cwd);
|
||||
const urlBuilder = isClient ? clientURL : maybeBlobFileURL;
|
||||
const ref = React.useRef<HTMLDivElement>(null);
|
||||
const buildURL = React.useCallback(
|
||||
(line, column) => urlBuilder(file, line, column),
|
||||
[file, urlBuilder],
|
||||
);
|
||||
const buildURL = React.useCallback((line, column) => urlBuilder(file, line, column), [file, urlBuilder]);
|
||||
|
||||
return (
|
||||
<div ref={ref} className={`BunError-NativeStackTrace`}>
|
||||
@@ -797,9 +722,7 @@ const NativeStackTrace = ({
|
||||
{children}
|
||||
</AsyncSourceLines>
|
||||
)}
|
||||
{frames.length > 1 && (
|
||||
<NativeStackFrames urlBuilder={urlBuilder} frames={frames} />
|
||||
)}
|
||||
{frames.length > 1 && <NativeStackFrames urlBuilder={urlBuilder} frames={frames} />}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -822,9 +745,7 @@ const JSException = ({
|
||||
isClient: boolean;
|
||||
}) => {
|
||||
const tag = isClient ? ErrorTagType.client : ErrorTagType.server;
|
||||
const [sourceLines, _setSourceLines] = React.useState(
|
||||
value?.stack?.source_lines ?? [],
|
||||
);
|
||||
const [sourceLines, _setSourceLines] = React.useState(value?.stack?.source_lines ?? []);
|
||||
var message = value.message || "";
|
||||
var name = value.name || "";
|
||||
if (!name && !message) {
|
||||
@@ -849,25 +770,17 @@ const JSException = ({
|
||||
|
||||
if (fancyTypeError.runtimeType !== RuntimeType.Nothing) {
|
||||
return (
|
||||
<div
|
||||
className={`BunError-JSException BunError-JSException--TypeError`}
|
||||
>
|
||||
<div className={`BunError-JSException BunError-JSException--TypeError`}>
|
||||
<div className="BunError-error-header">
|
||||
<div className={`BunError-error-code`}>TypeError</div>
|
||||
{errorTags[tag]}
|
||||
</div>
|
||||
|
||||
<div className={`BunError-error-message`}>
|
||||
{fancyTypeError.message}
|
||||
</div>
|
||||
<div className={`BunError-error-message`}>{fancyTypeError.message}</div>
|
||||
|
||||
{fancyTypeError.runtimeTypeName.length && (
|
||||
<div className={`BunError-error-subtitle`}>
|
||||
It's{" "}
|
||||
<span className="BunError-error-typename">
|
||||
{fancyTypeError.runtimeTypeName}
|
||||
</span>
|
||||
.
|
||||
It's <span className="BunError-error-typename">{fancyTypeError.runtimeTypeName}</span>.
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -879,9 +792,7 @@ const JSException = ({
|
||||
setSourceLines={setSourceLines}
|
||||
>
|
||||
<Indent by={value.stack.frames[0].position.column_start}>
|
||||
<span className="BunError-error-typename">
|
||||
{fancyTypeError.runtimeTypeName}
|
||||
</span>
|
||||
<span className="BunError-error-typename">{fancyTypeError.runtimeTypeName}</span>
|
||||
</Indent>
|
||||
</NativeStackTrace>
|
||||
)}
|
||||
@@ -956,17 +867,8 @@ const Summary = ({
|
||||
{errorCount} error{errorCount > 1 ? "s" : ""} on this page
|
||||
</div>
|
||||
|
||||
<a
|
||||
href="https://bun.sh/discord"
|
||||
target="_blank"
|
||||
className="BunError-Summary-help"
|
||||
>
|
||||
<svg
|
||||
width="18"
|
||||
viewBox="0 0 71 55"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<a href="https://bun.sh/discord" target="_blank" className="BunError-Summary-help">
|
||||
<svg width="18" viewBox="0 0 71 55" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0)">
|
||||
<path
|
||||
d="M60.1045 4.8978C55.5792 2.8214 50.7265 1.2916 45.6527 0.41542C45.5603 0.39851 45.468 0.440769 45.4204 0.525289C44.7963 1.6353 44.105 3.0834 43.6209 4.2216C38.1637 3.4046 32.7345 3.4046 27.3892 4.2216C26.905 3.0581 26.1886 1.6353 25.5617 0.525289C25.5141 0.443589 25.4218 0.40133 25.3294 0.41542C20.2584 1.2888 15.4057 2.8186 10.8776 4.8978C10.8384 4.9147 10.8048 4.9429 10.7825 4.9795C1.57795 18.7309 -0.943561 32.1443 0.293408 45.3914C0.299005 45.4562 0.335386 45.5182 0.385761 45.5576C6.45866 50.0174 12.3413 52.7249 18.1147 54.5195C18.2071 54.5477 18.305 54.5139 18.3638 54.4378C19.7295 52.5728 20.9469 50.6063 21.9907 48.5383C22.0523 48.4172 21.9935 48.2735 21.8676 48.2256C19.9366 47.4931 18.0979 46.6 16.3292 45.5858C16.1893 45.5041 16.1781 45.304 16.3068 45.2082C16.679 44.9293 17.0513 44.6391 17.4067 44.3461C17.471 44.2926 17.5606 44.2813 17.6362 44.3151C29.2558 49.6202 41.8354 49.6202 53.3179 44.3151C53.3935 44.2785 53.4831 44.2898 53.5502 44.3433C53.9057 44.6363 54.2779 44.9293 54.6529 45.2082C54.7816 45.304 54.7732 45.5041 54.6333 45.5858C52.8646 46.6197 51.0259 47.4931 49.0921 48.2228C48.9662 48.2707 48.9102 48.4172 48.9718 48.5383C50.038 50.6034 51.2554 52.5699 52.5959 54.435C52.6519 54.5139 52.7526 54.5477 52.845 54.5195C58.6464 52.7249 64.529 50.0174 70.6019 45.5576C70.6551 45.5182 70.6887 45.459 70.6943 45.3942C72.1747 30.0791 68.2147 16.7757 60.1968 4.9823C60.1772 4.9429 60.1437 4.9147 60.1045 4.8978ZM23.7259 37.3253C20.2276 37.3253 17.3451 34.1136 17.3451 30.1693C17.3451 26.225 20.1717 23.0133 23.7259 23.0133C27.308 23.0133 30.1626 26.2532 30.1066 30.1693C30.1066 34.1136 27.28 37.3253 23.7259 37.3253ZM47.3178 37.3253C43.8196 37.3253 40.9371 34.1136 40.9371 30.1693C40.9371 26.225 43.7636 23.0133 47.3178 23.0133C50.9 23.0133 53.7545 26.2532 53.6986 30.1693C53.6986 34.1136 50.9 37.3253 47.3178 37.3253Z"
|
||||
@@ -1005,13 +907,9 @@ const BuildError = ({ message }: { message: Message }) => {
|
||||
|
||||
<div className={`BunError-error-message`}>{title}</div>
|
||||
|
||||
{subtitle.length > 0 && (
|
||||
<div className={`BunError-error-subtitle`}>{subtitle}</div>
|
||||
)}
|
||||
{subtitle.length > 0 && <div className={`BunError-error-subtitle`}>{subtitle}</div>}
|
||||
|
||||
{message.data.location && (
|
||||
<BuildErrorStackTrace location={message.data.location} />
|
||||
)}
|
||||
{message.data.location && <BuildErrorStackTrace location={message.data.location} />}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -1034,16 +932,12 @@ const ResolveError = ({ message }: { message: Message }) => {
|
||||
|
||||
<div className={`BunError-error-message`}>
|
||||
Can't import{" "}
|
||||
<span className="BunError-error-message--mono BunError-error-message--quoted">
|
||||
"{message.on.resolve}"
|
||||
</span>
|
||||
<span className="BunError-error-message--mono BunError-error-message--quoted">"{message.on.resolve}"</span>
|
||||
</div>
|
||||
|
||||
{subtitle && <div className={`BunError-error-subtitle`}>{subtitle}</div>}
|
||||
|
||||
{message.data.location && (
|
||||
<BuildErrorStackTrace location={message.data.location} />
|
||||
)}
|
||||
{message.data.location && <BuildErrorStackTrace location={message.data.location} />}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -1052,9 +946,7 @@ const OverlayMessageContainer = ({
|
||||
reason,
|
||||
isClient = false,
|
||||
}: FallbackMessageContainer & { isClient: boolean }) => {
|
||||
const errorCount = problems
|
||||
? problems.exceptions.length + problems.build.errors
|
||||
: 0;
|
||||
const errorCount = problems ? problems.exceptions.length + problems.build.errors : 0;
|
||||
return (
|
||||
<div id="BunErrorOverlay-container">
|
||||
<div className="BunError-content">
|
||||
@@ -1086,7 +978,7 @@ function copyToClipboard(input: string | Promise<string>) {
|
||||
if (!input) return;
|
||||
|
||||
if (typeof input === "object" && "then" in input) {
|
||||
return input.then((str) => copyToClipboard(str));
|
||||
return input.then(str => copyToClipboard(str));
|
||||
}
|
||||
|
||||
return navigator.clipboard.writeText(input).then(() => {});
|
||||
@@ -1148,9 +1040,7 @@ function renderWithFunc(func) {
|
||||
reactRoot = document.createElement("div");
|
||||
reactRoot.id = BUN_ERROR_CONTAINER_ID;
|
||||
|
||||
const fallbackStyleSheet = document.querySelector(
|
||||
"style[data-has-bun-fallback-style]",
|
||||
);
|
||||
const fallbackStyleSheet = document.querySelector("style[data-has-bun-fallback-style]");
|
||||
if (!fallbackStyleSheet) {
|
||||
reactRoot.style.visibility = "hidden";
|
||||
}
|
||||
@@ -1204,7 +1094,7 @@ import { parse as getStackTrace } from "./stack-trace-parser";
|
||||
var runtimeErrorController: AbortController | null = null;
|
||||
var pending: { stopped: boolean }[] = [];
|
||||
|
||||
var onIdle = globalThis.requestIdleCallback || ((cb) => setTimeout(cb, 32));
|
||||
var onIdle = globalThis.requestIdleCallback || (cb => setTimeout(cb, 32));
|
||||
function clearSourceMappings() {
|
||||
sourceMappings.clear();
|
||||
}
|
||||
@@ -1270,8 +1160,7 @@ export function renderRuntimeError(error: Error) {
|
||||
exception.stack.frames[0].position.line = error[lineNumberProperty];
|
||||
|
||||
if (Number.isFinite(error[columnNumberProperty])) {
|
||||
exception.stack.frames[0].position.column_start =
|
||||
error[columnNumberProperty];
|
||||
exception.stack.frames[0].position.column_start = error[columnNumberProperty];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1308,20 +1197,18 @@ export function renderRuntimeError(error: Error) {
|
||||
// Rely on the cached ones
|
||||
// and don't fetch them again
|
||||
const framePromises = fetchAllMappings(
|
||||
exception.stack.frames.map((frame) =>
|
||||
normalizedFilename(frame.file, thisCwd),
|
||||
),
|
||||
exception.stack.frames.map(frame => normalizedFilename(frame.file, thisCwd)),
|
||||
signal,
|
||||
)
|
||||
.map((frame, i) => {
|
||||
if (stopThis.stopped) return null;
|
||||
return [frame, i];
|
||||
})
|
||||
.map((result) => {
|
||||
.map(result => {
|
||||
if (!result) return;
|
||||
const [mappings, frameIndex] = result;
|
||||
if (mappings?.then) {
|
||||
return mappings.then((mappings) => {
|
||||
return mappings.then(mappings => {
|
||||
if (!mappings || stopThis.stopped) {
|
||||
return null;
|
||||
}
|
||||
@@ -1391,10 +1278,7 @@ export function dismissError() {
|
||||
}
|
||||
}
|
||||
|
||||
export const renderBuildFailure = (
|
||||
failure: WebsocketMessageBuildFailure,
|
||||
cwd: string,
|
||||
) => {
|
||||
export const renderBuildFailure = (failure: WebsocketMessageBuildFailure, cwd: string) => {
|
||||
thisCwd = cwd;
|
||||
renderWithFunc(() => (
|
||||
<ErrorGroupContext.Provider value={{ cwd }}>
|
||||
|
||||
@@ -1,15 +1,5 @@
|
||||
import {
|
||||
normalizedFilename,
|
||||
StackFrameIdentifier,
|
||||
thisCwd,
|
||||
StackFrameScope,
|
||||
} from "./index";
|
||||
import type {
|
||||
JSException,
|
||||
JSException as JSExceptionType,
|
||||
Message,
|
||||
Problems,
|
||||
} from "../../src/api/schema";
|
||||
import { normalizedFilename, StackFrameIdentifier, thisCwd, StackFrameScope } from "./index";
|
||||
import type { JSException, JSException as JSExceptionType, Message, Problems } from "../../src/api/schema";
|
||||
|
||||
export function problemsToMarkdown(problems: Problems) {
|
||||
var markdown = "";
|
||||
@@ -27,14 +17,14 @@ export function problemsToMarkdown(problems: Problems) {
|
||||
export function messagesToMarkdown(messages: Message[]): string {
|
||||
return messages
|
||||
.map(messageToMarkdown)
|
||||
.map((a) => a.trim())
|
||||
.map(a => a.trim())
|
||||
.join("\n");
|
||||
}
|
||||
|
||||
export function exceptionsToMarkdown(exceptions: JSExceptionType[]): string {
|
||||
return exceptions
|
||||
.map(exceptionToMarkdown)
|
||||
.map((a) => a.trim())
|
||||
.map(a => a.trim())
|
||||
.join("\n");
|
||||
}
|
||||
|
||||
@@ -73,11 +63,7 @@ function exceptionToMarkdown(exception: JSException): string {
|
||||
const {
|
||||
file: _file = "",
|
||||
function_name = "",
|
||||
position: {
|
||||
line = -1,
|
||||
column_start: column = -1,
|
||||
column_stop: columnEnd = column,
|
||||
} = {
|
||||
position: { line = -1, column_start: column = -1, column_stop: columnEnd = column } = {
|
||||
line: -1,
|
||||
column_start: -1,
|
||||
column_stop: -1,
|
||||
@@ -114,23 +100,17 @@ function exceptionToMarkdown(exception: JSException): string {
|
||||
markdown += "\n```";
|
||||
markdown += extname;
|
||||
markdown += "\n";
|
||||
stack.source_lines.forEach((sourceLine) => {
|
||||
stack.source_lines.forEach(sourceLine => {
|
||||
const lineText = sourceLine.text.trimEnd();
|
||||
markdown += lineText + "\n";
|
||||
if (sourceLine.line === line && stack.source_lines.length > 1) {
|
||||
// the comment should start at the first non-whitespace character
|
||||
// ideally it should be length the original line
|
||||
// but it may not be
|
||||
var prefix = "".padStart(
|
||||
lineText.length - lineText.trimStart().length,
|
||||
" ",
|
||||
);
|
||||
var prefix = "".padStart(lineText.length - lineText.trimStart().length, " ");
|
||||
|
||||
prefix +=
|
||||
"/* ".padEnd(column - 1 - prefix.length, " ") +
|
||||
"^ happened here ";
|
||||
markdown +=
|
||||
prefix.padEnd(Math.max(lineText.length, 1) - 1, " ") + "*/\n";
|
||||
prefix += "/* ".padEnd(column - 1 - prefix.length, " ") + "^ happened here ";
|
||||
markdown += prefix.padEnd(Math.max(lineText.length, 1) - 1, " ") + "*/\n";
|
||||
}
|
||||
});
|
||||
markdown = markdown.trimEnd() + "\n```";
|
||||
@@ -240,11 +220,9 @@ function messageToMarkdown(message: Message): string {
|
||||
|
||||
if (message.data.location.line_text.length) {
|
||||
const extnameI = message.data.location.file.lastIndexOf(".");
|
||||
const extname =
|
||||
extnameI > -1 ? message.data.location.file.slice(extnameI + 1) : "";
|
||||
const extname = extnameI > -1 ? message.data.location.file.slice(extnameI + 1) : "";
|
||||
|
||||
markdown +=
|
||||
"\n```" + extname + "\n" + message.data.location.line_text + "\n```\n";
|
||||
markdown += "\n```" + extname + "\n" + message.data.location.line_text + "\n```\n";
|
||||
} else {
|
||||
markdown += "\n";
|
||||
}
|
||||
@@ -257,14 +235,14 @@ function messageToMarkdown(message: Message): string {
|
||||
return markdown;
|
||||
}
|
||||
|
||||
export const withBunInfo = (text) => {
|
||||
export const withBunInfo = text => {
|
||||
const bunInfo = getBunInfo();
|
||||
|
||||
const trimmed = text.trim();
|
||||
|
||||
if (bunInfo && "then" in bunInfo) {
|
||||
return bunInfo.then(
|
||||
(info) => {
|
||||
info => {
|
||||
const markdown = bunInfoToMarkdown(info).trim();
|
||||
return trimmed + "\n" + markdown + "\n";
|
||||
},
|
||||
@@ -379,8 +357,8 @@ function getBunInfo() {
|
||||
Accept: "application/json",
|
||||
},
|
||||
})
|
||||
.then((resp) => resp.json())
|
||||
.then((bunInfo) => {
|
||||
.then(resp => resp.json())
|
||||
.then(bunInfo => {
|
||||
clearTimeout(id);
|
||||
bunInfoMemoized = bunInfo;
|
||||
if ("sessionStorage" in globalThis) {
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
// Based on https://github.com/stacktracejs/error-stack-parser/blob/master/error-stack-parser.js
|
||||
|
||||
import type {
|
||||
StackFrame as StackFrameType,
|
||||
StackFramePosition,
|
||||
StackFrameScope,
|
||||
} from "../../src/api/schema";
|
||||
import type { StackFrame as StackFrameType, StackFramePosition, StackFrameScope } from "../../src/api/schema";
|
||||
|
||||
export class StackFrame implements StackFrameType {
|
||||
function_name: string;
|
||||
@@ -89,9 +85,7 @@ export default class RuntimeError {
|
||||
return filtered.map(function (line) {
|
||||
if (line.indexOf("(eval ") > -1) {
|
||||
// Throw away eval information until we implement stacktrace.js/stackframe#8
|
||||
line = line
|
||||
.replace(/eval code/g, "eval")
|
||||
.replace(/(\(eval at [^()]*)|(\),.*$)/g, "");
|
||||
line = line.replace(/eval code/g, "eval").replace(/(\(eval at [^()]*)|(\),.*$)/g, "");
|
||||
}
|
||||
var sanitizedLine = line.replace(/^\s+/, "").replace(/\(eval code/g, "(");
|
||||
|
||||
@@ -100,20 +94,13 @@ export default class RuntimeError {
|
||||
var location = sanitizedLine.match(/ (\((.+):(\d+):(\d+)\)$)/);
|
||||
|
||||
// remove the parenthesized location from the line, if it was matched
|
||||
sanitizedLine = location
|
||||
? sanitizedLine.replace(location[0], "")
|
||||
: sanitizedLine;
|
||||
sanitizedLine = location ? sanitizedLine.replace(location[0], "") : sanitizedLine;
|
||||
|
||||
var tokens = sanitizedLine.split(/\s+/).slice(1);
|
||||
// if a location was matched, pass it to extractLocation() otherwise pop the last token
|
||||
var locationParts = this.extractLocation(
|
||||
location ? location[1] : tokens.pop(),
|
||||
);
|
||||
var locationParts = this.extractLocation(location ? location[1] : tokens.pop());
|
||||
var functionName = tokens.join(" ") || undefined;
|
||||
var fileName =
|
||||
["eval", "<anonymous>"].indexOf(locationParts[0]) > -1
|
||||
? undefined
|
||||
: locationParts[0];
|
||||
var fileName = ["eval", "<anonymous>"].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0];
|
||||
|
||||
return new StackFrame({
|
||||
functionName: functionName,
|
||||
@@ -133,10 +120,7 @@ export default class RuntimeError {
|
||||
return filtered.map(function (line) {
|
||||
// Throw away eval information until we implement stacktrace.js/stackframe#8
|
||||
if (line.indexOf(" > eval") > -1) {
|
||||
line = line.replace(
|
||||
/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,
|
||||
":$1",
|
||||
);
|
||||
line = line.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g, ":$1");
|
||||
}
|
||||
|
||||
if (line.indexOf("@") === -1 && line.indexOf(":") === -1) {
|
||||
@@ -148,9 +132,7 @@ export default class RuntimeError {
|
||||
var functionNameRegex = /((.*".+"[^@]*)?[^@]*)(?:@)/;
|
||||
var matches = line.match(functionNameRegex);
|
||||
var functionName = matches && matches[1] ? matches[1] : undefined;
|
||||
var locationParts = this.extractLocation(
|
||||
line.replace(functionNameRegex, ""),
|
||||
);
|
||||
var locationParts = this.extractLocation(line.replace(functionNameRegex, ""));
|
||||
|
||||
return new StackFrame({
|
||||
functionName: functionName,
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Accelerate VLQ decoding with a lookup table
|
||||
const vlqTable = new Uint8Array(128);
|
||||
const vlqChars =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
const vlqChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
vlqTable.fill(0xff);
|
||||
for (let i = 0; i < vlqChars.length; i++) vlqTable[vlqChars.charCodeAt(i)] = i;
|
||||
|
||||
@@ -10,10 +9,7 @@ export function parseSourceMap(json) {
|
||||
throw new Error("Invalid source map");
|
||||
}
|
||||
|
||||
if (
|
||||
!(json.sources instanceof Array) ||
|
||||
json.sources.some((x) => typeof x !== "string")
|
||||
) {
|
||||
if (!(json.sources instanceof Array) || json.sources.some(x => typeof x !== "string")) {
|
||||
throw new Error("Invalid source map");
|
||||
}
|
||||
|
||||
@@ -147,8 +143,7 @@ export function decodeMappings(mappings, sourcesCount) {
|
||||
// Read the original source
|
||||
const originalSourceDelta = decodeVLQ();
|
||||
originalSource += originalSourceDelta;
|
||||
if (originalSource < 0 || originalSource >= sourcesCount)
|
||||
decodeError("Invalid original source");
|
||||
if (originalSource < 0 || originalSource >= sourcesCount) decodeError("Invalid original source");
|
||||
|
||||
// Read the original line
|
||||
const originalLineDelta = decodeVLQ();
|
||||
@@ -211,11 +206,7 @@ export function decodeMappings(mappings, sourcesCount) {
|
||||
return data.subarray(0, dataLength);
|
||||
}
|
||||
|
||||
export function remapPosition(
|
||||
decodedMappings: Int32Array,
|
||||
line: number,
|
||||
column: number,
|
||||
) {
|
||||
export function remapPosition(decodedMappings: Int32Array, line: number, column: number) {
|
||||
if (!(decodedMappings instanceof Int32Array)) {
|
||||
throw new Error("decodedMappings must be an Int32Array");
|
||||
}
|
||||
@@ -260,7 +251,7 @@ export function fetchMappings(file, signal) {
|
||||
return sourceMappings.get(file);
|
||||
}
|
||||
|
||||
return fetchRemoteSourceMap(file, signal).then((json) => {
|
||||
return fetchRemoteSourceMap(file, signal).then(json => {
|
||||
if (!json) return null;
|
||||
const { data } = parseSourceMap(json);
|
||||
sourceMappings.set(file, data);
|
||||
@@ -285,11 +276,11 @@ export function fetchAllMappings(files, signal) {
|
||||
var resolvers = [];
|
||||
for (let i = 0; i < indices.length; i++) {
|
||||
results[indices[i]] = new Promise((resolve, reject) => {
|
||||
resolvers[i] = (res) => resolve(res ? [res, i] : null);
|
||||
resolvers[i] = res => resolve(res ? [res, i] : null);
|
||||
});
|
||||
}
|
||||
|
||||
mapped.finally((a) => {
|
||||
mapped.finally(a => {
|
||||
for (let resolve of resolvers) {
|
||||
try {
|
||||
resolve(a);
|
||||
@@ -320,10 +311,7 @@ function indexOfMapping(mappings: Int32Array, line: number, column: number) {
|
||||
var i = index + step;
|
||||
// this multiply is slow but it's okay for now
|
||||
var j = i * 6;
|
||||
if (
|
||||
mappings[j] < line ||
|
||||
(mappings[j] == line && mappings[j + 1] <= column)
|
||||
) {
|
||||
if (mappings[j] < line || (mappings[j] == line && mappings[j + 1] <= column)) {
|
||||
index = i + 1;
|
||||
count -= step + 1;
|
||||
} else {
|
||||
|
||||
@@ -17,12 +17,7 @@ export function parse(stackString): StackFrame[] {
|
||||
const lines = stackString.split("\n");
|
||||
|
||||
return lines.reduce((stack, line) => {
|
||||
const parseResult =
|
||||
parseChrome(line) ||
|
||||
parseWinjs(line) ||
|
||||
parseGecko(line) ||
|
||||
parseNode(line) ||
|
||||
parseJSC(line);
|
||||
const parseResult = parseChrome(line) || parseWinjs(line) || parseGecko(line) || parseNode(line) || parseJSC(line);
|
||||
|
||||
if (parseResult) {
|
||||
stack.push(parseResult);
|
||||
@@ -32,15 +27,14 @@ export function parse(stackString): StackFrame[] {
|
||||
}, []);
|
||||
}
|
||||
|
||||
const formatFile = (file) => {
|
||||
const formatFile = file => {
|
||||
if (!file) {
|
||||
return "";
|
||||
}
|
||||
|
||||
if (file.startsWith("blob:")) {
|
||||
if (globalThis["__BUN"]?.client) {
|
||||
const replacement =
|
||||
globalThis["__BUN"]?.client.dependencies.getFilePathFromBlob(file);
|
||||
const replacement = globalThis["__BUN"]?.client.dependencies.getFilePathFromBlob(file);
|
||||
if (replacement) {
|
||||
file = replacement;
|
||||
}
|
||||
@@ -146,8 +140,7 @@ function parseGecko(line) {
|
||||
};
|
||||
}
|
||||
|
||||
const javaScriptCoreRe =
|
||||
/^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i;
|
||||
const javaScriptCoreRe = /^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i;
|
||||
|
||||
function parseJSC(line) {
|
||||
const parts = javaScriptCoreRe.exec(line);
|
||||
@@ -166,8 +159,7 @@ function parseJSC(line) {
|
||||
};
|
||||
}
|
||||
|
||||
const nodeRe =
|
||||
/^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i;
|
||||
const nodeRe = /^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i;
|
||||
|
||||
function parseNode(line) {
|
||||
const parts = nodeRe.exec(line);
|
||||
|
||||
@@ -3,11 +3,11 @@ import { copyFileSync, mkdirSync, readdirSync, rmSync, statSync } from "fs";
|
||||
import { join } from "path";
|
||||
|
||||
try {
|
||||
const basePath = join(import.meta.dir, "../../src/bun.js/WebKit/Source/WebInspectorUI/UserInterface");
|
||||
const basePath = join(import.meta.dir, "../../../src/bun.js/WebKit/Source/WebInspectorUI/UserInterface");
|
||||
const htmlPath = join(basePath, "Main.html");
|
||||
const backendCommands = join(
|
||||
import.meta.dir,
|
||||
"../../src/bun.js/WebKit/WebKitBuild/Release/JavaScriptCore/DerivedSources/inspector/InspectorBackendCommands.js",
|
||||
"../../../src/bun.js/WebKit/WebKitBuild/Release/JavaScriptCore/DerivedSources/inspector/InspectorBackendCommands.js",
|
||||
);
|
||||
const scriptsToBundle = [];
|
||||
const stylesToBundle = [];
|
||||
@@ -3047,6 +3047,10 @@ export namespace JSC {
|
||||
* Whether the expression should be considered to be in a user gesture or not.
|
||||
*/
|
||||
emulateUserGesture?: boolean | undefined;
|
||||
/**
|
||||
* Whether to automatically await returned promise.
|
||||
*/
|
||||
awaitPromise?: boolean | undefined;
|
||||
};
|
||||
/**
|
||||
* Calls function with given declaration on the given object. Object group of the result is inherited from the target object.
|
||||
|
||||
@@ -48,10 +48,7 @@
|
||||
"id": "Channel",
|
||||
"description": "Logging channel.",
|
||||
"type": "object",
|
||||
"properties": [
|
||||
{ "name": "source", "$ref": "ChannelSource" },
|
||||
{ "name": "level", "$ref": "ChannelLevel" }
|
||||
]
|
||||
"properties": [{ "name": "source", "$ref": "ChannelSource" }, { "name": "level", "$ref": "ChannelLevel" }]
|
||||
},
|
||||
{
|
||||
"id": "ConsoleMessage",
|
||||
@@ -1142,10 +1139,7 @@
|
||||
{
|
||||
"name": "snapshot",
|
||||
"description": "Take a heap snapshot.",
|
||||
"returns": [
|
||||
{ "name": "timestamp", "type": "number" },
|
||||
{ "name": "snapshotData", "$ref": "HeapSnapshotData" }
|
||||
]
|
||||
"returns": [{ "name": "timestamp", "type": "number" }, { "name": "snapshotData", "$ref": "HeapSnapshotData" }]
|
||||
},
|
||||
{
|
||||
"name": "startTracking",
|
||||
@@ -1235,10 +1229,7 @@
|
||||
{ "name": "evaluateForTestInFrontend", "parameters": [{ "name": "script", "type": "string" }] },
|
||||
{
|
||||
"name": "inspect",
|
||||
"parameters": [
|
||||
{ "name": "object", "$ref": "Runtime.RemoteObject" },
|
||||
{ "name": "hints", "type": "object" }
|
||||
]
|
||||
"parameters": [{ "name": "object", "$ref": "Runtime.RemoteObject" }, { "name": "hints", "type": "object" }]
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -2751,6 +2742,12 @@
|
||||
"type": "boolean",
|
||||
"optional": true,
|
||||
"description": "Whether the expression should be considered to be in a user gesture or not."
|
||||
},
|
||||
{
|
||||
"name": "awaitPromise",
|
||||
"type": "boolean",
|
||||
"optional": true,
|
||||
"description": "Whether to automatically await returned promise."
|
||||
}
|
||||
],
|
||||
"returns": [
|
||||
@@ -2761,7 +2758,8 @@
|
||||
"optional": true,
|
||||
"description": "True if the result was thrown during the evaluation."
|
||||
}
|
||||
]
|
||||
],
|
||||
"async": true
|
||||
},
|
||||
{
|
||||
"name": "getPreview",
|
||||
|
||||
@@ -812,7 +812,8 @@ export namespace V8 {
|
||||
| "WarnSameSiteLaxCrossDowngradeLax"
|
||||
| "WarnAttributeValueExceedsMaxSize"
|
||||
| "WarnDomainNonASCII"
|
||||
| "WarnThirdPartyPhaseout";
|
||||
| "WarnThirdPartyPhaseout"
|
||||
| "WarnCrossSiteRedirectDowngradeChangesInclusion";
|
||||
export type CookieOperation = "SetCookie" | "ReadCookie";
|
||||
/**
|
||||
* This information is currently necessary, as the front-end has a difficult
|
||||
@@ -865,6 +866,7 @@ export namespace V8 {
|
||||
| "Script"
|
||||
| "ServiceWorker"
|
||||
| "SharedWorker"
|
||||
| "SpeculationRules"
|
||||
| "Stylesheet"
|
||||
| "Track"
|
||||
| "Video"
|
||||
@@ -1091,6 +1093,16 @@ export namespace V8 {
|
||||
export type BounceTrackingIssueDetails = {
|
||||
trackingSites: string[];
|
||||
};
|
||||
/**
|
||||
* This issue warns about third-party sites that are accessing cookies on the
|
||||
* current page, and have been permitted due to having a global metadata grant.
|
||||
* Note that in this context 'site' means eTLD+1. For example, if the URL
|
||||
* `https://example.test:80/web_page` was accessing cookies, the site reported
|
||||
* would be `example.test`.
|
||||
*/
|
||||
export type CookieDeprecationMetadataIssueDetails = {
|
||||
allowedSites: string[];
|
||||
};
|
||||
export type ClientHintIssueReason = "MetaTagAllowListInvalidOrigin" | "MetaTagModifiedHTML";
|
||||
export type FederatedAuthRequestIssueDetails = {
|
||||
federatedAuthRequestIssueReason: FederatedAuthRequestIssueReason;
|
||||
@@ -1130,6 +1142,8 @@ export namespace V8 {
|
||||
| "IdTokenHttpNotFound"
|
||||
| "IdTokenNoResponse"
|
||||
| "IdTokenInvalidResponse"
|
||||
| "IdTokenIdpErrorResponse"
|
||||
| "IdTokenCrossSiteIdpErrorResponse"
|
||||
| "IdTokenInvalidRequest"
|
||||
| "IdTokenInvalidContentType"
|
||||
| "ErrorIdToken"
|
||||
@@ -1234,6 +1248,7 @@ export namespace V8 {
|
||||
| "ClientHintIssue"
|
||||
| "FederatedAuthRequestIssue"
|
||||
| "BounceTrackingIssue"
|
||||
| "CookieDeprecationMetadataIssue"
|
||||
| "StylesheetLoadingIssue"
|
||||
| "FederatedAuthUserInfoRequestIssue"
|
||||
| "PropertyRuleIssue";
|
||||
@@ -1259,6 +1274,7 @@ export namespace V8 {
|
||||
clientHintIssueDetails?: ClientHintIssueDetails | undefined;
|
||||
federatedAuthRequestIssueDetails?: FederatedAuthRequestIssueDetails | undefined;
|
||||
bounceTrackingIssueDetails?: BounceTrackingIssueDetails | undefined;
|
||||
cookieDeprecationMetadataIssueDetails?: CookieDeprecationMetadataIssueDetails | undefined;
|
||||
stylesheetLoadingIssueDetails?: StylesheetLoadingIssueDetails | undefined;
|
||||
propertyRuleIssueDetails?: PropertyRuleIssueDetails | undefined;
|
||||
federatedAuthUserInfoRequestIssueDetails?: FederatedAuthUserInfoRequestIssueDetails | undefined;
|
||||
@@ -1472,6 +1488,10 @@ export namespace V8 {
|
||||
* The filling strategy
|
||||
*/
|
||||
fillingStrategy: FillingStrategy;
|
||||
/**
|
||||
* The form field's DOM node
|
||||
*/
|
||||
fieldId: DOM.BackendNodeId;
|
||||
};
|
||||
/**
|
||||
* Emitted when an address form is filled.
|
||||
@@ -1703,6 +1723,7 @@ export namespace V8 {
|
||||
| "audioCapture"
|
||||
| "backgroundSync"
|
||||
| "backgroundFetch"
|
||||
| "capturedSurfaceControl"
|
||||
| "clipboardReadWrite"
|
||||
| "clipboardSanitizedWrite"
|
||||
| "displayCapture"
|
||||
@@ -1729,7 +1750,7 @@ export namespace V8 {
|
||||
export type PermissionSetting = "granted" | "denied" | "prompt";
|
||||
/**
|
||||
* Definition of PermissionDescriptor defined in the Permissions API:
|
||||
* https://w3c.github.io/permissions/#dictdef-permissiondescriptor.
|
||||
* https://w3c.github.io/permissions/#dom-permissiondescriptor.
|
||||
*/
|
||||
export type PermissionDescriptor = {
|
||||
/**
|
||||
@@ -3082,6 +3103,10 @@ export namespace V8 {
|
||||
* Font's family name reported by platform.
|
||||
*/
|
||||
familyName: string;
|
||||
/**
|
||||
* Font's PostScript name reported by platform.
|
||||
*/
|
||||
postScriptName: string;
|
||||
/**
|
||||
* Indicates if the font was downloaded or resolved locally.
|
||||
*/
|
||||
@@ -3212,6 +3237,28 @@ export namespace V8 {
|
||||
inherits: boolean;
|
||||
syntax: string;
|
||||
};
|
||||
/**
|
||||
* CSS font-palette-values rule representation.
|
||||
*/
|
||||
export type CSSFontPaletteValuesRule = {
|
||||
/**
|
||||
* The css style sheet identifier (absent for user agent stylesheet and user-specified
|
||||
* stylesheet rules) this rule came from.
|
||||
*/
|
||||
styleSheetId?: StyleSheetId | undefined;
|
||||
/**
|
||||
* Parent stylesheet's origin.
|
||||
*/
|
||||
origin: StyleSheetOrigin;
|
||||
/**
|
||||
* Associated font palette name.
|
||||
*/
|
||||
fontPaletteName: Value;
|
||||
/**
|
||||
* Associated style declaration.
|
||||
*/
|
||||
style: CSSStyle;
|
||||
};
|
||||
/**
|
||||
* CSS property at-rule representation.
|
||||
*/
|
||||
@@ -3335,6 +3382,12 @@ export namespace V8 {
|
||||
* Text position of a new rule in the target style sheet.
|
||||
*/
|
||||
location: SourceRange;
|
||||
/**
|
||||
* NodeId for the DOM node in whose context custom property declarations for registered properties should be
|
||||
* validated. If omitted, declarations in the new rule text can only be validated statically, which may produce
|
||||
* incorrect results if the declaration contains a var() for example.
|
||||
*/
|
||||
nodeForPropertySyntaxValidation?: DOM.NodeId | undefined;
|
||||
};
|
||||
/**
|
||||
* Inserts a new rule with the given `ruleText` in a stylesheet with given `styleSheetId`, at the
|
||||
@@ -3552,6 +3605,10 @@ export namespace V8 {
|
||||
* A list of CSS property registrations matching this node.
|
||||
*/
|
||||
cssPropertyRegistrations?: CSSPropertyRegistration[] | undefined;
|
||||
/**
|
||||
* A font-palette-values rule matching this node.
|
||||
*/
|
||||
cssFontPaletteValuesRule?: CSSFontPaletteValuesRule | undefined;
|
||||
/**
|
||||
* Id of the first parent element that does not have display: contents.
|
||||
*/
|
||||
@@ -3838,6 +3895,12 @@ export namespace V8 {
|
||||
*/
|
||||
export type SetStyleTextsRequest = {
|
||||
edits: StyleDeclarationEdit[];
|
||||
/**
|
||||
* NodeId for the DOM node in whose context custom property declarations for registered properties should be
|
||||
* validated. If omitted, declarations in the new rule text can only be validated statically, which may produce
|
||||
* incorrect results if the declaration contains a var() for example.
|
||||
*/
|
||||
nodeForPropertySyntaxValidation?: DOM.NodeId | undefined;
|
||||
};
|
||||
/**
|
||||
* Applies specified style edits one after another in the given order.
|
||||
@@ -6666,6 +6729,12 @@ export namespace V8 {
|
||||
*/
|
||||
maskLength: number;
|
||||
};
|
||||
export type DevicePosture = {
|
||||
/**
|
||||
* Current posture of the device
|
||||
*/
|
||||
type: "continuous" | "folded";
|
||||
};
|
||||
export type MediaFeature = {
|
||||
name: string;
|
||||
value: string;
|
||||
@@ -6706,6 +6775,44 @@ export namespace V8 {
|
||||
bitness?: string | undefined;
|
||||
wow64?: boolean | undefined;
|
||||
};
|
||||
/**
|
||||
* Used to specify sensor types to emulate.
|
||||
* See https://w3c.github.io/sensors/#automation for more information.
|
||||
*/
|
||||
export type SensorType =
|
||||
| "absolute-orientation"
|
||||
| "accelerometer"
|
||||
| "ambient-light"
|
||||
| "gravity"
|
||||
| "gyroscope"
|
||||
| "linear-acceleration"
|
||||
| "magnetometer"
|
||||
| "proximity"
|
||||
| "relative-orientation";
|
||||
export type SensorMetadata = {
|
||||
available?: boolean | undefined;
|
||||
minimumFrequency?: number | undefined;
|
||||
maximumFrequency?: number | undefined;
|
||||
};
|
||||
export type SensorReadingSingle = {
|
||||
value: number;
|
||||
};
|
||||
export type SensorReadingXYZ = {
|
||||
x: number;
|
||||
y: number;
|
||||
z: number;
|
||||
};
|
||||
export type SensorReadingQuaternion = {
|
||||
x: number;
|
||||
y: number;
|
||||
z: number;
|
||||
w: number;
|
||||
};
|
||||
export type SensorReading = {
|
||||
single?: SensorReadingSingle | undefined;
|
||||
xyz?: SensorReadingXYZ | undefined;
|
||||
quaternion?: SensorReadingQuaternion | undefined;
|
||||
};
|
||||
/**
|
||||
* Enum of image types that can be disabled.
|
||||
*/
|
||||
@@ -6886,6 +6993,11 @@ export namespace V8 {
|
||||
* is turned-off.
|
||||
*/
|
||||
displayFeature?: DisplayFeature | undefined;
|
||||
/**
|
||||
* If set, the posture of a foldable device. If not set the posture is set
|
||||
* to continuous.
|
||||
*/
|
||||
devicePosture?: DevicePosture | undefined;
|
||||
};
|
||||
/**
|
||||
* Overrides the values of device screen dimensions (window.screen.width, window.screen.height,
|
||||
@@ -7010,6 +7122,57 @@ export namespace V8 {
|
||||
* @response `Emulation.setGeolocationOverride`
|
||||
*/
|
||||
export type SetGeolocationOverrideResponse = {};
|
||||
/**
|
||||
* undefined
|
||||
* @request `Emulation.getOverriddenSensorInformation`
|
||||
*/
|
||||
export type GetOverriddenSensorInformationRequest = {
|
||||
type: SensorType;
|
||||
};
|
||||
/**
|
||||
* undefined
|
||||
* @response `Emulation.getOverriddenSensorInformation`
|
||||
*/
|
||||
export type GetOverriddenSensorInformationResponse = {
|
||||
requestedSamplingFrequency: number;
|
||||
};
|
||||
/**
|
||||
* Overrides a platform sensor of a given type. If |enabled| is true, calls to
|
||||
* Sensor.start() will use a virtual sensor as backend rather than fetching
|
||||
* data from a real hardware sensor. Otherwise, existing virtual
|
||||
* sensor-backend Sensor objects will fire an error event and new calls to
|
||||
* Sensor.start() will attempt to use a real sensor instead.
|
||||
* @request `Emulation.setSensorOverrideEnabled`
|
||||
*/
|
||||
export type SetSensorOverrideEnabledRequest = {
|
||||
enabled: boolean;
|
||||
type: SensorType;
|
||||
metadata?: SensorMetadata | undefined;
|
||||
};
|
||||
/**
|
||||
* Overrides a platform sensor of a given type. If |enabled| is true, calls to
|
||||
* Sensor.start() will use a virtual sensor as backend rather than fetching
|
||||
* data from a real hardware sensor. Otherwise, existing virtual
|
||||
* sensor-backend Sensor objects will fire an error event and new calls to
|
||||
* Sensor.start() will attempt to use a real sensor instead.
|
||||
* @response `Emulation.setSensorOverrideEnabled`
|
||||
*/
|
||||
export type SetSensorOverrideEnabledResponse = {};
|
||||
/**
|
||||
* Updates the sensor readings reported by a sensor type previously overriden
|
||||
* by setSensorOverrideEnabled.
|
||||
* @request `Emulation.setSensorOverrideReadings`
|
||||
*/
|
||||
export type SetSensorOverrideReadingsRequest = {
|
||||
type: SensorType;
|
||||
reading: SensorReading;
|
||||
};
|
||||
/**
|
||||
* Updates the sensor readings reported by a sensor type previously overriden
|
||||
* by setSensorOverrideEnabled.
|
||||
* @response `Emulation.setSensorOverrideReadings`
|
||||
*/
|
||||
export type SetSensorOverrideReadingsResponse = {};
|
||||
/**
|
||||
* Overrides the Idle state.
|
||||
* @request `Emulation.setIdleOverride`
|
||||
@@ -7231,7 +7394,7 @@ export namespace V8 {
|
||||
*/
|
||||
userAgent: string;
|
||||
/**
|
||||
* Browser langugage to emulate.
|
||||
* Browser language to emulate.
|
||||
*/
|
||||
acceptLanguage?: string | undefined;
|
||||
/**
|
||||
@@ -7313,9 +7476,13 @@ export namespace V8 {
|
||||
*/
|
||||
export type LoginState = "SignIn" | "SignUp";
|
||||
/**
|
||||
* Whether the dialog shown is an account chooser or an auto re-authentication dialog.
|
||||
* The types of FedCM dialogs.
|
||||
*/
|
||||
export type DialogType = "AccountChooser" | "AutoReauthn" | "ConfirmIdpLogin";
|
||||
export type DialogType = "AccountChooser" | "AutoReauthn" | "ConfirmIdpLogin" | "Error";
|
||||
/**
|
||||
* The buttons on the FedCM dialog.
|
||||
*/
|
||||
export type DialogButton = "ConfirmIdpLoginContinue" | "ErrorGotIt" | "ErrorMoreDetails";
|
||||
/**
|
||||
* Corresponds to IdentityRequestAccount
|
||||
*/
|
||||
@@ -7349,6 +7516,14 @@ export namespace V8 {
|
||||
title: string;
|
||||
subtitle?: string | undefined;
|
||||
};
|
||||
/**
|
||||
* Triggered when a dialog is closed, either by user action, JS abort,
|
||||
* or a command below.
|
||||
* @event `FedCm.dialogClosed`
|
||||
*/
|
||||
export type DialogClosedEvent = {
|
||||
dialogId: string;
|
||||
};
|
||||
/**
|
||||
* undefined
|
||||
* @request `FedCm.enable`
|
||||
@@ -7390,19 +7565,18 @@ export namespace V8 {
|
||||
*/
|
||||
export type SelectAccountResponse = {};
|
||||
/**
|
||||
* Only valid if the dialog type is ConfirmIdpLogin. Acts as if the user had
|
||||
* clicked the continue button.
|
||||
* @request `FedCm.confirmIdpLogin`
|
||||
* undefined
|
||||
* @request `FedCm.clickDialogButton`
|
||||
*/
|
||||
export type ConfirmIdpLoginRequest = {
|
||||
export type ClickDialogButtonRequest = {
|
||||
dialogId: string;
|
||||
dialogButton: DialogButton;
|
||||
};
|
||||
/**
|
||||
* Only valid if the dialog type is ConfirmIdpLogin. Acts as if the user had
|
||||
* clicked the continue button.
|
||||
* @response `FedCm.confirmIdpLogin`
|
||||
* undefined
|
||||
* @response `FedCm.clickDialogButton`
|
||||
*/
|
||||
export type ConfirmIdpLoginResponse = {};
|
||||
export type ClickDialogButtonResponse = {};
|
||||
/**
|
||||
* undefined
|
||||
* @request `FedCm.dismissDialog`
|
||||
@@ -9967,6 +10141,23 @@ export namespace V8 {
|
||||
*/
|
||||
outlineColor?: DOM.RGBA | undefined;
|
||||
};
|
||||
/**
|
||||
* Configuration for Window Controls Overlay
|
||||
*/
|
||||
export type WindowControlsOverlayConfig = {
|
||||
/**
|
||||
* Whether the title bar CSS should be shown when emulating the Window Controls Overlay.
|
||||
*/
|
||||
showCSS: boolean;
|
||||
/**
|
||||
* Seleted platforms to show the overlay.
|
||||
*/
|
||||
selectedPlatform: string;
|
||||
/**
|
||||
* The theme color defined in app manifest.
|
||||
*/
|
||||
themeColor: string;
|
||||
};
|
||||
export type ContainerQueryHighlightConfig = {
|
||||
/**
|
||||
* A descriptor for the highlight appearance of container query containers.
|
||||
@@ -10564,6 +10755,21 @@ export namespace V8 {
|
||||
* @response `Overlay.setShowIsolatedElements`
|
||||
*/
|
||||
export type SetShowIsolatedElementsResponse = {};
|
||||
/**
|
||||
* Show Window Controls Overlay for PWA
|
||||
* @request `Overlay.setShowWindowControlsOverlay`
|
||||
*/
|
||||
export type SetShowWindowControlsOverlayRequest = {
|
||||
/**
|
||||
* Window Controls Overlay data, null means hide Window Controls Overlay
|
||||
*/
|
||||
windowControlsOverlayConfig?: WindowControlsOverlayConfig | undefined;
|
||||
};
|
||||
/**
|
||||
* Show Window Controls Overlay for PWA
|
||||
* @response `Overlay.setShowWindowControlsOverlay`
|
||||
*/
|
||||
export type SetShowWindowControlsOverlayResponse = {};
|
||||
}
|
||||
export namespace Page {
|
||||
/**
|
||||
@@ -10622,6 +10828,7 @@ export namespace V8 {
|
||||
| "bluetooth"
|
||||
| "browsing-topics"
|
||||
| "camera"
|
||||
| "captured-surface-control"
|
||||
| "ch-dpr"
|
||||
| "ch-device-memory"
|
||||
| "ch-downlink"
|
||||
@@ -10677,6 +10884,7 @@ export namespace V8 {
|
||||
| "private-aggregation"
|
||||
| "private-state-token-issuance"
|
||||
| "private-state-token-redemption"
|
||||
| "publickey-credentials-create"
|
||||
| "publickey-credentials-get"
|
||||
| "run-ad-auction"
|
||||
| "screen-wake-lock"
|
||||
@@ -10686,10 +10894,13 @@ export namespace V8 {
|
||||
| "shared-storage-select-url"
|
||||
| "smart-card"
|
||||
| "storage-access"
|
||||
| "sub-apps"
|
||||
| "sync-xhr"
|
||||
| "unload"
|
||||
| "usb"
|
||||
| "usb-unrestricted"
|
||||
| "vertical-scroll"
|
||||
| "web-printing"
|
||||
| "web-share"
|
||||
| "window-management"
|
||||
| "window-placement"
|
||||
@@ -11307,6 +11518,9 @@ export namespace V8 {
|
||||
| "WebRTCSticky"
|
||||
| "WebTransportSticky"
|
||||
| "WebSocketSticky"
|
||||
| "SmartCard"
|
||||
| "LiveMediaStreamTrack"
|
||||
| "UnloadHandler"
|
||||
| "ContentSecurityHandler"
|
||||
| "ContentWebAuthenticationAPI"
|
||||
| "ContentFileChooser"
|
||||
@@ -11336,6 +11550,24 @@ export namespace V8 {
|
||||
* Types of not restored reasons for back-forward cache.
|
||||
*/
|
||||
export type BackForwardCacheNotRestoredReasonType = "SupportPending" | "PageSupportNeeded" | "Circumstantial";
|
||||
export type BackForwardCacheBlockingDetails = {
|
||||
/**
|
||||
* Url of the file where blockage happened. Optional because of tests.
|
||||
*/
|
||||
url?: string | undefined;
|
||||
/**
|
||||
* Function name where blockage happened. Optional because of anonymous functions and tests.
|
||||
*/
|
||||
function?: string | undefined;
|
||||
/**
|
||||
* Line number in the script (0-based).
|
||||
*/
|
||||
lineNumber: number;
|
||||
/**
|
||||
* Column number in the script (0-based).
|
||||
*/
|
||||
columnNumber: number;
|
||||
};
|
||||
export type BackForwardCacheNotRestoredExplanation = {
|
||||
/**
|
||||
* Type of the reason
|
||||
@@ -11351,6 +11583,7 @@ export namespace V8 {
|
||||
* - EmbedderExtensionSentMessageToCachedFrame: the extension ID.
|
||||
*/
|
||||
context?: string | undefined;
|
||||
details?: BackForwardCacheBlockingDetails[] | undefined;
|
||||
};
|
||||
export type BackForwardCacheNotRestoredExplanationTree = {
|
||||
/**
|
||||
@@ -12054,25 +12287,6 @@ export namespace V8 {
|
||||
*/
|
||||
adScriptId?: AdScriptId | undefined;
|
||||
};
|
||||
/**
|
||||
* Returns all browser cookies for the page and all of its subframes. Depending
|
||||
* on the backend support, will return detailed cookie information in the
|
||||
* `cookies` field.
|
||||
* @request `Page.getCookies`
|
||||
*/
|
||||
export type GetCookiesRequest = {};
|
||||
/**
|
||||
* Returns all browser cookies for the page and all of its subframes. Depending
|
||||
* on the backend support, will return detailed cookie information in the
|
||||
* `cookies` field.
|
||||
* @response `Page.getCookies`
|
||||
*/
|
||||
export type GetCookiesResponse = {
|
||||
/**
|
||||
* Array of cookie objects.
|
||||
*/
|
||||
cookies: Network.Cookie[];
|
||||
};
|
||||
/**
|
||||
* Returns present frame tree structure.
|
||||
* @request `Page.getFrameTree`
|
||||
@@ -12360,6 +12574,10 @@ export namespace V8 {
|
||||
* Whether or not to generate tagged (accessible) PDF. Defaults to embedder choice.
|
||||
*/
|
||||
generateTaggedPDF?: boolean | undefined;
|
||||
/**
|
||||
* Whether or not to embed the document outline into the PDF.
|
||||
*/
|
||||
generateDocumentOutline?: boolean | undefined;
|
||||
};
|
||||
/**
|
||||
* Print page as PDF.
|
||||
@@ -13313,7 +13531,6 @@ export namespace V8 {
|
||||
| "MemoryPressureOnTrigger"
|
||||
| "MemoryPressureAfterTriggered"
|
||||
| "PrerenderingDisabledByDevTools"
|
||||
| "ResourceLoadBlockedByClient"
|
||||
| "SpeculationRuleRemoved"
|
||||
| "ActivatedWithAuxiliaryBrowsingContexts"
|
||||
| "MaxNumOfRunningEagerPrerendersExceeded"
|
||||
@@ -13339,7 +13556,8 @@ export namespace V8 {
|
||||
| "PrefetchFailedNetError"
|
||||
| "PrefetchFailedNon2XX"
|
||||
| "PrefetchFailedPerPageLimitExceeded"
|
||||
| "PrefetchEvicted"
|
||||
| "PrefetchEvictedAfterCandidateRemoved"
|
||||
| "PrefetchEvictedForNewerPrefetch"
|
||||
| "PrefetchHeldback"
|
||||
| "PrefetchIneligibleRetryAfter"
|
||||
| "PrefetchIsPrivacyDecoy"
|
||||
@@ -13362,6 +13580,14 @@ export namespace V8 {
|
||||
| "PrefetchResponseUsed"
|
||||
| "PrefetchSuccessfulButNotUsed"
|
||||
| "PrefetchNotUsedProbeFailed";
|
||||
/**
|
||||
* Information of headers to be displayed when the header mismatch occurred.
|
||||
*/
|
||||
export type PrerenderMismatchedHeaders = {
|
||||
headerName: string;
|
||||
initialValue?: string | undefined;
|
||||
activationValue?: string | undefined;
|
||||
};
|
||||
/**
|
||||
* Upsert. Currently, it is only emitted when a rule set added.
|
||||
* @event `Preload.ruleSetUpdated`
|
||||
@@ -13415,6 +13641,7 @@ export namespace V8 {
|
||||
* that is incompatible with prerender and has caused the cancellation of the attempt.
|
||||
*/
|
||||
disallowedMojoInterface?: string | undefined;
|
||||
mismatchedHeaders?: PrerenderMismatchedHeaders[] | undefined;
|
||||
};
|
||||
/**
|
||||
* Send a list of sources for all preloading attempts in a document.
|
||||
@@ -13837,6 +14064,7 @@ export namespace V8 {
|
||||
scriptResponseTime?: number | undefined;
|
||||
controlledClients?: Target.TargetID[] | undefined;
|
||||
targetId?: Target.TargetID | undefined;
|
||||
routerRules?: string | undefined;
|
||||
};
|
||||
/**
|
||||
* ServiceWorker error message.
|
||||
@@ -14241,6 +14469,17 @@ export namespace V8 {
|
||||
key: string;
|
||||
values: string[];
|
||||
};
|
||||
export type AttributionReportingFilterConfig = {
|
||||
filterValues: AttributionReportingFilterDataEntry[];
|
||||
/**
|
||||
* duration in seconds
|
||||
*/
|
||||
lookbackWindow?: number | undefined;
|
||||
};
|
||||
export type AttributionReportingFilterPair = {
|
||||
filters: AttributionReportingFilterConfig[];
|
||||
notFilters: AttributionReportingFilterConfig[];
|
||||
};
|
||||
export type AttributionReportingAggregationKeysEntry = {
|
||||
key: string;
|
||||
value: UnsignedInt128AsBase16;
|
||||
@@ -14255,13 +14494,22 @@ export namespace V8 {
|
||||
*/
|
||||
ends: number[];
|
||||
};
|
||||
export type AttributionReportingTriggerSpec = {
|
||||
/**
|
||||
* number instead of integer because not all uint32 can be represented by
|
||||
* int
|
||||
*/
|
||||
triggerData: number[];
|
||||
eventReportWindows: AttributionReportingEventReportWindows;
|
||||
};
|
||||
export type AttributionReportingTriggerDataMatching = "exact" | "modulus";
|
||||
export type AttributionReportingSourceRegistration = {
|
||||
time: Network.TimeSinceEpoch;
|
||||
/**
|
||||
* duration in seconds
|
||||
*/
|
||||
expiry: number;
|
||||
eventReportWindows: AttributionReportingEventReportWindows;
|
||||
triggerSpecs: AttributionReportingTriggerSpec[];
|
||||
/**
|
||||
* duration in seconds
|
||||
*/
|
||||
@@ -14275,6 +14523,7 @@ export namespace V8 {
|
||||
filterData: AttributionReportingFilterDataEntry[];
|
||||
aggregationKeys: AttributionReportingAggregationKeysEntry[];
|
||||
debugKey?: UnsignedInt64AsBase10 | undefined;
|
||||
triggerDataMatching: AttributionReportingTriggerDataMatching;
|
||||
};
|
||||
export type AttributionReportingSourceRegistrationResult =
|
||||
| "success"
|
||||
@@ -14289,6 +14538,77 @@ export namespace V8 {
|
||||
| "destinationBothLimitsReached"
|
||||
| "reportingOriginsPerSiteLimitReached"
|
||||
| "exceedsMaxChannelCapacity";
|
||||
export type AttributionReportingSourceRegistrationTimeConfig = "include" | "exclude";
|
||||
export type AttributionReportingAggregatableValueEntry = {
|
||||
key: string;
|
||||
/**
|
||||
* number instead of integer because not all uint32 can be represented by
|
||||
* int
|
||||
*/
|
||||
value: number;
|
||||
};
|
||||
export type AttributionReportingEventTriggerData = {
|
||||
data: UnsignedInt64AsBase10;
|
||||
priority: SignedInt64AsBase10;
|
||||
dedupKey?: UnsignedInt64AsBase10 | undefined;
|
||||
filters: AttributionReportingFilterPair;
|
||||
};
|
||||
export type AttributionReportingAggregatableTriggerData = {
|
||||
keyPiece: UnsignedInt128AsBase16;
|
||||
sourceKeys: string[];
|
||||
filters: AttributionReportingFilterPair;
|
||||
};
|
||||
export type AttributionReportingAggregatableDedupKey = {
|
||||
dedupKey?: UnsignedInt64AsBase10 | undefined;
|
||||
filters: AttributionReportingFilterPair;
|
||||
};
|
||||
export type AttributionReportingTriggerRegistration = {
|
||||
filters: AttributionReportingFilterPair;
|
||||
debugKey?: UnsignedInt64AsBase10 | undefined;
|
||||
aggregatableDedupKeys: AttributionReportingAggregatableDedupKey[];
|
||||
eventTriggerData: AttributionReportingEventTriggerData[];
|
||||
aggregatableTriggerData: AttributionReportingAggregatableTriggerData[];
|
||||
aggregatableValues: AttributionReportingAggregatableValueEntry[];
|
||||
debugReporting: boolean;
|
||||
aggregationCoordinatorOrigin?: string | undefined;
|
||||
sourceRegistrationTimeConfig: AttributionReportingSourceRegistrationTimeConfig;
|
||||
triggerContextId?: string | undefined;
|
||||
};
|
||||
export type AttributionReportingEventLevelResult =
|
||||
| "success"
|
||||
| "successDroppedLowerPriority"
|
||||
| "internalError"
|
||||
| "noCapacityForAttributionDestination"
|
||||
| "noMatchingSources"
|
||||
| "deduplicated"
|
||||
| "excessiveAttributions"
|
||||
| "priorityTooLow"
|
||||
| "neverAttributedSource"
|
||||
| "excessiveReportingOrigins"
|
||||
| "noMatchingSourceFilterData"
|
||||
| "prohibitedByBrowserPolicy"
|
||||
| "noMatchingConfigurations"
|
||||
| "excessiveReports"
|
||||
| "falselyAttributedSource"
|
||||
| "reportWindowPassed"
|
||||
| "notRegistered"
|
||||
| "reportWindowNotStarted"
|
||||
| "noMatchingTriggerData";
|
||||
export type AttributionReportingAggregatableResult =
|
||||
| "success"
|
||||
| "internalError"
|
||||
| "noCapacityForAttributionDestination"
|
||||
| "noMatchingSources"
|
||||
| "excessiveAttributions"
|
||||
| "excessiveReportingOrigins"
|
||||
| "noHistograms"
|
||||
| "insufficientBudget"
|
||||
| "noMatchingSourceFilterData"
|
||||
| "notRegistered"
|
||||
| "prohibitedByBrowserPolicy"
|
||||
| "deduplicated"
|
||||
| "reportWindowPassed"
|
||||
| "excessiveReports";
|
||||
/**
|
||||
* A cache's contents have been modified.
|
||||
* @event `Storage.cacheStorageContentUpdated`
|
||||
@@ -14426,14 +14746,22 @@ export namespace V8 {
|
||||
bucketId: string;
|
||||
};
|
||||
/**
|
||||
* TODO(crbug.com/1458532): Add other Attribution Reporting events, e.g.
|
||||
* trigger registration.
|
||||
* undefined
|
||||
* @event `Storage.attributionReportingSourceRegistered`
|
||||
*/
|
||||
export type AttributionReportingSourceRegisteredEvent = {
|
||||
registration: AttributionReportingSourceRegistration;
|
||||
result: AttributionReportingSourceRegistrationResult;
|
||||
};
|
||||
/**
|
||||
* undefined
|
||||
* @event `Storage.attributionReportingTriggerRegistered`
|
||||
*/
|
||||
export type AttributionReportingTriggerRegisteredEvent = {
|
||||
registration: AttributionReportingTriggerRegistration;
|
||||
eventLevel: AttributionReportingEventLevelResult;
|
||||
aggregatable: AttributionReportingAggregatableResult;
|
||||
};
|
||||
/**
|
||||
* Returns a storage key given a frame id.
|
||||
* @request `Storage.getStorageKeyForFrame`
|
||||
@@ -16297,6 +16625,18 @@ export namespace V8 {
|
||||
* Defaults to false.
|
||||
*/
|
||||
isUserVerified?: boolean | undefined;
|
||||
/**
|
||||
* Credentials created by this authenticator will have the backup
|
||||
* eligibility (BE) flag set to this value. Defaults to false.
|
||||
* https://w3c.github.io/webauthn/#sctn-credential-backup
|
||||
*/
|
||||
defaultBackupEligibility?: boolean | undefined;
|
||||
/**
|
||||
* Credentials created by this authenticator will have the backup state
|
||||
* (BS) flag set to this value. Defaults to false.
|
||||
* https://w3c.github.io/webauthn/#sctn-credential-backup
|
||||
*/
|
||||
defaultBackupState?: boolean | undefined;
|
||||
};
|
||||
export type Credential = {
|
||||
credentialId: string;
|
||||
@@ -16569,6 +16909,7 @@ export namespace V8 {
|
||||
"DOMStorage.domStorageItemsCleared": DOMStorage.DomStorageItemsClearedEvent;
|
||||
"Emulation.virtualTimeBudgetExpired": Emulation.VirtualTimeBudgetExpiredEvent;
|
||||
"FedCm.dialogShown": FedCm.DialogShownEvent;
|
||||
"FedCm.dialogClosed": FedCm.DialogClosedEvent;
|
||||
"Fetch.requestPaused": Fetch.RequestPausedEvent;
|
||||
"Fetch.authRequired": Fetch.AuthRequiredEvent;
|
||||
"Input.dragIntercepted": Input.DragInterceptedEvent;
|
||||
@@ -16633,6 +16974,7 @@ export namespace V8 {
|
||||
"Storage.storageBucketCreatedOrUpdated": Storage.StorageBucketCreatedOrUpdatedEvent;
|
||||
"Storage.storageBucketDeleted": Storage.StorageBucketDeletedEvent;
|
||||
"Storage.attributionReportingSourceRegistered": Storage.AttributionReportingSourceRegisteredEvent;
|
||||
"Storage.attributionReportingTriggerRegistered": Storage.AttributionReportingTriggerRegisteredEvent;
|
||||
"Target.attachedToTarget": Target.AttachedToTargetEvent;
|
||||
"Target.detachedFromTarget": Target.DetachedFromTargetEvent;
|
||||
"Target.receivedMessageFromTarget": Target.ReceivedMessageFromTargetEvent;
|
||||
@@ -16845,6 +17187,9 @@ export namespace V8 {
|
||||
"Emulation.setEmulatedMedia": Emulation.SetEmulatedMediaRequest;
|
||||
"Emulation.setEmulatedVisionDeficiency": Emulation.SetEmulatedVisionDeficiencyRequest;
|
||||
"Emulation.setGeolocationOverride": Emulation.SetGeolocationOverrideRequest;
|
||||
"Emulation.getOverriddenSensorInformation": Emulation.GetOverriddenSensorInformationRequest;
|
||||
"Emulation.setSensorOverrideEnabled": Emulation.SetSensorOverrideEnabledRequest;
|
||||
"Emulation.setSensorOverrideReadings": Emulation.SetSensorOverrideReadingsRequest;
|
||||
"Emulation.setIdleOverride": Emulation.SetIdleOverrideRequest;
|
||||
"Emulation.clearIdleOverride": Emulation.ClearIdleOverrideRequest;
|
||||
"Emulation.setNavigatorOverrides": Emulation.SetNavigatorOverridesRequest;
|
||||
@@ -16865,7 +17210,7 @@ export namespace V8 {
|
||||
"FedCm.enable": FedCm.EnableRequest;
|
||||
"FedCm.disable": FedCm.DisableRequest;
|
||||
"FedCm.selectAccount": FedCm.SelectAccountRequest;
|
||||
"FedCm.confirmIdpLogin": FedCm.ConfirmIdpLoginRequest;
|
||||
"FedCm.clickDialogButton": FedCm.ClickDialogButtonRequest;
|
||||
"FedCm.dismissDialog": FedCm.DismissDialogRequest;
|
||||
"FedCm.resetCooldown": FedCm.ResetCooldownRequest;
|
||||
"Fetch.disable": Fetch.DisableRequest;
|
||||
@@ -16949,6 +17294,7 @@ export namespace V8 {
|
||||
"Overlay.setShowViewportSizeOnResize": Overlay.SetShowViewportSizeOnResizeRequest;
|
||||
"Overlay.setShowHinge": Overlay.SetShowHingeRequest;
|
||||
"Overlay.setShowIsolatedElements": Overlay.SetShowIsolatedElementsRequest;
|
||||
"Overlay.setShowWindowControlsOverlay": Overlay.SetShowWindowControlsOverlayRequest;
|
||||
"Page.addScriptToEvaluateOnLoad": Page.AddScriptToEvaluateOnLoadRequest;
|
||||
"Page.addScriptToEvaluateOnNewDocument": Page.AddScriptToEvaluateOnNewDocumentRequest;
|
||||
"Page.bringToFront": Page.BringToFrontRequest;
|
||||
@@ -16966,7 +17312,6 @@ export namespace V8 {
|
||||
"Page.getManifestIcons": Page.GetManifestIconsRequest;
|
||||
"Page.getAppId": Page.GetAppIdRequest;
|
||||
"Page.getAdScriptId": Page.GetAdScriptIdRequest;
|
||||
"Page.getCookies": Page.GetCookiesRequest;
|
||||
"Page.getFrameTree": Page.GetFrameTreeRequest;
|
||||
"Page.getLayoutMetrics": Page.GetLayoutMetricsRequest;
|
||||
"Page.getNavigationHistory": Page.GetNavigationHistoryRequest;
|
||||
@@ -17296,6 +17641,9 @@ export namespace V8 {
|
||||
"Emulation.setEmulatedMedia": Emulation.SetEmulatedMediaResponse;
|
||||
"Emulation.setEmulatedVisionDeficiency": Emulation.SetEmulatedVisionDeficiencyResponse;
|
||||
"Emulation.setGeolocationOverride": Emulation.SetGeolocationOverrideResponse;
|
||||
"Emulation.getOverriddenSensorInformation": Emulation.GetOverriddenSensorInformationResponse;
|
||||
"Emulation.setSensorOverrideEnabled": Emulation.SetSensorOverrideEnabledResponse;
|
||||
"Emulation.setSensorOverrideReadings": Emulation.SetSensorOverrideReadingsResponse;
|
||||
"Emulation.setIdleOverride": Emulation.SetIdleOverrideResponse;
|
||||
"Emulation.clearIdleOverride": Emulation.ClearIdleOverrideResponse;
|
||||
"Emulation.setNavigatorOverrides": Emulation.SetNavigatorOverridesResponse;
|
||||
@@ -17316,7 +17664,7 @@ export namespace V8 {
|
||||
"FedCm.enable": FedCm.EnableResponse;
|
||||
"FedCm.disable": FedCm.DisableResponse;
|
||||
"FedCm.selectAccount": FedCm.SelectAccountResponse;
|
||||
"FedCm.confirmIdpLogin": FedCm.ConfirmIdpLoginResponse;
|
||||
"FedCm.clickDialogButton": FedCm.ClickDialogButtonResponse;
|
||||
"FedCm.dismissDialog": FedCm.DismissDialogResponse;
|
||||
"FedCm.resetCooldown": FedCm.ResetCooldownResponse;
|
||||
"Fetch.disable": Fetch.DisableResponse;
|
||||
@@ -17400,6 +17748,7 @@ export namespace V8 {
|
||||
"Overlay.setShowViewportSizeOnResize": Overlay.SetShowViewportSizeOnResizeResponse;
|
||||
"Overlay.setShowHinge": Overlay.SetShowHingeResponse;
|
||||
"Overlay.setShowIsolatedElements": Overlay.SetShowIsolatedElementsResponse;
|
||||
"Overlay.setShowWindowControlsOverlay": Overlay.SetShowWindowControlsOverlayResponse;
|
||||
"Page.addScriptToEvaluateOnLoad": Page.AddScriptToEvaluateOnLoadResponse;
|
||||
"Page.addScriptToEvaluateOnNewDocument": Page.AddScriptToEvaluateOnNewDocumentResponse;
|
||||
"Page.bringToFront": Page.BringToFrontResponse;
|
||||
@@ -17417,7 +17766,6 @@ export namespace V8 {
|
||||
"Page.getManifestIcons": Page.GetManifestIconsResponse;
|
||||
"Page.getAppId": Page.GetAppIdResponse;
|
||||
"Page.getAdScriptId": Page.GetAdScriptIdResponse;
|
||||
"Page.getCookies": Page.GetCookiesResponse;
|
||||
"Page.getFrameTree": Page.GetFrameTreeResponse;
|
||||
"Page.getLayoutMetrics": Page.GetLayoutMetricsResponse;
|
||||
"Page.getNavigationHistory": Page.GetNavigationHistoryResponse;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
1
packages/bun-inspector-protocol/test/inspector/worker.js
Normal file
1
packages/bun-inspector-protocol/test/inspector/worker.js
Normal file
@@ -0,0 +1 @@
|
||||
console.log(process.execArgv);
|
||||
@@ -79,10 +79,7 @@
|
||||
"env": {
|
||||
"NAME": "Bun"
|
||||
},
|
||||
"args": [
|
||||
"--jsx-import-source",
|
||||
"src/middleware/jsx/jsx-dev-runtime"
|
||||
],
|
||||
"args": ["--jsx-import-source", "src/middleware/jsx/jsx-dev-runtime"],
|
||||
"path": "runtime_tests/bun/index.test.tsx"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1,41 +1,49 @@
|
||||
import * as action from "@actions/core";
|
||||
import { spawnSync } from "child_process";
|
||||
import { spawn, spawnSync } from "child_process";
|
||||
import { rmSync, writeFileSync, readFileSync } from "fs";
|
||||
import { readFile } from "fs/promises";
|
||||
import { readdirSync } from "node:fs";
|
||||
import { resolve, basename } from "node:path";
|
||||
import { totalmem } from "os";
|
||||
import { cpus, hostname, totalmem, userInfo } from "os";
|
||||
import { fileURLToPath } from "url";
|
||||
|
||||
const run_start = new Date();
|
||||
|
||||
const windows = process.platform === "win32";
|
||||
|
||||
const nativeMemory = totalmem();
|
||||
const BUN_JSC_forceRAMSizeNumber = parseInt(process.env["BUN_JSC_forceRAMSize"] || "0", 10);
|
||||
let BUN_JSC_forceRAMSize = Number(BigInt(nativeMemory) >> BigInt(2)) + "";
|
||||
if (!(Number.isSafeInteger(BUN_JSC_forceRAMSizeNumber) && BUN_JSC_forceRAMSizeNumber > 0)) {
|
||||
BUN_JSC_forceRAMSize = BUN_JSC_forceRAMSizeNumber + "";
|
||||
const force_ram_size_input = parseInt(process.env["BUN_JSC_forceRAMSize"] || "0", 10);
|
||||
let force_ram_size = Number(BigInt(nativeMemory) >> BigInt(2)) + "";
|
||||
if (!(Number.isSafeInteger(force_ram_size_input) && force_ram_size_input > 0)) {
|
||||
force_ram_size = force_ram_size_input + "";
|
||||
}
|
||||
|
||||
const cwd = resolve(fileURLToPath(import.meta.url), "../../../../");
|
||||
process.chdir(cwd);
|
||||
|
||||
const isAction = !!process.env["GITHUB_ACTION"];
|
||||
const ci = !!process.env["GITHUB_ACTIONS"];
|
||||
const enableProgressBar = !ci;
|
||||
|
||||
let testList = [];
|
||||
if (process.platform == "win32") {
|
||||
testList = readFileSync("test/windows-test-allowlist.txt", "utf8")
|
||||
.replaceAll("\r", "")
|
||||
.split("\n")
|
||||
.map(x => x.trim().replaceAll("/", "\\"))
|
||||
.filter(x => !!x && !x.startsWith("#"));
|
||||
function defaultConcurrency() {
|
||||
// Concurrency causes more flaky tests, only enable it by default on windows
|
||||
// See https://github.com/oven-sh/bun/issues/8071
|
||||
if (windows) {
|
||||
return Math.floor((cpus().length - 2) / 2);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
const run_concurrency = Math.max(Number(process.env["BUN_TEST_CONCURRENCY"] || defaultConcurrency(), 10), 1);
|
||||
|
||||
const extensions = [".js", ".ts", ".jsx", ".tsx"];
|
||||
|
||||
const git_sha =
|
||||
process.env["GITHUB_SHA"] ?? spawnSync("git", ["rev-parse", "HEAD"], { encoding: "utf-8" }).stdout.trim();
|
||||
|
||||
function isTest(path) {
|
||||
if (!basename(path).includes(".test.") || !extensions.some(ext => path.endsWith(ext))) {
|
||||
return false;
|
||||
}
|
||||
if (testList.length > 0) {
|
||||
return testList.some(testPattern => path.includes(testPattern));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -50,103 +58,368 @@ function* findTests(dir, query) {
|
||||
}
|
||||
}
|
||||
|
||||
var failingTests = [];
|
||||
|
||||
let bunExe = process.argv[2] ?? "bun";
|
||||
try {
|
||||
const { error } = spawnSync(bunExe, ["--revision"]);
|
||||
if (error) throw error;
|
||||
} catch {
|
||||
console.error(bunExe + " is not installed");
|
||||
// pick the last one, kind of a hack to allow 'bun run test bun-release' to test the release build
|
||||
let bunExe = (process.argv.length > 2 ? process.argv[process.argv.length - 1] : null) ?? "bun";
|
||||
const { error, stdout: revision_stdout } = spawnSync(bunExe, ["--revision"], {
|
||||
env: { ...process.env, BUN_DEBUG_QUIET_LOGS: 1 },
|
||||
});
|
||||
if (error) {
|
||||
if (error.code !== "ENOENT") throw error;
|
||||
console.error(`\x1b[31merror\x1b[0;2m:\x1b[0m Could not find Bun executable at '${bunExe}'`);
|
||||
process.exit(1);
|
||||
}
|
||||
const revision = revision_stdout.toString().trim();
|
||||
|
||||
const ntStatusPath = 'C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22621.0\\shared\\ntstatus.h';
|
||||
let ntStatusHCached = null;
|
||||
const { error: error2, stdout: argv0_stdout } = spawnSync(bunExe, ["-e", "console.log(process.argv[0])"], {
|
||||
env: { ...process.env, BUN_DEBUG_QUIET_LOGS: 1 },
|
||||
});
|
||||
if (error2) throw error2;
|
||||
const argv0 = argv0_stdout.toString().trim();
|
||||
|
||||
console.log(`Testing ${argv0} v${revision}`);
|
||||
|
||||
const ntStatusPath = "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.22621.0\\shared\\ntstatus.h";
|
||||
let ntstatus_header_cache = null;
|
||||
function lookupWindowsError(code) {
|
||||
if (ntStatusHCached === null) {
|
||||
if (ntstatus_header_cache === null) {
|
||||
try {
|
||||
ntStatusHCached = readFileSync(ntStatusPath, 'utf-8');
|
||||
ntstatus_header_cache = readFileSync(ntStatusPath, "utf-8");
|
||||
} catch {
|
||||
console.error(`could not find ntstatus.h to lookup error code: ${ntStatusPath}`);
|
||||
ntStatusHCached = '';
|
||||
ntstatus_header_cache = "";
|
||||
}
|
||||
}
|
||||
const match = ntStatusHCached.match(new RegExp(`(STATUS_\\w+).*0x${code.toString(16)}`, 'i'));
|
||||
const match = ntstatus_header_cache.match(new RegExp(`(STATUS_\\w+).*0x${code.toString(16)}`, "i"));
|
||||
if (match) {
|
||||
return match[1];
|
||||
}
|
||||
return `unknown`;
|
||||
return null;
|
||||
}
|
||||
|
||||
const failing_tests = [];
|
||||
const passing_tests = [];
|
||||
const fixes = [];
|
||||
const regressions = [];
|
||||
|
||||
async function runTest(path) {
|
||||
const name = path.replace(cwd, "").slice(1);
|
||||
try {
|
||||
var {
|
||||
stdout,
|
||||
stderr,
|
||||
status: exitCode,
|
||||
signal,
|
||||
error: timedOut,
|
||||
} = spawnSync(bunExe, ["test", resolve(path)], {
|
||||
stdio: "inherit",
|
||||
let exitCode, signal, err, output;
|
||||
|
||||
const expected_crash_reason = windows
|
||||
? await readFile(resolve(path), "utf-8").then(data => {
|
||||
const match = data.match(/@known-failing-on-windows:(.*)\n/);
|
||||
return match ? match[1].trim() : null;
|
||||
})
|
||||
: null;
|
||||
|
||||
const start = Date.now();
|
||||
|
||||
await new Promise((done, reject) => {
|
||||
const proc = spawn(bunExe, ["test", resolve(path)], {
|
||||
stdio: ["ignore", "pipe", "pipe"],
|
||||
timeout: 1000 * 60 * 3,
|
||||
env: {
|
||||
...process.env,
|
||||
FORCE_COLOR: "1",
|
||||
BUN_GARBAGE_COLLECTOR_LEVEL: "1",
|
||||
BUN_JSC_forceRAMSize,
|
||||
BUN_JSC_forceRAMSize: force_ram_size,
|
||||
BUN_RUNTIME_TRANSPILER_CACHE_PATH: "0",
|
||||
// reproduce CI results locally
|
||||
GITHUB_ACTION: process.env.GITHUB_ACTION ?? "true",
|
||||
GITHUB_ACTIONS: process.env.GITHUB_ACTIONS ?? "true",
|
||||
BUN_DEBUG_QUIET_LOGS: "1",
|
||||
},
|
||||
});
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
|
||||
if(signal) {
|
||||
console.error(`Test ${name} was killed by signal ${signal}`);
|
||||
}
|
||||
const chunks = [];
|
||||
proc.stdout.on("data", chunk => {
|
||||
chunks.push(chunk);
|
||||
if (run_concurrency === 1) process.stdout.write(chunk);
|
||||
});
|
||||
proc.stderr.on("data", chunk => {
|
||||
chunks.push(chunk);
|
||||
if (run_concurrency === 1) process.stderr.write(chunk);
|
||||
});
|
||||
|
||||
if(process.platform === 'win32' && exitCode > 256) {
|
||||
console.error(`Test ${name} crashed with exit code ${exitCode.toString(16)} (${lookupWindowsError(exitCode)})`);
|
||||
}
|
||||
proc.on("exit", (code_, signal_) => {
|
||||
exitCode = code_;
|
||||
signal = signal_;
|
||||
output = Buffer.concat(chunks).toString();
|
||||
done();
|
||||
});
|
||||
proc.on("error", err_ => {
|
||||
err = err_;
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
const passed = exitCode === 0 && !timedOut;
|
||||
const passed = exitCode === 0 && !err && !signal;
|
||||
|
||||
let reason = "";
|
||||
if (!passed) {
|
||||
failingTests.push(name);
|
||||
if (timedOut) console.error(timedOut);
|
||||
}
|
||||
}
|
||||
|
||||
var tests = [];
|
||||
var testFileNames = [];
|
||||
for (const path of findTests(resolve(cwd, "test"))) {
|
||||
testFileNames.push(path);
|
||||
tests.push(runTest(path).catch(console.error));
|
||||
}
|
||||
await Promise.allSettled(tests);
|
||||
|
||||
rmSync("failing-tests.txt", { force: true });
|
||||
|
||||
if (isAction) {
|
||||
if (failingTests.length > 0) {
|
||||
action.setFailed(`${failingTests.length} files with failing tests`);
|
||||
}
|
||||
action.setOutput("failing_tests", failingTests.map(a => `- \`${a}\``).join("\n"));
|
||||
action.setOutput("failing_tests_count", failingTests.length);
|
||||
action.summary.addHeading(`${tests.length} files with tests ran`).addList(testFileNames);
|
||||
await action.summary.write();
|
||||
} else {
|
||||
if (failingTests.length > 0) {
|
||||
console.log(`${failingTests.length} files with failing tests:`);
|
||||
for (const test of failingTests) {
|
||||
console.log(`- ${resolve(test)}`);
|
||||
let match;
|
||||
if (err && err.message.includes("timed")) {
|
||||
reason = "hang";
|
||||
} else if ((match = output && output.match(/thread \d+ panic: (.*)\n/))) {
|
||||
reason = 'panic "' + match[1] + '"';
|
||||
} else if (err) {
|
||||
reason = (err.name || "Error") + ": " + err.message;
|
||||
} else if (signal) {
|
||||
reason = signal;
|
||||
} else if (exitCode === 1) {
|
||||
const failMatch = output.match(/\x1b\[31m\s(\d+) fail/);
|
||||
if (failMatch) {
|
||||
reason = failMatch[1] + " failing";
|
||||
} else {
|
||||
reason = "code 1";
|
||||
}
|
||||
} else {
|
||||
const x = windows && lookupWindowsError(exitCode);
|
||||
if (x) {
|
||||
if (x === "STATUS_BREAKPOINT") {
|
||||
if (output.includes("Segmentation fault at address")) {
|
||||
reason = "STATUS_ACCESS_VIOLATION";
|
||||
}
|
||||
}
|
||||
reason = x;
|
||||
} else {
|
||||
reason = "code " + exitCode;
|
||||
}
|
||||
}
|
||||
}
|
||||
writeFileSync("failing-tests.txt", failingTests.join("\n"));
|
||||
|
||||
const duration = (Date.now() - start) / 1000;
|
||||
|
||||
if (run_concurrency !== 1 && enableProgressBar) {
|
||||
// clear line
|
||||
process.stdout.write("\x1b[2K\r");
|
||||
}
|
||||
|
||||
console.log(
|
||||
`\x1b[2m${formatTime(duration).padStart(6, " ")}\x1b[0m ${passed ? "\x1b[32m✔" : expected_crash_reason ? "\x1b[33m⚠" : "\x1b[31m✖"
|
||||
} ${name}\x1b[0m${reason ? ` (${reason})` : ""}`,
|
||||
);
|
||||
|
||||
finished++;
|
||||
|
||||
if (run_concurrency !== 1 && enableProgressBar) {
|
||||
writeProgressBar();
|
||||
}
|
||||
|
||||
if (run_concurrency > 1 && ci) {
|
||||
process.stderr.write(output);
|
||||
}
|
||||
|
||||
if (!passed) {
|
||||
if (reason) {
|
||||
if (windows && !expected_crash_reason) {
|
||||
regressions.push({ path: name, reason, output });
|
||||
}
|
||||
}
|
||||
|
||||
failing_tests.push({ path: name, reason, output, expected_crash_reason });
|
||||
if (err) console.error(err);
|
||||
} else {
|
||||
if (windows && expected_crash_reason !== null) {
|
||||
fixes.push({ path: name, output, expected_crash_reason });
|
||||
}
|
||||
|
||||
passing_tests.push(name);
|
||||
}
|
||||
}
|
||||
|
||||
process.exit(Math.min(failingTests.length, 127));
|
||||
const queue = [...findTests(resolve(cwd, "test"))];
|
||||
let running = 0;
|
||||
let total = queue.length;
|
||||
let finished = 0;
|
||||
let on_entry_finish = null;
|
||||
|
||||
function writeProgressBar() {
|
||||
const barWidth = Math.min(process.stdout.columns || 40, 80) - 2;
|
||||
const percent = (finished / total) * 100;
|
||||
const bar = "=".repeat(Math.floor(percent / 2));
|
||||
const str1 = `[${finished}/${total}] [${bar}`;
|
||||
process.stdout.write(`\r${str1}${" ".repeat(barWidth - str1.length)}]`);
|
||||
}
|
||||
|
||||
while (queue.length > 0) {
|
||||
if (running >= run_concurrency) {
|
||||
await new Promise(resolve => (on_entry_finish = resolve));
|
||||
continue;
|
||||
}
|
||||
|
||||
const path = queue.shift();
|
||||
running++;
|
||||
runTest(path)
|
||||
.catch(e => {
|
||||
console.error("Bug in bun-internal-test");
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
})
|
||||
.finally(() => {
|
||||
running--;
|
||||
if (on_entry_finish) {
|
||||
on_entry_finish();
|
||||
on_entry_finish = null;
|
||||
}
|
||||
});
|
||||
}
|
||||
while (running > 0) {
|
||||
await Promise.race([
|
||||
new Promise(resolve => (on_entry_finish = resolve)),
|
||||
new Promise(resolve => setTimeout(resolve, 1000)),
|
||||
]);
|
||||
}
|
||||
console.log("\n");
|
||||
|
||||
function linkToGH(linkTo) {
|
||||
return `https://github.com/oven-sh/bun/blob/${git_sha}/${linkTo}`;
|
||||
}
|
||||
|
||||
function sectionLink(linkTo) {
|
||||
return "#" + linkTo.replace(/[^a-zA-Z0-9_-]/g, "").toLowerCase();
|
||||
}
|
||||
|
||||
const failingTestDisplay = failing_tests
|
||||
.filter(({ reason }) => !regressions.some(({ path }) => path === path))
|
||||
.map(({ path, reason }) => `- [\`${path}\`](${sectionLink(path)})${reason ? ` ${reason}` : ""}`)
|
||||
.join("\n");
|
||||
// const passingTestDisplay = passing_tests.map(path => `- \`${path}\``).join("\n");
|
||||
|
||||
rmSync("report.md", { force: true });
|
||||
|
||||
const uptime = process.uptime();
|
||||
|
||||
function formatTime(seconds) {
|
||||
if (seconds < 60) {
|
||||
return seconds.toFixed(1) + "s";
|
||||
} else if (seconds < 60 * 60) {
|
||||
return (seconds / 60).toFixed(0) + "m " + formatTime(seconds % 60);
|
||||
} else {
|
||||
return (seconds / 60 / 60).toFixed(0) + "h " + formatTime(seconds % (60 * 60));
|
||||
}
|
||||
}
|
||||
|
||||
const header = `
|
||||
host: ${process.env["GITHUB_RUN_ID"] ? "GitHub Actions: " : ""}${userInfo().username}@${hostname()}
|
||||
platform: ${process.platform} ${process.arch}
|
||||
bun: ${argv0}
|
||||
version: v${revision}
|
||||
|
||||
date: ${run_start.toISOString()}
|
||||
duration: ${formatTime(uptime)}
|
||||
|
||||
total: ${total} files
|
||||
failing: ${failing_tests.length} files
|
||||
passing: ${passing_tests.length} files
|
||||
|
||||
percent: ${((passing_tests.length / total) * 100).toFixed(2)}%
|
||||
`.trim();
|
||||
|
||||
console.log("\n" + "-".repeat(Math.min(process.stdout.columns || 40, 80)) + "\n");
|
||||
console.log(header);
|
||||
console.log("\n" + "-".repeat(Math.min(process.stdout.columns || 40, 80)) + "\n");
|
||||
|
||||
let report = `# bun test on ${process.env["GITHUB_REF"] ??
|
||||
spawnSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], { encoding: "utf-8" }).stdout.trim()
|
||||
}
|
||||
|
||||
\`\`\`
|
||||
${header}
|
||||
\`\`\`
|
||||
|
||||
`;
|
||||
|
||||
if (fixes.length > 0) {
|
||||
report += `## Fixes\n\n`;
|
||||
report += "The following tests had @known-failing-on-windows but now pass:\n\n";
|
||||
report += fixes
|
||||
.map(
|
||||
({ path, expected_crash_reason }) => `- [\`${path}\`](${sectionLink(path)}) (before: ${expected_crash_reason})`,
|
||||
)
|
||||
.join("\n");
|
||||
report += "\n\n";
|
||||
}
|
||||
|
||||
if (regressions.length > 0) {
|
||||
report += `## Regressions\n\n`;
|
||||
report += regressions
|
||||
.map(
|
||||
({ path, reason, expected_crash_reason }) =>
|
||||
`- [\`${path}\`](${sectionLink(path)}) ${reason}${expected_crash_reason ? ` (expected: ${expected_crash_reason})` : ""
|
||||
}`,
|
||||
)
|
||||
.join("\n");
|
||||
report += "\n\n";
|
||||
}
|
||||
|
||||
if (failingTestDisplay.length > 0) {
|
||||
report += `## ${windows ? "Known " : ""}Failing tests\n\n`;
|
||||
report += failingTestDisplay;
|
||||
report += "\n\n";
|
||||
}
|
||||
|
||||
// if(passingTestDisplay.length > 0) {
|
||||
// report += `## Passing tests\n\n`;
|
||||
// report += passingTestDisplay;
|
||||
// report += "\n\n";
|
||||
// }
|
||||
|
||||
if (failing_tests.length) {
|
||||
report += `## Failing tests log output\n\n`;
|
||||
for (const { path, output, reason, expected_crash_reason } of failing_tests) {
|
||||
report += `### ${path}\n\n`;
|
||||
report += "[Link to file](" + linkToGH(path) + ")\n\n";
|
||||
if (windows && reason !== expected_crash_reason) {
|
||||
report += `To mark this as a known failing test, add this to the start of the file:\n`;
|
||||
report += `\`\`\`ts\n`;
|
||||
report += `// @known-failing-on-windows: ${reason}\n`;
|
||||
report += `\`\`\`\n\n`;
|
||||
} else {
|
||||
report += `${reason}\n\n`;
|
||||
}
|
||||
report += "```\n";
|
||||
report += output
|
||||
.replace(/\x1b\[[0-9;]*m/g, "")
|
||||
.replace(/^::(group|endgroup|error|warning|set-output|add-matcher|remove-matcher).*$/gm, "");
|
||||
report += "```\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
writeFileSync("test-report.md", report);
|
||||
writeFileSync(
|
||||
"test-report.json",
|
||||
JSON.stringify({
|
||||
failing_tests,
|
||||
passing_tests,
|
||||
fixes,
|
||||
regressions,
|
||||
}),
|
||||
);
|
||||
|
||||
console.log("-> test-report.md, test-report.json");
|
||||
|
||||
if (ci) {
|
||||
if (windows) {
|
||||
action.setOutput("regressing_tests", regressions.map(({ path }) => `- \`${path}\``).join("\n"));
|
||||
action.setOutput("regressing_test_count", regressions.length);
|
||||
}
|
||||
if (failing_tests.length > 0) {
|
||||
action.setFailed(`${failing_tests.length} files with failing tests`);
|
||||
}
|
||||
action.setOutput("failing_tests", failingTestDisplay);
|
||||
action.setOutput("failing_tests_count", failing_tests.length);
|
||||
let truncated_report = report;
|
||||
if (truncated_report.length > 512 * 1000) {
|
||||
truncated_report = truncated_report.slice(0, 512 * 1000) + "\n\n...truncated...";
|
||||
}
|
||||
action.summary.addRaw(truncated_report);
|
||||
await action.summary.write();
|
||||
} else {
|
||||
if (windows && (regressions.length > 0 || fixes.length > 0)) {
|
||||
console.log(
|
||||
"\n\x1b[34mnote\x1b[0;2m:\x1b[0m If you would like to update the @known-failing-on-windows annotations, run `bun update-known-failures`",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
process.exit(failing_tests.length ? 1 : 0);
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
import assert from "assert";
|
||||
import { existsSync, readFileSync, writeFileSync } from "fs";
|
||||
import { join } from "path";
|
||||
import { fileURLToPath } from "url";
|
||||
|
||||
if (process.platform !== "win32") {
|
||||
console.log("This script is only intended to be run on Windows.");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
process.chdir(join(fileURLToPath(import.meta.url), "../../../../"));
|
||||
|
||||
if (!existsSync("test-report.json")) {
|
||||
console.log("No test report found. Please run `bun run test` first.");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const test_report = JSON.parse(readFileSync("test-report.json", "utf8"));
|
||||
assert(Array.isArray(test_report.failing_tests));
|
||||
|
||||
for (const { path, reason, expected_crash_reason } of test_report.failing_tests) {
|
||||
assert(path);
|
||||
assert(reason);
|
||||
|
||||
if (expected_crash_reason !== reason) {
|
||||
const old_content = readFileSync(path, "utf8");
|
||||
if (!old_content.includes("// @known-failing-on-windows")) {
|
||||
let content = old_content.replace(/\/\/\s*@known-failing-on-windows:.*\n/, "");
|
||||
if (reason) {
|
||||
content = `// @known-failing-on-windows: ${reason}\n` + content;
|
||||
}
|
||||
writeFileSync(path, content, "utf8");
|
||||
console.log(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const { path } of test_report.fixes) {
|
||||
assert(path);
|
||||
|
||||
const old_content = readFileSync(path, "utf8");
|
||||
|
||||
let content = old_content.replace(/\/\/\s*@known-failing-on-windows:.*\n/, "");
|
||||
|
||||
if (content !== old_content) {
|
||||
writeFileSync(path, content, "utf8");
|
||||
console.log(path);
|
||||
}
|
||||
}
|
||||
@@ -279,7 +279,7 @@ async function sendResponse(response: unknown): Promise<void> {
|
||||
}
|
||||
await fetch(`runtime/invocation/${requestId}/response`, {
|
||||
method: "POST",
|
||||
body: response === null ? null : (typeof response === 'string' ? response : JSON.stringify(response)),
|
||||
body: response === null ? null : typeof response === "string" ? response : JSON.stringify(response),
|
||||
});
|
||||
}
|
||||
|
||||
@@ -594,8 +594,8 @@ class LambdaServer implements Server {
|
||||
typeof options.port === "number"
|
||||
? options.port
|
||||
: typeof options.port === "string"
|
||||
? parseInt(options.port)
|
||||
: this.port;
|
||||
? parseInt(options.port)
|
||||
: this.port;
|
||||
this.hostname = options.hostname ?? this.hostname;
|
||||
this.development = options.development ?? this.development;
|
||||
}
|
||||
|
||||
@@ -87,12 +87,13 @@ export class BuildCommand extends Command {
|
||||
this.log("Saving...", output);
|
||||
const archiveBuffer = await archive
|
||||
.generateAsync({
|
||||
type: 'blob',
|
||||
type: "blob",
|
||||
compression: "DEFLATE",
|
||||
compressionOptions: {
|
||||
level: 9,
|
||||
},
|
||||
}).then(blob => blob.arrayBuffer());
|
||||
})
|
||||
.then(blob => blob.arrayBuffer());
|
||||
writeFileSync(output, archiveBuffer);
|
||||
this.log("Saved");
|
||||
}
|
||||
|
||||
@@ -32,54 +32,60 @@ export class PublishCommand extends BuildCommand {
|
||||
}
|
||||
const { layer, region, arch, output, public: isPublic } = flags;
|
||||
if (region.includes("*")) {
|
||||
// prettier-ignore
|
||||
const result = this.#aws([
|
||||
"ec2",
|
||||
"describe-regions",
|
||||
"--query", "Regions[].RegionName",
|
||||
"--output", "json"
|
||||
]);
|
||||
// biome-ignore: format ignore
|
||||
const result = this.#aws(["ec2", "describe-regions", "--query", "Regions[].RegionName", "--output", "json"]);
|
||||
region.length = 0;
|
||||
for (const name of JSON.parse(result)) {
|
||||
region.push(name);
|
||||
}
|
||||
} else if (!region.length) {
|
||||
// prettier-ignore
|
||||
region.push(this.#aws([
|
||||
"configure",
|
||||
"get",
|
||||
"region"
|
||||
]));
|
||||
// biome-ignore: format ignore
|
||||
region.push(this.#aws(["configure", "get", "region"]));
|
||||
}
|
||||
this.log("Publishing...");
|
||||
for (const regionName of region) {
|
||||
for (const layerName of layer) {
|
||||
// prettier-ignore
|
||||
// biome-ignore: format ignore
|
||||
const result = this.#aws([
|
||||
"lambda",
|
||||
"publish-layer-version",
|
||||
"--layer-name", layerName,
|
||||
"--region", regionName,
|
||||
"--description", "Bun is an incredibly fast JavaScript runtime, bundler, transpiler, and package manager.",
|
||||
"--license-info", "MIT",
|
||||
"--compatible-architectures", arch === "x64" ? "x86_64" : "arm64",
|
||||
"--compatible-runtimes", "provided.al2", "provided",
|
||||
"--zip-file", `fileb://${output}`,
|
||||
"--output", "json",
|
||||
"--layer-name",
|
||||
layerName,
|
||||
"--region",
|
||||
regionName,
|
||||
"--description",
|
||||
"Bun is an incredibly fast JavaScript runtime, bundler, transpiler, and package manager.",
|
||||
"--license-info",
|
||||
"MIT",
|
||||
"--compatible-architectures",
|
||||
arch === "x64" ? "x86_64" : "arm64",
|
||||
"--compatible-runtimes",
|
||||
"provided.al2",
|
||||
"provided",
|
||||
"--zip-file",
|
||||
`fileb://${output}`,
|
||||
"--output",
|
||||
"json",
|
||||
]);
|
||||
const { LayerVersionArn } = JSON.parse(result);
|
||||
this.log("Published", LayerVersionArn);
|
||||
if (isPublic) {
|
||||
// prettier-ignore
|
||||
// biome-ignore: format ignore
|
||||
this.#aws([
|
||||
"lambda",
|
||||
"add-layer-version-permission",
|
||||
"--layer-name", layerName,
|
||||
"--region", regionName,
|
||||
"--version-number", LayerVersionArn.split(":").pop(),
|
||||
"--statement-id", `${layerName}-public`,
|
||||
"--action", "lambda:GetLayerVersion",
|
||||
"--principal", "*",
|
||||
"--layer-name",
|
||||
layerName,
|
||||
"--region",
|
||||
regionName,
|
||||
"--version-number",
|
||||
LayerVersionArn.split(":").pop(),
|
||||
"--statement-id",
|
||||
`${layerName}-public`,
|
||||
"--action",
|
||||
"lambda:GetLayerVersion",
|
||||
"--principal",
|
||||
"*",
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -359,7 +359,7 @@ export const spawnSync = ((...args): SyncSubprocess => {
|
||||
}
|
||||
let input: ArrayBufferView | string | undefined;
|
||||
if (opts.stdio[0] && typeof opts.stdio[0] !== 'string') {
|
||||
stdio[0] = null; // will be overriden by chp.spawnSync "input" option
|
||||
stdio[0] = null; // will be overridden by chp.spawnSync "input" option
|
||||
//! Due to the fully async nature of Blobs, Responses and Requests,
|
||||
//! we can't synchronously get the data out of them here in userland.
|
||||
if (opts.stdio[0] instanceof Blob) throw new NotImplementedError('Bun.spawnSync({ stdin: <Blob> })', spawnSync);
|
||||
|
||||
@@ -32,9 +32,7 @@ for (const asset of release.assets) {
|
||||
const url = asset.browser_download_url;
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) {
|
||||
throw new Error(
|
||||
`Failed to download asset: ${response.status} ${url}`
|
||||
);
|
||||
throw new Error(`Failed to download asset: ${response.status} ${url}`);
|
||||
}
|
||||
const name = asset.name;
|
||||
let contentType: string;
|
||||
@@ -86,9 +84,7 @@ async function uploadToS3({
|
||||
headers,
|
||||
});
|
||||
if (!response.ok) {
|
||||
throw new Error(
|
||||
`Failed to upload to S3: ${response.status} ${response.statusText}`
|
||||
);
|
||||
throw new Error(`Failed to upload to S3: ${response.status} ${response.statusText}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"arrowParens": "avoid",
|
||||
"printWidth": 80,
|
||||
"trailingComma": "all",
|
||||
"useTabs": false
|
||||
}
|
||||
789
packages/bun-types/bun.d.ts
vendored
789
packages/bun-types/bun.d.ts
vendored
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user