Compare commits

...

125 Commits

Author SHA1 Message Date
Ben Grant
23dc0fed71 Test that threadsafe function finalizers run on the next tick 2024-10-04 15:24:01 -07:00
Ben Grant
afcf7b1eb6 Route all finalizers through NapiFinalizer 2024-10-04 15:23:23 -07:00
Ben Grant
2583f33a33 Make NAPI tests allocate in the finalizer 2024-10-04 11:08:37 -07:00
Ben Grant
dfa2a6b60b Fix tsfn finalizers 2024-10-03 18:48:25 -07:00
Ben Grant
e66ec2a10b Merge branch 'main' into jarred/napi-2 2024-10-03 17:56:38 -07:00
dave caruso
adc86c773b chore: rename kit -> bake (#14335) 2024-10-03 15:34:53 -07:00
Dylan Conway
15427134e1 update 2024-10-03 15:11:44 -07:00
Dylan Conway
808e58cc4d update 2024-10-03 14:50:23 -07:00
Eric Liu
a375ea94ef docs: fix typo in bun publish (#14334) 2024-10-03 14:03:30 -07:00
Dylan Conway
39b1c0111e add docs for bun publish (#14327) 2024-10-03 03:41:11 -07:00
Jarred Sumner
eda608d629 Tweak how we do symbol versioning for glibc (#14272) 2024-10-03 02:42:28 -07:00
Meghan Denny
9446fd60c9 fix Buffer method aliases not being equal to each other (#14198) 2024-10-03 02:31:23 -07:00
Meghan Denny
8e5255d753 node:stream: fix setDefaultHighWaterMark (#14305) 2024-10-03 02:15:39 -07:00
Meghan Denny
13ca4544f2 enhance INVALID_ARG_TYPE and cleanup some node:buffer error handling (#14200) 2024-10-03 02:13:14 -07:00
Jarred Sumner
4d4dd1c180 Refactor node:module (#14227) 2024-10-03 00:54:56 -07:00
dave caruso
dd6554294e bake: release to canary only (#14258)
Co-authored-by: paperdave <paperdave@users.noreply.github.com>
2024-10-03 00:52:14 -07:00
Dylan Conway
50ed09654f publish help text 2024-10-02 22:57:34 -07:00
190n
0a54c24bd3 Allow throwing exceptions from napi_async_complete_callback (#14302)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: Jarred-Sumner <Jarred-Sumner@users.noreply.github.com>
2024-10-02 22:35:45 -07:00
versecafe
b39f49a5b9 remove bun pack in favor of bun pm pack (#14319) 2024-10-02 22:32:42 -07:00
snwy
e8fec640d8 hoisting of exports when there is top level using (#14313) 2024-10-02 22:32:04 -07:00
Ciro Spaciari
25abe67d43 update root certificates to NSS 3.104 (#14276) 2024-10-02 22:29:32 -07:00
Jarred Sumner
5f135a21b3 Update writing.md 2024-10-02 22:28:14 -07:00
Jarred Sumner
b88ed18245 On test timeout, kill any spawned processes (#14310) 2024-10-02 20:55:59 -07:00
Dylan Conway
f374ae6db1 add bun publish (#14215) 2024-10-02 20:47:22 -07:00
Jarred Sumner
94a656bc4f Support bundling .node files in ESM & CJS when targeting Node.js (#14294)
Co-authored-by: Jarred-Sumner <Jarred-Sumner@users.noreply.github.com>
2024-10-02 20:15:29 -07:00
190n
54e177e2f9 Rename internal NapiHandleScope push/pop methods to open/close (#14300) 2024-10-02 15:05:38 -07:00
Meghan Denny
39342e34b1 node: define missing constants (#14211) 2024-10-02 14:35:16 -07:00
Mathias
e1cd7e510e Update CONTRIBUTING.md, fix #14225 (#14303) 2024-10-02 13:44:54 -07:00
Meghan Denny
54a225953b use bun.String.static instead of ZigString when immediately converting to JSValue (#14169) 2024-10-02 13:02:48 -07:00
Meghan Denny
419229d950 add ERR_BUFFER_OUT_OF_BOUNDS to internal/errors (#14195) 2024-10-02 07:59:24 -07:00
Meghan Denny
b8a2a11c6f lazy load these requires so that node:cluster imports faster (#14291) 2024-10-02 02:30:19 -07:00
Meghan Denny
25083a4252 pm: print command name to stdout (#14266) 2024-10-02 02:24:37 -07:00
dave caruso
87424390e1 fix 14248 (#14277) 2024-10-02 02:23:54 -07:00
Dylan Conway
92e66691fa fix bun getcompletes index out of bounds (#14289) 2024-10-02 02:23:36 -07:00
Meghan Denny
edebd6faa3 windows: watcher: that line wasnt meant to go to stdout (#14288) 2024-10-02 00:26:20 -07:00
Meghan Denny
531d78aa97 BunProcess: dont use for-loop for isSignalName (#14285) 2024-10-01 23:42:52 -07:00
Meghan Denny
e831bbf4ca node: implement more validators in native code (#14177)
Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
2024-10-01 21:55:05 -07:00
dave caruso
9870314ff6 fix 13394 (#14278) 2024-10-01 21:27:50 -07:00
Meghan Denny
e44d10cf17 node: lowercase primitive expectations of ERR_INVALID_ARG_TYPE (#14284) 2024-10-01 20:37:13 -07:00
Ashcon Partovi
db0750e90c cmake: Fix version detection 2024-10-01 15:48:13 -07:00
Ashcon Partovi
98e09efd02 cmake: Improve command detection (#14166) 2024-10-01 15:37:57 -07:00
Ashcon Partovi
944f342072 Revert "Remove old clang-tidy workflow"
This reverts commit 16917f7922.
2024-10-01 15:32:18 -07:00
Ashcon Partovi
16917f7922 Remove old clang-tidy workflow 2024-10-01 15:31:42 -07:00
Ashcon Partovi
27a157b6c1 Improve command detection in CMake 2024-10-01 13:50:15 -07:00
Jarred Sumner
07fd814629 Update index.md 2024-10-01 04:32:02 -07:00
Jarred Sumner
e348fef1c6 Update index.md 2024-10-01 04:26:19 -07:00
Jarred Sumner
68b910cbd9 Update index.md 2024-10-01 04:25:30 -07:00
Meghan Denny
e2f20d794f clang-format: add InsertNewlineAtEOF (#14267)
Co-authored-by: nektro <nektro@users.noreply.github.com>
2024-10-01 03:49:10 -07:00
Jarred Sumner
faa524bf67 Fix missing va_end call 2024-10-01 02:06:56 -07:00
Meghan Denny
016ebf7b9b cmake: only run prettier explicitly (#14228) 2024-09-30 23:43:29 -07:00
Jarred Sumner
2f7ff95e5c Introduce bytecode caching, polish "cjs" bundler output format (#14232)
Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
2024-09-30 22:37:42 -07:00
Meghan Denny
857a472033 ci: fix build error (#14262) 2024-09-30 22:20:21 -07:00
Jarred Sumner
7720d23da1 Make v8 stack trace parser code more careful (#14205) 2024-09-30 19:09:14 -07:00
Dylan Conway
ecc3e5e187 fix 14250 (#14256) 2024-09-30 19:08:13 -07:00
snwy
dcaaeecfa3 allow importing of files with top level awaits in bundler (#14218)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-09-30 16:50:50 -07:00
dave caruso
9ab51983b8 chore: make watcher use an anyopaque pointer context (#14224) 2024-09-28 01:44:55 -07:00
Jarred Sumner
af82a446df Support hmac in Bun.CryptoHasher (#14210) 2024-09-27 23:33:22 -07:00
190n
dd12715071 Propagate exceptions in napi_run_script (#14222) 2024-09-27 22:27:57 -07:00
dave caruso
514d37b3d2 kit: implement server components dev server (#14025) 2024-09-27 20:53:39 -07:00
Jarred Sumner
d09df1af47 Deflake a test 2024-09-27 14:22:59 -07:00
Meghan Denny
05afe42f31 fix Buffer.fill with a non-null empty fill including uninitialized bytes (#14199) 2024-09-27 02:50:32 -07:00
Meghan Denny
123b5219e0 include code in detached buffer error for Buffer.isUtf8 and Buffer.isAscii (#14197) 2024-09-27 02:49:38 -07:00
Meghan Denny
7113206a7d fix MAX_STRING_LENGTH constant value (#14196) 2024-09-27 02:48:04 -07:00
Andres Kalle
89fc3ef34d types: clarified parameter name (#14209) 2024-09-27 02:09:37 -07:00
Meghan Denny
392a58b0ed remove duplicate root.h includes (#14194) 2024-09-26 22:01:05 -07:00
Ciro Spaciari
02fb802b25 add req.json leak test (#14191) 2024-09-26 22:00:40 -07:00
Meghan Denny
69d33bb1d0 fix small leak in node:process.execArgv getter (#14154) 2024-09-26 17:10:14 -07:00
190n
4e51f7d85b Refactoring and bug fixes in the V8 API (#13754)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-09-26 16:54:37 -07:00
Robert Shuford
5e97fb8d97 Support reading from $HOME/.npmrc (#13990) 2024-09-26 14:41:28 -07:00
Meghan Denny
d42c032eec cleanup some error handling in BunProcess (#14178) 2024-09-26 14:20:35 -07:00
Jarred Sumner
afe974a175 Update color.md 2024-09-26 13:47:09 -07:00
Zack Radisic
274e5a2022 CSS Parser (#14122)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-09-26 13:39:26 -07:00
Jarred Sumner
18822b9f45 Support AbortSignal in Bun.spawn (#14180) 2024-09-26 10:54:54 -07:00
Meghan Denny
7b058e24ff fix memory leak in Bun.shellEscape return value (#14130) 2024-09-25 18:13:28 -07:00
Meghan Denny
ec7078a006 dont leak the address string in UDPSocket.addressToString (#14127) 2024-09-25 18:12:32 -07:00
snwy
af12ff104a fix utf8 handling when importing json (#14168) 2024-09-25 17:50:11 -07:00
Meghan Denny
80db770521 rework node:zlib to match internal js api and properly support async writes (#14079)
Co-authored-by: nektro <nektro@users.noreply.github.com>
2024-09-25 15:55:53 -07:00
Meghan Denny
c4c3019cb0 no need to cache protocol in NewServer when its statically known (#14128) 2024-09-25 14:47:50 -07:00
Ashcon Partovi
1f0f666210 Fix zig build again (#14165) 2024-09-25 13:02:56 -07:00
Ashcon Partovi
73f90c3359 Remove unused .docker directory 2024-09-25 12:43:47 -07:00
Ashcon Partovi
291a50aff5 Fix zig build (#14163) 2024-09-25 12:42:47 -07:00
Ashcon Partovi
128c658f91 Use ephemeral vendor path for now 2024-09-25 11:19:42 -07:00
Ashcon Partovi
a87341b239 Fix download zig script 2024-09-25 10:55:22 -07:00
Ashcon Partovi
3ab990e615 cmake: Fix zig build issue 2024-09-25 10:45:43 -07:00
Ashcon Partovi
ecf5d79e01 bun run clang-tidy (#14162) 2024-09-25 10:31:38 -07:00
Ashcon Partovi
b9a56a6087 cmake: Add target to download Node.js headers 2024-09-25 09:39:06 -07:00
Jarred Sumner
5722ae8d04 Make prototype pollution attacks harder in most Bun APIs that accept objects (#14119) 2024-09-25 01:16:29 -07:00
Meghan Denny
2856267fda add missing defers to JSBundler.Plugin.hasAnyMatches (#14129) 2024-09-25 01:15:32 -07:00
Meghan Denny
da70c891df dont leak the message when node:util.getSystemErrorName is passed an invalid code (#14126) 2024-09-25 01:13:22 -07:00
Wilmer Paulino
6f27b5559d Switch RSA asymmetric sign implementation to BoringSSL (#14125) 2024-09-25 01:12:50 -07:00
Ashcon Partovi
117e1b3883 bun run prettier (#14153)
Co-authored-by: Electroid <Electroid@users.noreply.github.com>
2024-09-24 22:46:18 -07:00
Ashcon Partovi
1e1025ca37 bun run zig-format (#14152) 2024-09-24 22:10:12 -07:00
Ashcon Partovi
30dc72c17b bun run clang-format (#14148)
Co-authored-by: Electroid <Electroid@users.noreply.github.com>
2024-09-24 20:39:29 -07:00
Jarred Sumner
17d719fa4e Make server.stop return a Promise that fulfills when all opened connections are closed (#14120) 2024-09-24 14:07:29 -07:00
Meghan Denny
0ac2a7da0a dont leak return value in crash_handler jsGetFeaturesAsVLQ (#14131) 2024-09-24 12:26:58 -07:00
Dylan Conway
9d23ce16ec fix(install): relative paths to tarballs in workspaces (#14121) 2024-09-23 22:44:24 -07:00
Ashcon Partovi
7d94c59545 Publish VSCode extension 2024-09-23 16:05:12 -07:00
Meghan Denny
33075394a4 cpp: always return empty JSValue value after throwing exception (#13935)
Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
2024-09-23 13:53:08 -07:00
Jarred Sumner
ff9560c82a Fix unbalanced ref count involving file descriptors passed to Bun.connect (#14107) 2024-09-23 10:28:50 -07:00
Jarred Sumner
2f8c20ef82 Implement --registry CLI flag in bun install (#14090) 2024-09-22 21:27:33 -07:00
Jarred Sumner
d05070dbfd Fix regression from #13414 (#14092) 2024-09-22 16:02:49 -07:00
Jarred Sumner
1244907a92 Bump 2024-09-22 02:53:21 -07:00
Jarred Sumner
81e5ee26bd Don't re-create the FIFO in streams every time (#14088) 2024-09-22 02:13:11 -07:00
Jarred Sumner
27e7aa7923 Update from-npm-install-to-bun-install.md 2024-09-22 00:33:41 -07:00
Jarred Sumner
f89623aa5e Update from-npm-install-to-bun-install.md 2024-09-22 00:31:01 -07:00
Jarred Sumner
3cc51ceb98 Update from-npm-install-to-bun-install.md 2024-09-22 00:30:08 -07:00
Jarred Sumner
e944bb3638 Update from-npm-install-to-bun-install.md 2024-09-22 00:29:23 -07:00
Jarred Sumner
797750ef42 Update from-npm-install-to-bun-install.md 2024-09-22 00:27:47 -07:00
Jarred Sumner
c267d76f05 Update from-npm-install-to-bun-install.md 2024-09-22 00:25:47 -07:00
Jarred Sumner
c5c1e8ff3a Update from-npm-install-to-bun-install.md 2024-09-22 00:24:56 -07:00
Jarred Sumner
1eab8ec107 Update from-npm-install-to-bun-install.md 2024-09-22 00:23:44 -07:00
Jarred Sumner
60d8c8ad4c Update from-npm-install-to-bun-install.md 2024-09-22 00:17:41 -07:00
Jarred Sumner
dba108f8c4 Update from-npm-install-to-bun-install.md 2024-09-21 23:32:34 -07:00
Jarred Sumner
18251e1b60 Create from-npm-install-to-bun-install.md 2024-09-21 23:29:16 -07:00
Xmarmalade
0bc21b3ddf docs: add ccache for Windows System Dependencies (#14080) 2024-09-21 01:35:01 -07:00
Jarred Sumner
c298b23c45 Fix process.cwd on windows (#14081) 2024-09-21 01:32:23 -07:00
snwy
722e3fa481 fix for windows debug support (#14048)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2024-09-21 00:20:33 -07:00
Jarred Sumner
3fc092d23f Fix ci issue 2024-09-20 22:13:16 -07:00
Jarred Sumner
6e0847ca49 Fix searching for lld in $PATH on Linux 2024-09-20 22:09:21 -07:00
Jarred Sumner
7a190de2f1 Fix upload-s3.ts script 2024-09-20 21:34:50 -07:00
Dylan Conway
57a1d7b4ee update 2024-09-20 20:38:52 -07:00
Dylan Conway
3e0e99176a udpate 2024-09-20 20:37:49 -07:00
Dylan Conway
eb8d465c50 Merge branch 'main' into jarred/napi-2 2024-07-22 21:14:24 -07:00
Jarred-Sumner
418139358b Apply formatting changes 2024-07-19 08:20:27 +00:00
Jarred Sumner
1f5359705e Defer finalization for napi callbacks to the immediate task queue 2024-07-19 01:09:31 -07:00
713 changed files with 79108 additions and 19146 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,14 +0,0 @@
# Note: 2 blank lines are required between entries
Package: *
Pin: release a=eoan
Pin-Priority: 500
Package: *
Pin: origin "ftp.debian.org"
Pin-Priority: 300
# Pattern includes 'chromium', 'chromium-browser' and similarly
# named dependencies:
Package: chromium*
Pin: origin "ftp.debian.org"
Pin-Priority: 700

View File

@@ -1,8 +0,0 @@
#!/bin/bash
set -euxo pipefail
name=$(openssl rand -hex 12)
id=$(docker create --name=bun-binary-$name $CONTAINER_TAG)
docker container cp bun-binary-$name:$BUN_RELEASE_DIR bun-binary
echo -e "bun-binary-$name"

View File

@@ -1,3 +0,0 @@
deb http://deb.debian.org/debian buster main
deb http://deb.debian.org/debian buster-updates main
deb http://deb.debian.org/debian-security buster/updates main

View File

@@ -1,34 +0,0 @@
export DOCKER_BUILDKIT=1
export BUILDKIT_ARCH=$(uname -m)
export ARCH=${BUILDKIT_ARCH}
if [ "$BUILDKIT_ARCH" == "amd64" ]; then
export BUILDKIT_ARCH="amd64"
export ARCH=x64
fi
if [ "$BUILDKIT_ARCH" == "x86_64" ]; then
export BUILDKIT_ARCH="amd64"
export ARCH=x64
fi
if [ "$BUILDKIT_ARCH" == "arm64" ]; then
export BUILDKIT_ARCH="arm64"
export ARCH=aarch64
fi
if [ "$BUILDKIT_ARCH" == "aarch64" ]; then
export BUILDKIT_ARCH="arm64"
export ARCH=aarch64
fi
if [ "$BUILDKIT_ARCH" == "armv7l" ]; then
echo "Unsupported platform: $BUILDKIT_ARCH"
exit 1
fi
export BUILD_ID=$(cat build-id)
export CONTAINER_NAME=bun-linux-$ARCH
export DEBUG_CONTAINER_NAME=debug-bun-linux-$ARCH
export TEMP=/tmp/bun-0.0.$BUILD_ID

View File

@@ -1,11 +0,0 @@
#!/bin/bash
set -euxo pipefail
docker pull bunbunbunbun/bun-test-base:latest --platform=linux/amd64
docker pull bunbunbunbun/bun-base:latest --platform=linux/amd64
docker pull bunbunbunbun/bun-base-with-zig-and-webkit:latest --platform=linux/amd64
docker tag bunbunbunbun/bun-test-base:latest bun-base:latest
docker tag bunbunbunbun/bun-base:latest bun-base:latest
docker tag bunbunbunbun/bun-base-with-zig-and-webkit:latest bun-base-with-zig-and-webkit:latest

View File

@@ -1,47 +0,0 @@
#!/bin/bash
source "dockerfile-common.sh"
export $CONTAINER_NAME=$CONTAINER_NAME-local
rm -rf $TEMP
mkdir -p $TEMP
docker build . --target release --progress=plain -t $CONTAINER_NAME:latest --build-arg BUILDKIT_INLINE_CACHE=1 --platform=linux/$BUILDKIT_ARCH --cache-from $CONTAINER_NAME:latest
if (($?)); then
echo "Failed to build container"
exit 1
fi
id=$(docker create $CONTAINER_NAME:latest)
docker cp $id:/home/ubuntu/bun-release $TEMP/$CONTAINER_NAME
if (($?)); then
echo "Failed to cp container"
exit 1
fi
cd $TEMP
mkdir -p $TEMP/$CONTAINER_NAME $TEMP/$DEBUG_CONTAINER_NAME
mv $CONTAINER_NAME/bun-profile $DEBUG_CONTAINER_NAME/bun
zip -r $CONTAINER_NAME.zip $CONTAINER_NAME
zip -r $DEBUG_CONTAINER_NAME.zip $DEBUG_CONTAINER_NAME
docker rm -v $id
abs=$(realpath $TEMP/$CONTAINER_NAME.zip)
debug_abs=$(realpath $TEMP/$DEBUG_CONTAINER_NAME.zip)
case $(uname -s) in
"Linux") target="linux" ;;
*) target="other" ;;
esac
if [ "$target" = "linux" ]; then
if command -v bun --version >/dev/null; then
cp $TEMP/$CONTAINER_NAME/bun $(which bun)
cp $TEMP/$DEBUG_CONTAINER_NAME/bun $(which bun-profile)
fi
fi
echo "Saved to:"
echo $debug_abs
echo $abs

View File

@@ -1,9 +0,0 @@
#!/bin/bash
set -euxo pipefail
bun install
bun install --cwd ./test/snippets
bun install --cwd ./test/scripts
make $BUN_TEST_NAME

View File

@@ -1,5 +0,0 @@
#!/bin/bash
set -euxo pipefail
docker container run --security-opt seccomp=.docker/chrome.json --env GITHUB_WORKSPACE=$GITHUB_WORKSPACE --env BUN_TEST_NAME=$BUN_TEST_NAME --ulimit memlock=-1:-1 --init --rm bun-test:latest

View File

@@ -1,5 +0,0 @@
#!/bin/bash
set -euxo pipefail
docker container run --security-opt seccomp=.docker/chrome.json --env GITHUB_WORKSPACE=$GITHUB_WORKSPACE --ulimit memlock=-1:-1 --init --rm bun-unit-tests:latest

View File

@@ -47,4 +47,5 @@ runs:
mkdir -p ${{ runner.temp }}/.bun/bin
mv ${target}/bun* ${{ runner.temp }}/.bun/bin/
chmod +x ${{ runner.temp }}/.bun/bin/*
ln -fs ${{ runner.temp }}/.bun/bin/bun ${{ runner.temp }}/.bun/bin/bunx
echo "${{ runner.temp }}/.bun/bin" >> ${GITHUB_PATH}

41
.github/workflows/clang-format.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: clang-format
permissions:
contents: write
on:
workflow_call:
workflow_dispatch:
pull_request:
env:
BUN_VERSION: "1.1.27"
LLVM_VERSION: "18.1.8"
LLVM_VERSION_MAJOR: "18"
jobs:
clang-format:
name: clang-format
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Install LLVM
run: |
curl -fsSL https://apt.llvm.org/llvm.sh | sudo bash -s -- ${{ env.LLVM_VERSION_MAJOR }} all
- name: Clang Format
env:
ENABLE_CCACHE: OFF
LLVM_VERSION: ${{ env.LLVM_VERSION }}
run: |
bun run clang-format:diff
- name: Commit
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "`bun run clang-format`"

41
.github/workflows/clang-tidy.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: clang-tidy
permissions:
contents: write
on:
workflow_call:
workflow_dispatch:
pull_request:
env:
BUN_VERSION: "1.1.27"
LLVM_VERSION: "18.1.8"
LLVM_VERSION_MAJOR: "18"
jobs:
clang-tidy:
name: clang-tidy
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Install LLVM
run: |
curl -fsSL https://apt.llvm.org/llvm.sh | sudo bash -s -- ${{ env.LLVM_VERSION_MAJOR }} all
- name: Clang Tidy
env:
ENABLE_CCACHE: OFF
LLVM_VERSION: ${{ env.LLVM_VERSION }}
run: |
bun run clang-tidy:diff
- name: Commit
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "`bun run clang-tidy`"

View File

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

View File

@@ -1,30 +0,0 @@
name: lint-cpp
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'workflow_dispatch' && inputs.run-id || github.ref }}
cancel-in-progress: true
on:
workflow_dispatch:
inputs:
run-id:
type: string
description: The workflow ID to download artifacts (skips the build step)
# pull_request:
# paths:
# - ".github/workflows/lint-cpp.yml"
# - "**/*.cpp"
# - "vendor/**/*"
# - "CMakeLists.txt"
jobs:
lint-cpp:
if: ${{ !inputs.run-id }}
name: Lint C++
uses: ./.github/workflows/run-lint-cpp.yml
secrets: inherit
with:
pr-number: ${{ github.event.number }}

39
.github/workflows/prettier-format.yml vendored Normal file
View File

@@ -0,0 +1,39 @@
name: prettier-format
permissions:
contents: write
on:
workflow_call:
workflow_dispatch:
pull_request:
env:
BUN_VERSION: "1.1.27"
jobs:
prettier-format:
name: prettier-format
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Setup Dependencies
run: |
bun install
- name: Prettier Format
env:
ENABLE_CCACHE: OFF
LLVM_VERSION: "ignore"
run: |
bun run prettier:diff
- name: Commit
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "`bun run prettier:extra`"

View File

@@ -1,56 +0,0 @@
name: Format
permissions:
contents: write
on:
workflow_call:
inputs:
zig-version:
type: string
required: true
jobs:
format:
name: Format
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
sparse-checkout: |
.prettierrc-ci
.github
.vscode
src
scripts
packages
test
bench
package.json
bun.lockb
.clang-format
- name: Setup Bun
uses: ./.github/actions/setup-bun
with:
bun-version: "1.1.25"
- name: Setup Zig
uses: mlugg/setup-zig@v1
with:
version: ${{ inputs.zig-version }}
- name: Install Dependencies
run: |
bun install
- name: Format
run: |
bun fmt
- name: Format Zig
run: |
bun fmt:zig
- name: Format Cpp
run: |
bun fmt:cpp
- name: Commit
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: Apply formatting changes

View File

@@ -1,84 +0,0 @@
name: lint-cpp
permissions:
contents: read
env:
LLVM_VERSION: 18
LC_CTYPE: "en_US.UTF-8"
LC_ALL: "en_US.UTF-8"
on:
workflow_call:
inputs:
pr-number:
required: true
type: number
jobs:
lint-cpp:
name: Lint C++
runs-on: ${{ github.repository_owner == 'oven-sh' && 'macos-13-xlarge' || 'macos-13' }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Bun
uses: ./.github/actions/setup-bun
with:
bun-version: 1.1.23
- name: Install Dependencies
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
HOMEBREW_NO_AUTO_UPDATE: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
run: |
brew install \
llvm@${{ env.LLVM_VERSION }} \
ninja \
coreutils \
openssl@1.1 \
libiconv \
gnu-sed --force --overwrite
echo "$(brew --prefix coreutils)/libexec/gnubin" >> $GITHUB_PATH
echo "$(brew --prefix llvm@$LLVM_VERSION)/bin" >> $GITHUB_PATH
brew link --overwrite llvm@$LLVM_VERSION
- name: Bun install
run: |
bun install
- name: clang-tidy
id: format
env:
CPU_TARGET: native
BUN_SILENT: 1
run: |
rm -f did_fail format.log
echo "${{ inputs.pr-number }}" > pr-number.txt
echo "pr_number=$(cat pr-number.txt)" >> $GITHUB_OUTPUT
bun run --silent build:tidy &> >(tee -p format.log) && echo 0 > did_succeed.txt
# Upload format.log as github artifact for the workflow
if [ -f did_succeed.txt ]; then
echo "0" > did_fail.txt
else
echo "1" > did_fail.txt
fi
echo "did_fail=$(cat did_fail.txt)" >> $GITHUB_OUTPUT
- name: Upload format.log
uses: actions/upload-artifact@v4
with:
name: format.log
path: format.log
- name: Upload PR
uses: actions/upload-artifact@v4
with:
name: pr-number.txt
path: pr-number.txt
- name: Upload PR
uses: actions/upload-artifact@v4
with:
name: did_fail.txt
path: did_fail.txt
- name: Fail if formatting failed
if: ${{ steps.format.outputs.did_fail == '1' }}
run: exit 1

36
.github/workflows/zig-format.yml vendored Normal file
View File

@@ -0,0 +1,36 @@
name: zig-format
permissions:
contents: write
on:
workflow_call:
workflow_dispatch:
pull_request:
env:
BUN_VERSION: "1.1.27"
jobs:
zig-format:
name: zig-format
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Bun
uses: ./.github/actions/setup-bun
with:
bun-version: ${{ env.BUN_VERSION }}
- name: Zig Format
env:
ENABLE_CCACHE: OFF
LLVM_VERSION: "ignore"
run: |
bun run zig-format:diff
- name: Commit
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "`bun run zig-format`"

View File

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

2
.vscode/launch.json generated vendored
View File

@@ -1192,4 +1192,4 @@
"description": "Usage: bun test [...]",
},
],
}
}

View File

@@ -52,12 +52,15 @@
"cmake.configureOnOpen": false,
"C_Cpp.errorSquiggles": "enabled",
"[cpp]": {
"editor.tabSize": 4,
"editor.defaultFormatter": "xaver.clang-format",
},
"[c]": {
"editor.tabSize": 4,
"editor.defaultFormatter": "xaver.clang-format",
},
"[h]": {
"editor.tabSize": 4,
"editor.defaultFormatter": "xaver.clang-format",
},
"clangd.arguments": ["-header-insertion=never"],

View File

@@ -30,6 +30,7 @@ include(CompilerFlags)
# --- Tools ---
include(SetupGit)
include(SetupBuildkite)
include(SetupBun)
include(SetupEsbuild)
@@ -39,3 +40,14 @@ include(SetupRust)
# --- Targets ---
include(BuildBun)
# --- Analysis ---
optionx(ENABLE_ANALYSIS BOOL "If analysis targets should be enabled" DEFAULT OFF)
if(ENABLE_ANALYSIS)
include(RunClangFormat)
include(RunClangTidy)
include(RunZigFormat)
include(RunPrettier)
endif()

View File

@@ -116,35 +116,19 @@ $ export PATH="$PATH:/usr/lib/llvm16/bin"
## 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.
```bash
$ bun setup
```
The binary will be located at `./build/bun-debug`. It is recommended to add this to your `$PATH`. To verify the build worked, let's print the version number on the development build of Bun.
```bash
$ build/bun-debug --version
x.y.z_debug
```
To rebuild, you can invoke `bun run build`
After cloning the repository, run the following command to build. This may take a while as it will clone submodules and build dependencies.
```bash
$ bun run build
```
These two scripts, `setup` and `build`, are aliases to do roughly the following:
The binary will be located at `./build/debug/bun-debug`. It is recommended to add this to your `$PATH`. To verify the build worked, let's print the version number on the development build of Bun.
```bash
$ ./scripts/setup.sh
$ cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug
$ ninja -C build # 'bun run build' runs just this
$ build/debug/bun-debug --version
x.y.z_debug
```
Advanced users can pass CMake flags to customize the build.
## VSCode
VSCode is the recommended IDE for working on Bun, as it has been configured. Once opening, you can run `Extensions: Show Recommended Extensions` to install the recommended extensions for Zig and C++. ZLS is automatically configured.

2
LATEST
View File

@@ -1 +1 @@
1.1.27
1.1.29

View File

@@ -77,7 +77,7 @@ BUN_RELEASE_BIN = $(PACKAGE_DIR)/bun
PRETTIER ?= $(shell which prettier 2>/dev/null || echo "./node_modules/.bin/prettier")
ESBUILD = "$(shell which esbuild 2>/dev/null || echo "./node_modules/.bin/esbuild")"
DSYMUTIL ?= $(shell which dsymutil 2>/dev/null || which dsymutil-15 2>/dev/null)
WEBKIT_DIR ?= $(realpath src/bun.js/WebKit)
WEBKIT_DIR ?= $(realpath vendor/WebKit)
WEBKIT_RELEASE_DIR ?= $(WEBKIT_DIR)/WebKitBuild/Release
WEBKIT_DEBUG_DIR ?= $(WEBKIT_DIR)/WebKitBuild/Debug
WEBKIT_RELEASE_DIR_LTO ?= $(WEBKIT_DIR)/WebKitBuild/ReleaseLTO
@@ -138,8 +138,8 @@ endif
SED = $(shell which gsed 2>/dev/null || which sed 2>/dev/null)
BUN_DIR ?= $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
BUN_DEPS_DIR ?= $(shell pwd)/src/deps
BUN_DEPS_OUT_DIR ?= $(shell pwd)/build/bun-deps
BUN_DEPS_DIR ?= $(shell pwd)/vendor
BUN_DEPS_OUT_DIR ?= $(shell pwd)/build/release
CPU_COUNT = 2
ifeq ($(OS_NAME),darwin)
CPU_COUNT = $(shell sysctl -n hw.logicalcpu)
@@ -689,19 +689,10 @@ assert-deps:
@test $(shell cargo --version | awk '{print $$2}' | cut -d. -f2) -gt 57 || (echo -e "ERROR: cargo version must be at least 1.57."; exit 1)
@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 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))
endif
.PHONY: init-submodules
init-submodules: submodule # (backwards-compatibility alias)
.PHONY: submodule
submodule: ## to init or update all submodules
git submodule update --init --recursive --progress --depth=1 --checkout $(SUBMODULE_NAMES)
.PHONY: build-obj
build-obj:
@@ -804,7 +795,7 @@ cls:
@echo -e "\n\n---\n\n"
jsc-check:
@ls $(JSC_BASE_DIR) >/dev/null 2>&1 || (echo -e "Failed to access WebKit build. Please compile the WebKit submodule using the Dockerfile at $(shell pwd)/src/javascript/WebKit/Dockerfile and then copy from /output in the Docker container to $(JSC_BASE_DIR). You can override the directory via JSC_BASE_DIR. \n\n DOCKER_BUILDKIT=1 docker build -t bun-webkit $(shell pwd)/src/bun.js/WebKit -f $(shell pwd)/src/bun.js/WebKit/Dockerfile --progress=plain\n\n docker container create bun-webkit\n\n # Get the container ID\n docker container ls\n\n docker cp DOCKER_CONTAINER_ID_YOU_JUST_FOUND:/output $(JSC_BASE_DIR)" && exit 1)
@ls $(JSC_BASE_DIR) >/dev/null 2>&1 || (echo -e "Failed to access WebKit build. Please compile the WebKit submodule using the Dockerfile at $(shell pwd)/src/javascript/WebKit/Dockerfile and then copy from /output in the Docker container to $(JSC_BASE_DIR). You can override the directory via JSC_BASE_DIR. \n\n DOCKER_BUILDKIT=1 docker build -t bun-webkit $(shell pwd)/vendor/WebKit -f $(shell pwd)/vendor/WebKit/Dockerfile --progress=plain\n\n docker container create bun-webkit\n\n # Get the container ID\n docker container ls\n\n docker cp DOCKER_CONTAINER_ID_YOU_JUST_FOUND:/output $(JSC_BASE_DIR)" && exit 1)
@ls $(JSC_INCLUDE_DIR) >/dev/null 2>&1 || (echo "Failed to access WebKit include directory at $(JSC_INCLUDE_DIR)." && exit 1)
@ls $(JSC_LIB) >/dev/null 2>&1 || (echo "Failed to access WebKit lib directory at $(JSC_LIB)." && exit 1)
@@ -945,7 +936,7 @@ jsc-bindings: headers bindings
.PHONY: clone-submodules
clone-submodules:
git -c submodule."src/bun.js/WebKit".update=none submodule update --init --recursive --depth=1 --progress
git -c submodule."vendor/WebKit".update=none submodule update --init --recursive --depth=1 --progress
.PHONY: headers
@@ -1265,7 +1256,7 @@ jsc-build-mac-compile:
-DENABLE_STATIC_JSC=ON \
-DENABLE_SINGLE_THREADED_VM_ENTRY_SCOPE=ON \
-DALLOW_LINE_AND_COLUMN_NUMBER_IN_BUILTINS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DUSE_THIN_ARCHIVES=OFF \
-DBUN_FAST_TLS=ON \
-DENABLE_FTL_JIT=ON \
@@ -1277,7 +1268,7 @@ jsc-build-mac-compile:
$(WEBKIT_DIR) \
$(WEBKIT_RELEASE_DIR) && \
CFLAGS="$(CFLAGS) -ffat-lto-objects" CXXFLAGS="$(CXXFLAGS) -ffat-lto-objects" \
cmake --build $(WEBKIT_RELEASE_DIR) --config Release --target jsc
cmake --build $(WEBKIT_RELEASE_DIR) --config RelWithDebInfo --target jsc
.PHONY: jsc-build-mac-compile-lto
jsc-build-mac-compile-lto:
@@ -1379,7 +1370,7 @@ jsc-build-linux-compile-config-debug:
$(WEBKIT_DEBUG_DIR)
# If you get "Error: could not load cache"
# run rm -rf src/bun.js/WebKit/CMakeCache.txt
# run rm -rf vendor/WebKit/CMakeCache.txt
.PHONY: jsc-build-linux-compile-build
jsc-build-linux-compile-build:
mkdir -p $(WEBKIT_RELEASE_DIR) && \
@@ -1414,7 +1405,7 @@ jsc-build-copy-debug:
cp $(WEBKIT_DEBUG_DIR)/lib/libbmalloc.a $(BUN_DEPS_OUT_DIR)/libbmalloc.a
clean-jsc:
cd src/bun.js/WebKit && rm -rf **/CMakeCache.txt **/CMakeFiles && rm -rf src/bun.js/WebKit/WebKitBuild
cd vendor/WebKit && rm -rf **/CMakeCache.txt **/CMakeFiles && rm -rf vendor/WebKit/WebKitBuild
clean-bindings:
rm -rf $(OBJ_DIR)/*.o $(DEBUG_OBJ_DIR)/*.o $(DEBUG_OBJ_DIR)/webcore/*.o $(DEBUG_BINDINGS_OBJ) $(OBJ_DIR)/webcore/*.o $(BINDINGS_OBJ) $(OBJ_DIR)/*.d $(DEBUG_OBJ_DIR)/*.d

Binary file not shown.

View File

@@ -0,0 +1,24 @@
import { bench, run } from "mitata";
const crypto = require("node:crypto");
const keyPair = crypto.generateKeyPairSync("rsa", {
modulusLength: 2048,
publicKeyEncoding: {
type: "spki",
format: "pem",
},
privateKeyEncoding: {
type: "pkcs8",
format: "pem",
},
});
// Max message size for 2048-bit RSA keys
const plaintext = crypto.getRandomValues(Buffer.alloc(245));
bench("RSA sign RSA_PKCS1_PADDING round-trip", () => {
const sig = crypto.privateEncrypt(keyPair.privateKey, plaintext);
crypto.publicDecrypt(keyPair.publicKey, sig);
});
await run();

View File

@@ -7,6 +7,7 @@
"@swc/core": "^1.2.133",
"benchmark": "^2.1.4",
"braces": "^3.0.2",
"color": "^4.2.3",
"esbuild": "^0.14.12",
"eventemitter3": "^5.0.0",
"execa": "^8.0.1",
@@ -14,6 +15,7 @@
"fdir": "^6.1.0",
"mitata": "^0.1.6",
"string-width": "7.1.0",
"tinycolor2": "^1.6.0",
"zx": "^7.2.3"
},
"scripts": {

25
bench/snippets/color.mjs Normal file
View File

@@ -0,0 +1,25 @@
import Color from "color";
import tinycolor from "tinycolor2";
import { bench, group, run } from "./runner.mjs";
const inputs = ["#f00", "rgb(255, 0, 0)", "rgba(255, 0, 0, 1)", "hsl(0, 100%, 50%)"];
for (const input of inputs) {
group(`${input}`, () => {
if (typeof Bun !== "undefined") {
bench("Bun.color()", () => {
Bun.color(input, "css");
});
}
bench("color", () => {
Color(input).hex();
});
bench("'tinycolor2'", () => {
tinycolor(input).toHexString();
});
});
}
await run();

View File

@@ -52,7 +52,7 @@ const BunBuildOptions = struct {
/// instead of at compile time. This is disabled in release or if this flag
/// is set (to allow CI to build a portable executable). Affected files:
///
/// - src/kit/runtime.ts (bundled)
/// - src/bake/runtime.ts (bundled)
/// - src/bun.js/api/FFI.h
///
/// A similar technique is used in C++ code for JavaScript builtins
@@ -157,7 +157,7 @@ pub fn build(b: *Build) !void {
// TODO: Upgrade path for 0.14.0
// b.graph.zig_lib_directory = brk: {
// const sub_path = "src/deps/zig/lib";
// const sub_path = "vendor/zig/lib";
// const dir = try b.build_root.handle.openDir(sub_path, .{});
// break :brk .{ .handle = dir, .path = try b.build_root.join(b.graph.arena, &.{sub_path}) };
// };
@@ -295,7 +295,7 @@ pub fn build(b: *Build) !void {
bun_check_obj.generated_bin = null;
step.dependOn(&bun_check_obj.step);
// The default install step will run zig build check This is so ZLS
// The default install step will run zig build check. This is so ZLS
// identifies the codebase, as well as performs checking if build on
// save is enabled.
@@ -368,6 +368,7 @@ pub fn addBunObject(b: *Build, opts: *BunBuildOptions) *Compile {
.root_source_file = switch (opts.os) {
.wasm => b.path("root_wasm.zig"),
else => b.path("root.zig"),
// else => b.path("root_css.zig"),
},
.target = opts.target,
.optimize = opts.optimize,
@@ -474,8 +475,8 @@ fn addInternalPackages(b: *Build, obj: *Compile, opts: *BunBuildOptions) void {
.{ .file = "ZigGeneratedClasses.zig", .import = "ZigGeneratedClasses" },
.{ .file = "ResolvedSourceTag.zig", .import = "ResolvedSourceTag" },
.{ .file = "ErrorCode.zig", .import = "ErrorCode" },
.{ .file = "kit.client.js", .import = "kit-codegen/kit.client.js", .enable = opts.shouldEmbedCode() },
.{ .file = "kit.server.js", .import = "kit-codegen/kit.server.js", .enable = opts.shouldEmbedCode() },
.{ .file = "bake.client.js", .import = "bake-codegen/bake.client.js", .enable = opts.shouldEmbedCode() },
.{ .file = "bake.server.js", .import = "bake-codegen/bake.server.js", .enable = opts.shouldEmbedCode() },
}) |entry| {
if (!@hasField(@TypeOf(entry), "enable") or entry.enable) {
const path = b.pathJoin(&.{ opts.generated_code_dir, entry.file });

BIN
bun.lockb

Binary file not shown.

View File

@@ -30,6 +30,10 @@ macro(optionx variable type description)
set(multiValueArgs)
cmake_parse_arguments(${variable} "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(DEFINED ${variable})
set(${variable}_VALUE ${${variable}})
endif()
if(NOT ${type} MATCHES "^(BOOL|STRING|FILEPATH|PATH|INTERNAL)$")
set(${variable}_REGEX ${type})
set(${variable}_TYPE STRING)
@@ -65,7 +69,9 @@ macro(optionx variable type description)
message(FATAL_ERROR "Invalid ${${variable}_SOURCE}: ${${variable}_PREVIEW}=\"${${variable}}\", please use ${${variable}_PREVIEW}=<${${variable}_REGEX}>")
endif()
message(STATUS "Set ${variable}: ${${variable}}")
if(NOT ${variable}_VALUE STREQUAL ${variable})
message(STATUS "Set ${variable}: ${${variable}}")
endif()
endmacro()
# unsupported()
@@ -124,12 +130,19 @@ optionx(CACHE_STRATEGY "read-write|read-only|write-only|none" "The strategy to u
optionx(CI BOOL "If CI is enabled" DEFAULT OFF)
if(CI)
set(DEFAULT_VENDOR_PATH ${CACHE_PATH}/vendor)
set(WARNING FATAL_ERROR)
else()
set(DEFAULT_VENDOR_PATH ${CWD}/vendor)
set(WARNING WARNING)
endif()
optionx(VENDOR_PATH FILEPATH "The path to the vendor directory" DEFAULT ${DEFAULT_VENDOR_PATH})
# TODO: This causes flaky zig builds in CI, so temporarily disable it.
# if(CI)
# set(DEFAULT_VENDOR_PATH ${CACHE_PATH}/vendor)
# else()
# set(DEFAULT_VENDOR_PATH ${CWD}/vendor)
# endif()
optionx(VENDOR_PATH FILEPATH "The path to the vendor directory" DEFAULT ${CWD}/vendor)
optionx(TMP_PATH FILEPATH "The path to the temporary directory" DEFAULT ${BUILD_PATH}/tmp)
optionx(FRESH BOOL "Set when --fresh is used" DEFAULT OFF)
@@ -137,19 +150,6 @@ optionx(CLEAN BOOL "Set when --clean is used" DEFAULT OFF)
# --- Helper functions ---
function(parse_semver value variable)
string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" match "${value}")
if(NOT match)
message(FATAL_ERROR "Invalid semver: \"${value}\"")
endif()
set(${variable}_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}" PARENT_SCOPE)
set(${variable}_VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE)
set(${variable}_VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
set(${variable}_VERSION_PATCH "${CMAKE_MATCH_3}" PARENT_SCOPE)
endfunction()
# setenv()
# Description:
# Sets an environment variable during the build step, and writes it to a .env file.
@@ -187,102 +187,154 @@ function(setenv variable value)
message(STATUS "Set ENV ${variable}: ${value}")
endfunction()
# check_command()
# satisfies_range()
# Description:
# Checks if a command is available, used by `find_command()` as a validator.
# Check if a version satisfies a version range
# Arguments:
# FOUND bool - The variable to set to true if the version is found
# CMD string - The executable to check the version of
function(check_command FOUND CMD)
set(${FOUND} OFF PARENT_SCOPE)
if(${CMD} MATCHES "zig")
set(CHECK_COMMAND ${CMD} version)
else()
set(CHECK_COMMAND ${CMD} --version)
endif()
execute_process(
COMMAND ${CHECK_COMMAND}
RESULT_VARIABLE RESULT
OUTPUT_VARIABLE OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT RESULT EQUAL 0 OR NOT OUTPUT)
message(DEBUG "${CHECK_COMMAND}, exited with code ${RESULT}")
# version string - The version to check (e.g. "1.2.3")
# range string - The range to check against (e.g. ">=1.2.3")
# variable string - The variable to store the result in
function(satisfies_range version range variable)
if(range STREQUAL "ignore")
set(${variable} ON PARENT_SCOPE)
return()
endif()
parse_semver(${OUTPUT} CMD)
parse_semver(${CHECK_COMMAND_VERSION} CHECK)
set(${variable} OFF PARENT_SCOPE)
if(CHECK_COMMAND_VERSION MATCHES ">=")
if(NOT CMD_VERSION VERSION_GREATER_EQUAL ${CHECK_VERSION})
message(DEBUG "${CHECK_COMMAND}, actual: ${CMD_VERSION}, expected: ${CHECK_COMMAND_VERSION}")
return()
endif()
elseif(CHECK_COMMAND_VERSION MATCHES ">")
if(NOT CMD_VERSION VERSION_GREATER ${CHECK_VERSION})
message(DEBUG "${CHECK_COMMAND}, actual: ${CMD_VERSION}, expected: ${CHECK_COMMAND_VERSION}")
return()
endif()
string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" match "${version}")
if(NOT match)
return()
endif()
set(version ${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3})
string(REGEX MATCH "(>=|<=|>|<)?([0-9]+)\\.([0-9]+)\\.([0-9]+)" match "${range}")
if(NOT match)
return()
endif()
set(comparator ${CMAKE_MATCH_1})
set(range ${CMAKE_MATCH_2}.${CMAKE_MATCH_3}.${CMAKE_MATCH_4})
if(comparator STREQUAL ">=")
set(comparator VERSION_GREATER_EQUAL)
elseif(comparator STREQUAL ">")
set(comparator VERSION_GREATER)
elseif(comparator STREQUAL "<=")
set(comparator VERSION_LESS_EQUAL)
elseif(comparator STREQUAL "<")
set(comparator VERSION_LESS)
else()
if(NOT CMD_VERSION VERSION_EQUAL ${CHECK_VERSION})
message(DEBUG "${CHECK_COMMAND}, actual: ${CMD_VERSION}, expected: =${CHECK_COMMAND_VERSION}")
return()
endif()
set(comparator VERSION_EQUAL)
endif()
set(${FOUND} TRUE PARENT_SCOPE)
if(version ${comparator} ${range})
set(${variable} ON PARENT_SCOPE)
endif()
endfunction()
# find_command()
# Description:
# Finds a command, similar to `find_program()`, but allows for version checking.
# Arguments:
# VARIABLE string - The variable to set
# COMMAND string[] - The names of the command to find
# PATHS string[] - The paths to search for the command
# REQUIRED bool - If false, the command is optional
# VERSION string - The version of the command to find (e.g. "1.2.3" or ">1.2.3")
# VARIABLE string - The variable to set
# VERSION_VARIABLE string - The variable to check for the version
# COMMAND string[] - The names of the command to find
# PATHS string[] - The paths to search for the command
# REQUIRED bool - If false, the command is optional
# VERSION string - The version of the command to find (e.g. "1.2.3" or ">1.2.3")
function(find_command)
set(options)
set(args VARIABLE VERSION MIN_VERSION REQUIRED)
set(args VARIABLE VERSION_VARIABLE REQUIRED VERSION)
set(multiArgs COMMAND PATHS)
cmake_parse_arguments(CMD "${options}" "${args}" "${multiArgs}" ${ARGN})
cmake_parse_arguments(FIND "" "${args}" "${multiArgs}" ${ARGN})
if(NOT CMD_VARIABLE)
message(FATAL_ERROR "find_command: VARIABLE is required")
if(NOT FIND_VARIABLE OR NOT FIND_COMMAND)
message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION}: VARIABLE and COMMAND are required")
endif()
if(NOT CMD_COMMAND)
message(FATAL_ERROR "find_command: COMMAND is required")
if(NOT FIND_VERSION_VARIABLE)
set(FIND_VERSION_VARIABLE ${FIND_VARIABLE}_VERSION)
endif()
if(CMD_VERSION)
set(CHECK_COMMAND_VERSION ${CMD_VERSION}) # special global variable
set(CMD_VALIDATOR VALIDATOR check_command)
list(GET FIND_COMMAND 0 FIND_NAME)
if(FIND_VERSION)
optionx(${FIND_VERSION_VARIABLE} STRING "The version of ${FIND_NAME} to find" DEFAULT "${FIND_VERSION}")
function(find_command_version variable exe)
set(${variable} OFF PARENT_SCOPE)
if(${exe} MATCHES "(go|zig)(\.exe)?$")
set(command ${exe} version)
else()
set(command ${exe} --version)
endif()
execute_process(
COMMAND ${command}
RESULT_VARIABLE result
OUTPUT_VARIABLE output
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if(NOT result EQUAL 0)
set(reason "exited with ${result}")
elseif(NOT output)
set(reason "no output")
else()
string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" match "${output}")
if(match)
set(version ${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3})
set(reason "\"${version}\"")
else()
set(reason "no version")
endif()
endif()
set_property(GLOBAL PROPERTY ${FIND_NAME} "${exe}: ${reason}" APPEND)
if(version)
satisfies_range(${version} ${${FIND_VERSION_VARIABLE}} ${variable})
set(${variable} ${${variable}} PARENT_SCOPE)
endif()
endfunction()
set(FIND_VALIDATOR VALIDATOR find_command_version)
endif()
find_program(
${CMD_VARIABLE}
NAMES ${CMD_COMMAND}
PATHS ${CMD_PATHS}
${CMD_VALIDATOR}
${FIND_VARIABLE}
NAMES ${FIND_COMMAND}
PATHS ${FIND_PATHS}
${FIND_VALIDATOR}
)
if(NOT CMD_REQUIRED STREQUAL "OFF" AND ${CMD_VARIABLE} MATCHES "NOTFOUND")
if(CMD_VERSION)
message(FATAL_ERROR "Command not found: \"${CMD_COMMAND}\" that matches version \"${CHECK_COMMAND_VERSION}\"")
if(NOT FIND_REQUIRED STREQUAL "OFF" AND ${FIND_VARIABLE} MATCHES "NOTFOUND")
set(error "Command not found: \"${FIND_NAME}\"")
if(FIND_VERSION)
set(error "${error} that satisfies version \"${${FIND_VERSION_VARIABLE}}\"")
endif()
message(FATAL_ERROR "Command not found: \"${CMD_COMMAND}\"")
get_property(FIND_RESULTS GLOBAL PROPERTY ${FIND_NAME})
if(NOT FIND_RESULTS MATCHES "NOTFOUND")
set(error "${error}\nThe following commands did not satisfy the requirement:")
foreach(result ${FIND_RESULTS})
set(error "${error}\n ${result}")
endforeach()
endif()
set(error "${error}\nTo fix this, either:
1. Install ${FIND_NAME} ${${FIND_VERSION_VARIABLE}}
2. Set -D${FIND_VERSION_VARIABLE}=<version> to require a different version
3. Set -D${FIND_VERSION_VARIABLE}=ignore to allow any version
")
message(FATAL_ERROR ${error})
endif()
if(${CMD_VARIABLE} MATCHES "NOTFOUND")
unset(${CMD_VARIABLE} PARENT_SCOPE)
if(${FIND_VARIABLE} MATCHES "NOTFOUND")
unset(${FIND_VARIABLE} PARENT_SCOPE)
else()
setx(${CMD_VARIABLE} ${${CMD_VARIABLE}} PARENT_SCOPE)
setx(${FIND_VARIABLE} ${${FIND_VARIABLE}} PARENT_SCOPE)
endif()
endfunction()
@@ -377,12 +429,12 @@ function(register_command)
get_source_file_property(generated ${output} GENERATED)
if(generated)
list(REMOVE_ITEM CMD_EFFECTIVE_OUTPUTS ${output})
list(APPEND CMD_EFFECTIVE_OUTPUTS ${output}.always_run)
list(APPEND CMD_EFFECTIVE_OUTPUTS ${output}.always_run_${CMD_TARGET})
endif()
endforeach()
if(CMD_ALWAYS_RUN)
list(APPEND CMD_EFFECTIVE_OUTPUTS ${CMD_CWD}/.always_run)
list(APPEND CMD_EFFECTIVE_OUTPUTS ${CMD_CWD}/.always_run_${CMD_TARGET})
endif()
if(CMD_TARGET_PHASE)
@@ -575,14 +627,6 @@ function(register_repository)
set(GIT_PATH ${VENDOR_PATH}/${GIT_NAME})
endif()
if(GIT_COMMIT)
set(GIT_REF ${GIT_COMMIT})
elseif(GIT_TAG)
set(GIT_REF refs/tags/${GIT_TAG})
else()
set(GIT_REF refs/heads/${GIT_BRANCH})
endif()
set(GIT_EFFECTIVE_OUTPUTS)
foreach(output ${GIT_OUTPUTS})
list(APPEND GIT_EFFECTIVE_OUTPUTS ${GIT_PATH}/${output})
@@ -597,8 +641,10 @@ function(register_repository)
${CMAKE_COMMAND}
-DGIT_PATH=${GIT_PATH}
-DGIT_REPOSITORY=${GIT_REPOSITORY}
-DGIT_REF=${GIT_REF}
-DGIT_NAME=${GIT_NAME}
-DGIT_COMMIT=${GIT_COMMIT}
-DGIT_TAG=${GIT_TAG}
-DGIT_BRANCH=${GIT_BRANCH}
-P ${CWD}/cmake/scripts/GitClone.cmake
OUTPUTS
${GIT_PATH}

View File

@@ -91,6 +91,8 @@ if(LINUX)
optionx(ENABLE_VALGRIND BOOL "If Valgrind support should be enabled" DEFAULT OFF)
endif()
optionx(ENABLE_PRETTIER BOOL "If prettier should be ran" DEFAULT OFF)
if(USE_VALGRIND AND NOT USE_BASELINE)
message(WARNING "If valgrind is enabled, baseline must also be enabled")
setx(USE_BASELINE ON)

View File

@@ -0,0 +1,75 @@
# https://clang.llvm.org/docs/ClangFormat.html
find_command(
VARIABLE
CLANG_FORMAT_PROGRAM
VERSION_VARIABLE
LLVM_VERSION
COMMAND
clang-format
VERSION
${LLVM_VERSION}
REQUIRED
OFF
)
set(CLANG_FORMAT_SOURCES ${BUN_C_SOURCES} ${BUN_CXX_SOURCES})
register_command(
TARGET
clang-format-check
COMMENT
"Running clang-format"
COMMAND
${CLANG_FORMAT_PROGRAM}
-Werror
--dry-run
--verbose
${CLANG_FORMAT_SOURCES}
ALWAYS_RUN
)
register_command(
TARGET
clang-format
COMMENT
"Fixing clang-format"
COMMAND
${CLANG_FORMAT_PROGRAM}
-i # edits files in-place
--verbose
${CLANG_FORMAT_SOURCES}
ALWAYS_RUN
)
if(GIT_CHANGED_SOURCES)
set(CLANG_FORMAT_CHANGED_SOURCES)
foreach(source ${CLANG_FORMAT_SOURCES})
list(FIND GIT_CHANGED_SOURCES ${source} index)
if(NOT ${index} EQUAL -1)
list(APPEND CLANG_FORMAT_CHANGED_SOURCES ${source})
endif()
endforeach()
endif()
if(CLANG_FORMAT_CHANGED_SOURCES)
set(CLANG_FORMAT_DIFF_COMMAND ${CLANG_FORMAT_PROGRAM}
-i # edits files in-place
--verbose
${CLANG_FORMAT_CHANGED_SOURCES}
)
else()
set(CLANG_FORMAT_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for clang-format")
endif()
register_command(
TARGET
clang-format-diff
COMMENT
"Running clang-format on changed files"
COMMAND
${CLANG_FORMAT_DIFF_COMMAND}
CWD
${BUILD_PATH}
ALWAYS_RUN
)

View File

@@ -3,6 +3,8 @@
find_command(
VARIABLE
CLANG_TIDY_PROGRAM
VERSION_VARIABLE
LLVM_VERSION
COMMAND
clang-tidy
VERSION
@@ -11,46 +13,75 @@ find_command(
OFF
)
set(CLANG_TIDY_COMMAND ${CLANG_TIDY_PROGRAM} ${BUN_CPP_SOURCES}
set(CLANG_TIDY_SOURCES ${BUN_C_SOURCES} ${BUN_CXX_SOURCES})
set(CLANG_TIDY_COMMAND ${CLANG_TIDY_PROGRAM}
-p ${BUILD_PATH}
--config-file=${CWD}/.clang-tidy
--fix
--fix-errors
--fix-notes
)
if(CMAKE_COLOR_DIAGNOSTICS)
list(APPEND CLANG_TIDY_COMMAND --use-color)
endif()
# Extra clang-tidy checks that are normally disabled due to noise.
# e.g. JavaScriptCore/Lookup.h
set(CLANG_TIDY_EXTRA_COMMAND ${CLANG_TIDY_PROGRAM}
--checks=performance-*
)
register_command(
TARGET
clang-tidy
COMMENT
"Running clang-tidy"
COMMAND
${CLANG_TIDY_COMMAND}
${CLANG_TIDY_COMMAND}
${CLANG_TIDY_SOURCES}
--fix
--fix-errors
--fix-notes
CWD
${BUILD_PATH}
TARGETS
${bun}
ALWAYS_RUN
)
register_command(
TARGET
clang-tidy-extra
clang-tidy-check
COMMENT
"Running clang-tidy with extra checks"
"Checking clang-tidy"
COMMAND
${CLANG_TIDY_EXTRA_COMMAND}
${CLANG_TIDY_COMMAND}
${CLANG_TIDY_SOURCES}
CWD
${BUILD_PATH}
TARGETS
${bun}
ALWAYS_RUN
)
if(GIT_CHANGED_SOURCES)
set(CLANG_TIDY_CHANGED_SOURCES)
foreach(source ${CLANG_TIDY_SOURCES})
list(FIND GIT_CHANGED_SOURCES ${source} index)
if(NOT ${index} EQUAL -1)
list(APPEND CLANG_TIDY_CHANGED_SOURCES ${source})
endif()
endforeach()
endif()
if(CLANG_TIDY_CHANGED_SOURCES)
set(CLANG_TIDY_DIFF_COMMAND ${CLANG_TIDY_PROGRAM}
${CLANG_TIDY_CHANGED_SOURCES}
--fix
--fix-errors
--fix-notes
)
else()
set(CLANG_TIDY_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for clang-tidy")
endif()
register_command(
TARGET
clang-tidy-diff
COMMENT
"Running clang-tidy on changed files"
COMMAND
${CLANG_TIDY_DIFF_COMMAND}
CWD
${BUILD_PATH}
ALWAYS_RUN
)

View File

@@ -1,7 +1,7 @@
# IWYU = "Include What You Use"
# https://include-what-you-use.org/
setx(IWYU_SOURCE_PATH ${CACHE_PATH}/iwyu-${LLVM_VERSION_MAJOR})
setx(IWYU_SOURCE_PATH ${CACHE_PATH}/iwyu-${LLVM_VERSION})
setx(IWYU_BUILD_PATH ${IWYU_SOURCE_PATH}/build)
setx(IWYU_PROGRAM ${IWYU_BUILD_PATH}/bin/include-what-you-use)
@@ -11,7 +11,7 @@ register_repository(
REPOSITORY
include-what-you-use/include-what-you-use
BRANCH
clang_${LLVM_VERSION_MAJOR}
clang_${LLVM_VERSION}
PATH
${IWYU_SOURCE_PATH}
)

View File

@@ -0,0 +1,123 @@
if(CMAKE_HOST_WIN32)
setx(PRETTIER_EXECUTABLE ${CWD}/node_modules/.bin/prettier.exe)
else()
setx(PRETTIER_EXECUTABLE ${CWD}/node_modules/.bin/prettier)
endif()
set(PRETTIER_PATHS
${CWD}/src
${CWD}/packages/bun-error
${CWD}/packages/bun-types
${CWD}/packages/bun-inspector-protocol
${CWD}/packages/bun-inspector-frontend
${CWD}/packages/bun-debug-adapter-protocol
${CWD}/packages/bun-vscode
${CWD}/test
${CWD}/bench
${CWD}/.vscode
${CWD}/.buildkite
${CWD}/.github
)
set(PRETTIER_EXTENSIONS
*.jsonc?
*.ya?ml
*.jsx?
*.tsx?
*.mjs
*.cjs
*.mts
*.cts
)
set(PRETTIER_GLOBS)
foreach(path ${PRETTIER_PATHS})
foreach(extension ${PRETTIER_EXTENSIONS})
list(APPEND PRETTIER_GLOBS ${path}/${extension})
endforeach()
endforeach()
file(GLOB_RECURSE PRETTIER_SOURCES ${PRETTIER_GLOBS})
register_command(
COMMAND
${BUN_EXECUTABLE}
install
--frozen-lockfile
SOURCES
${CWD}/package.json
OUTPUTS
${PRETTIER_EXECUTABLE}
)
set(PRETTIER_COMMAND ${PRETTIER_EXECUTABLE}
--config=${CWD}/.prettierrc
--cache
)
register_command(
TARGET
prettier
COMMENT
"Running prettier"
COMMAND
${PRETTIER_COMMAND}
--write
${PRETTIER_SOURCES}
ALWAYS_RUN
)
register_command(
TARGET
prettier-extra
COMMENT
"Running prettier with extra plugins"
COMMAND
${PRETTIER_COMMAND}
--write
--plugin=prettier-plugin-organize-imports
${PRETTIER_SOURCES}
ALWAYS_RUN
)
register_command(
TARGET
prettier-check
COMMENT
"Checking prettier"
COMMAND
${PRETTIER_COMMAND}
--check
${PRETTIER_SOURCES}
ALWAYS_RUN
)
if(GIT_CHANGED_SOURCES)
set(PRETTIER_CHANGED_SOURCES)
foreach(source ${PRETTIER_SOURCES})
list(FIND GIT_CHANGED_SOURCES ${source} index)
if(NOT ${index} EQUAL -1)
list(APPEND PRETTIER_CHANGED_SOURCES ${source})
endif()
endforeach()
endif()
if(PRETTIER_CHANGED_SOURCES)
set(PRETTIER_DIFF_COMMAND ${PRETTIER_COMMAND}
--write
--plugin=prettier-plugin-organize-imports
${PRETTIER_CHANGED_SOURCES}
)
else()
set(PRETTIER_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for prettier")
endif()
register_command(
TARGET
prettier-diff
COMMENT
"Running prettier on changed files"
COMMAND
${PRETTIER_DIFF_COMMAND}
ALWAYS_RUN
)

View File

@@ -0,0 +1,57 @@
set(ZIG_FORMAT_SOURCES ${BUN_ZIG_SOURCES})
register_command(
TARGET
zig-format-check
COMMENT
"Checking zig fmt"
COMMAND
${ZIG_EXECUTABLE}
fmt
--check
${ZIG_FORMAT_SOURCES}
ALWAYS_RUN
)
register_command(
TARGET
zig-format
COMMENT
"Running zig fmt"
COMMAND
${ZIG_EXECUTABLE}
fmt
${ZIG_FORMAT_SOURCES}
ALWAYS_RUN
)
if(GIT_CHANGED_SOURCES)
set(ZIG_FORMAT_CHANGED_SOURCES)
foreach(source ${ZIG_FORMAT_SOURCES})
list(FIND GIT_CHANGED_SOURCES ${source} index)
if(NOT ${index} EQUAL -1)
list(APPEND ZIG_FORMAT_CHANGED_SOURCES ${source})
endif()
endforeach()
endif()
if(ZIG_FORMAT_CHANGED_SOURCES)
set(ZIG_FORMAT_DIFF_COMMAND ${ZIG_EXECUTABLE}
fmt
${ZIG_FORMAT_CHANGED_SOURCES}
)
else()
set(ZIG_FORMAT_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for zig-format")
endif()
register_command(
TARGET
zig-format-diff
COMMENT
"Running zig fmt on changed files"
COMMAND
${ZIG_FORMAT_DIFF_COMMAND}
CWD
${BUILD_PATH}
ALWAYS_RUN
)

View File

@@ -0,0 +1,129 @@
get_filename_component(SCRIPT_NAME ${CMAKE_CURRENT_LIST_FILE} NAME)
message(STATUS "Running script: ${SCRIPT_NAME}")
if(NOT DOWNLOAD_URL OR NOT DOWNLOAD_PATH)
message(FATAL_ERROR "DOWNLOAD_URL and DOWNLOAD_PATH are required")
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(TMP_PATH $ENV{TEMP})
else()
set(TMP_PATH $ENV{TMPDIR})
endif()
if(NOT TMP_PATH)
set(TMP_PATH ${CMAKE_BINARY_DIR}/tmp)
endif()
string(REGEX REPLACE "/+$" "" TMP_PATH ${TMP_PATH})
string(REGEX REPLACE "[^a-zA-Z0-9]" "-" DOWNLOAD_ID ${DOWNLOAD_URL})
string(RANDOM LENGTH 8 RANDOM_ID)
set(DOWNLOAD_TMP_PATH ${TMP_PATH}/${DOWNLOAD_ID}-${RANDOM_ID})
set(DOWNLOAD_TMP_FILE ${DOWNLOAD_TMP_PATH}/tmp)
file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH})
if(DOWNLOAD_ACCEPT_HEADER)
set(DOWNLOAD_ACCEPT_HEADER "Accept: ${DOWNLOAD_ACCEPT_HEADER}")
else()
set(DOWNLOAD_ACCEPT_HEADER "Accept: */*")
endif()
foreach(i RANGE 10)
set(DOWNLOAD_TMP_FILE_${i} ${DOWNLOAD_TMP_FILE}.${i})
if(i EQUAL 0)
message(STATUS "Downloading ${DOWNLOAD_URL}...")
else()
message(STATUS "Downloading ${DOWNLOAD_URL}... (retry ${i})")
endif()
file(DOWNLOAD
${DOWNLOAD_URL}
${DOWNLOAD_TMP_FILE_${i}}
HTTPHEADER "User-Agent: cmake/${CMAKE_VERSION}"
HTTPHEADER ${DOWNLOAD_ACCEPT_HEADER}
STATUS DOWNLOAD_STATUS
INACTIVITY_TIMEOUT 60
TIMEOUT 180
SHOW_PROGRESS
)
list(GET DOWNLOAD_STATUS 0 DOWNLOAD_STATUS_CODE)
if(DOWNLOAD_STATUS_CODE EQUAL 0)
if(NOT EXISTS ${DOWNLOAD_TMP_FILE_${i}})
message(WARNING "Download failed: result is ok, but file does not exist: ${DOWNLOAD_TMP_FILE_${i}}")
continue()
endif()
file(RENAME ${DOWNLOAD_TMP_FILE_${i}} ${DOWNLOAD_TMP_FILE})
break()
endif()
list(GET DOWNLOAD_STATUS 1 DOWNLOAD_STATUS_TEXT)
file(REMOVE ${DOWNLOAD_TMP_FILE_${i}})
message(WARNING "Download failed: ${DOWNLOAD_STATUS_CODE} ${DOWNLOAD_STATUS_TEXT}")
endforeach()
if(NOT EXISTS ${DOWNLOAD_TMP_FILE})
file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH})
message(FATAL_ERROR "Download failed after too many attempts: ${DOWNLOAD_URL}")
endif()
get_filename_component(DOWNLOAD_FILENAME ${DOWNLOAD_URL} NAME)
if(DOWNLOAD_FILENAME MATCHES "\\.(zip|tar|gz|xz)$")
message(STATUS "Extracting ${DOWNLOAD_FILENAME}...")
set(DOWNLOAD_TMP_EXTRACT ${DOWNLOAD_TMP_PATH}/extract)
file(ARCHIVE_EXTRACT
INPUT ${DOWNLOAD_TMP_FILE}
DESTINATION ${DOWNLOAD_TMP_EXTRACT}
TOUCH
)
file(REMOVE ${DOWNLOAD_TMP_FILE})
if(DOWNLOAD_FILTERS)
list(TRANSFORM DOWNLOAD_FILTERS PREPEND ${DOWNLOAD_TMP_EXTRACT}/ OUTPUT_VARIABLE DOWNLOAD_GLOBS)
else()
set(DOWNLOAD_GLOBS ${DOWNLOAD_TMP_EXTRACT}/*)
endif()
file(GLOB DOWNLOAD_TMP_EXTRACT_PATHS LIST_DIRECTORIES ON ${DOWNLOAD_GLOBS})
list(LENGTH DOWNLOAD_TMP_EXTRACT_PATHS DOWNLOAD_COUNT)
if(DOWNLOAD_COUNT EQUAL 0)
file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH})
if(DOWNLOAD_FILTERS)
message(FATAL_ERROR "Extract failed: No files found matching ${DOWNLOAD_FILTERS}")
else()
message(FATAL_ERROR "Extract failed: No files found")
endif()
endif()
if(DOWNLOAD_FILTERS)
set(DOWNLOAD_TMP_FILE ${DOWNLOAD_TMP_EXTRACT_PATHS})
elseif(DOWNLOAD_COUNT EQUAL 1)
list(GET DOWNLOAD_TMP_EXTRACT_PATHS 0 DOWNLOAD_TMP_FILE)
get_filename_component(DOWNLOAD_FILENAME ${DOWNLOAD_TMP_FILE} NAME)
message(STATUS "Hoisting ${DOWNLOAD_FILENAME}...")
else()
set(DOWNLOAD_TMP_FILE ${DOWNLOAD_TMP_EXTRACT})
endif()
endif()
if(DOWNLOAD_FILTERS)
foreach(file ${DOWNLOAD_TMP_FILE})
file(RENAME ${file} ${DOWNLOAD_PATH})
endforeach()
else()
file(REMOVE_RECURSE ${DOWNLOAD_PATH})
get_filename_component(DOWNLOAD_PARENT_PATH ${DOWNLOAD_PATH} DIRECTORY)
file(MAKE_DIRECTORY ${DOWNLOAD_PARENT_PATH})
file(RENAME ${DOWNLOAD_TMP_FILE} ${DOWNLOAD_PATH})
endif()
file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH})
message(STATUS "Saved ${DOWNLOAD_PATH}")

View File

@@ -0,0 +1,96 @@
get_filename_component(SCRIPT_NAME ${CMAKE_CURRENT_LIST_FILE} NAME)
message(STATUS "Running script: ${SCRIPT_NAME}")
if(NOT ZIG_PATH OR NOT ZIG_COMMIT OR NOT ZIG_VERSION)
message(FATAL_ERROR "ZIG_PATH, ZIG_COMMIT, and ZIG_VERSION are required")
endif()
if(CMAKE_HOST_APPLE)
set(ZIG_OS "macos")
elseif(CMAKE_HOST_WIN32)
set(ZIG_OS "windows")
elseif(CMAKE_HOST_UNIX)
set(ZIG_OS "linux")
else()
message(FATAL_ERROR "Unsupported operating system: ${CMAKE_HOST_SYSTEM_NAME}")
endif()
# In script mode, using -P, this variable is not set
if(NOT DEFINED CMAKE_HOST_SYSTEM_PROCESSOR)
cmake_host_system_information(RESULT CMAKE_HOST_SYSTEM_PROCESSOR QUERY OS_PLATFORM)
endif()
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64|ARM64|aarch64|AARCH64")
set(ZIG_ARCH "aarch64")
elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|AMD64|x86_64|X86_64|x64|X64")
set(ZIG_ARCH "x86_64")
else()
message(FATAL_ERROR "Unsupported architecture: ${CMAKE_HOST_SYSTEM_PROCESSOR}")
endif()
set(ZIG_NAME zig-${ZIG_OS}-${ZIG_ARCH}-${ZIG_VERSION})
if(CMAKE_HOST_WIN32)
set(ZIG_EXE "zig.exe")
set(ZIG_FILENAME ${ZIG_NAME}.zip)
else()
set(ZIG_EXE "zig")
set(ZIG_FILENAME ${ZIG_NAME}.tar.xz)
endif()
set(ZIG_DOWNLOAD_URL https://ziglang.org/download/${ZIG_VERSION}/${ZIG_FILENAME})
execute_process(
COMMAND
${CMAKE_COMMAND}
-DDOWNLOAD_URL=${ZIG_DOWNLOAD_URL}
-DDOWNLOAD_PATH=${ZIG_PATH}
-P ${CMAKE_CURRENT_LIST_DIR}/DownloadUrl.cmake
ERROR_STRIP_TRAILING_WHITESPACE
ERROR_VARIABLE
ZIG_DOWNLOAD_ERROR
RESULT_VARIABLE
ZIG_DOWNLOAD_RESULT
)
if(NOT ZIG_DOWNLOAD_RESULT EQUAL 0)
message(FATAL_ERROR "Download failed: ${ZIG_DOWNLOAD_ERROR}")
endif()
if(NOT EXISTS ${ZIG_PATH}/${ZIG_EXE})
message(FATAL_ERROR "Executable not found: \"${ZIG_PATH}/${ZIG_EXE}\"")
endif()
# Tools like VSCode need a stable path to the zig executable, on both Unix and Windows
# To workaround this, we create a `bun.exe` symlink on Unix.
if(NOT WIN32)
file(CREATE_LINK ${ZIG_PATH}/${ZIG_EXE} ${ZIG_PATH}/zig.exe SYMBOLIC)
endif()
set(ZIG_REPOSITORY_PATH ${ZIG_PATH}/repository)
execute_process(
COMMAND
${CMAKE_COMMAND}
-DGIT_PATH=${ZIG_REPOSITORY_PATH}
-DGIT_REPOSITORY=oven-sh/zig
-DGIT_COMMIT=${ZIG_COMMIT}
-P ${CMAKE_CURRENT_LIST_DIR}/GitClone.cmake
ERROR_STRIP_TRAILING_WHITESPACE
ERROR_VARIABLE
ZIG_REPOSITORY_ERROR
RESULT_VARIABLE
ZIG_REPOSITORY_RESULT
)
if(NOT ZIG_REPOSITORY_RESULT EQUAL 0)
message(FATAL_ERROR "Download failed: ${ZIG_REPOSITORY_ERROR}")
endif()
file(REMOVE_RECURSE ${ZIG_PATH}/lib)
# Use copy_directory instead of file(RENAME) because there were
# race conditions in CI where some files were not copied.
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${ZIG_REPOSITORY_PATH}/lib ${ZIG_PATH}/lib)
file(REMOVE_RECURSE ${ZIG_REPOSITORY_PATH})

View File

@@ -1,74 +1,85 @@
include(cmake/Globals.cmake)
get_filename_component(SCRIPT_NAME ${CMAKE_CURRENT_LIST_FILE} NAME)
message(STATUS "Running script: ${SCRIPT_NAME}")
if(NOT GIT_PATH OR NOT GIT_REPOSITORY OR NOT GIT_REF)
message(FATAL_ERROR "git_clone: GIT_PATH, GIT_REPOSITORY, and GIT_REF are required")
if(NOT GIT_PATH OR NOT GIT_REPOSITORY)
message(FATAL_ERROR "GIT_PATH and GIT_REPOSITORY are required")
endif()
setx(GIT_PATH ${GIT_PATH})
setx(GIT_REPOSITORY ${GIT_REPOSITORY})
setx(GIT_REF ${GIT_REF})
if(GIT_COMMIT)
set(GIT_REF ${GIT_COMMIT})
elseif(GIT_TAG)
set(GIT_REF refs/tags/${GIT_TAG})
elseif(GIT_BRANCH)
set(GIT_REF refs/heads/${GIT_BRANCH})
else()
message(FATAL_ERROR "GIT_COMMIT, GIT_TAG, or GIT_BRANCH are required")
endif()
string(REGEX MATCH "([^/]+)$" GIT_ORIGINAL_NAME ${GIT_REPOSITORY})
if(NOT GIT_NAME)
setx(GIT_NAME ${GIT_ORIGINAL_NAME})
set(GIT_NAME ${GIT_ORIGINAL_NAME})
endif()
set(GIT_REF_PATH ${GIT_PATH}/.ref)
set(GIT_DOWNLOAD_URL https://github.com/${GIT_REPOSITORY}/archive/${GIT_REF}.tar.gz)
if(EXISTS ${GIT_REF_PATH})
file(READ ${GIT_REF_PATH} GIT_CACHED_REF)
if(GIT_CACHED_REF STREQUAL GIT_REF)
return()
endif()
message(STATUS "Cloning ${GIT_REPOSITORY} at ${GIT_REF}...")
execute_process(
COMMAND
${CMAKE_COMMAND}
-DDOWNLOAD_URL=${GIT_DOWNLOAD_URL}
-DDOWNLOAD_PATH=${GIT_PATH}
-DDOWNLOAD_FILTERS=${GIT_FILTERS}
-P ${CMAKE_CURRENT_LIST_DIR}/DownloadUrl.cmake
ERROR_STRIP_TRAILING_WHITESPACE
ERROR_VARIABLE
GIT_ERROR
RESULT_VARIABLE
GIT_RESULT
)
if(NOT GIT_RESULT EQUAL 0)
message(FATAL_ERROR "Clone failed: ${GIT_ERROR}")
endif()
setx(GIT_DOWNLOAD_PATH ${GIT_PATH}.tar.gz)
setx(GIT_DOWNLOAD_URL https://github.com/${GIT_REPOSITORY}/archive/${GIT_REF}.tar.gz)
foreach(i RANGE 10)
set(GIT_DOWNLOAD_TMP_PATH ${GIT_PATH}.tmp.${i})
file(DOWNLOAD
${GIT_DOWNLOAD_URL}
${GIT_DOWNLOAD_TMP_PATH}
TIMEOUT 120
STATUS GIT_DOWNLOAD_STATUS
SHOW_PROGRESS
)
if(GIT_DOWNLOAD_STATUS MATCHES "^0" AND EXISTS ${GIT_DOWNLOAD_TMP_PATH})
file(RENAME ${GIT_DOWNLOAD_TMP_PATH} ${GIT_DOWNLOAD_PATH})
break()
endif()
message(WARNING "git_clone: ${GIT_DOWNLOAD_STATUS}: ${GIT_DOWNLOAD_URL}")
file(REMOVE ${GIT_DOWNLOAD_TMP_PATH})
endforeach()
if(NOT EXISTS ${GIT_DOWNLOAD_PATH})
message(FATAL_ERROR "git_clone: failed to download ${GIT_DOWNLOAD_URL}")
endif()
file(REMOVE_RECURSE ${GIT_PATH})
get_filename_component(GIT_PARENT_PATH ${GIT_PATH} DIRECTORY)
file(ARCHIVE_EXTRACT INPUT ${GIT_DOWNLOAD_PATH} DESTINATION ${GIT_PARENT_PATH}/tmp-${GIT_ORIGINAL_NAME} TOUCH)
file(GLOB GIT_TMP_PATH LIST_DIRECTORIES ON ${GIT_PARENT_PATH}/tmp-${GIT_ORIGINAL_NAME}/${GIT_ORIGINAL_NAME}-*)
file(RENAME ${GIT_TMP_PATH} ${GIT_PATH})
file(REMOVE_RECURSE ${GIT_PARENT_PATH}/tmp-${GIT_ORIGINAL_NAME})
file(REMOVE ${GIT_DOWNLOAD_PATH})
file(GLOB_RECURSE GIT_PATCH_PATHS ${CMAKE_SOURCE_DIR}/patches/${GIT_NAME}/*)
foreach(GIT_PATCH_PATH ${GIT_PATCH_PATHS})
if(GIT_PATCH_PATH MATCHES "\\.patch$")
execute_process(
COMMAND git apply --ignore-whitespace --ignore-space-change --no-index --verbose ${GIT_PATCH_PATH}
WORKING_DIRECTORY ${GIT_PATH}
RESULT_VARIABLE GIT_PATCH_RESULT
)
if(NOT GIT_PATCH_RESULT EQUAL 0)
message(FATAL_ERROR "git_clone: failed to apply patch: ${GIT_PATCH_PATH}")
endif()
else()
file(COPY ${GIT_PATCH_PATH} DESTINATION ${GIT_PATH})
endif()
endforeach()
list(LENGTH GIT_PATCH_PATHS GIT_PATCH_COUNT)
file(WRITE ${GIT_REF_PATH} ${GIT_REF})
if(GIT_PATCH_COUNT GREATER 0)
find_program(GIT_PROGRAM git REQUIRED)
foreach(GIT_PATCH ${GIT_PATCH_PATHS})
get_filename_component(GIT_PATCH_NAME ${GIT_PATCH} NAME)
if(GIT_PATCH_NAME MATCHES "\\.patch$")
message(STATUS "Applying patch ${GIT_PATCH_NAME}...")
execute_process(
COMMAND
${GIT_PROGRAM}
apply
--ignore-whitespace
--ignore-space-change
--no-index
--verbose
${GIT_PATCH}
WORKING_DIRECTORY
${GIT_PATH}
ERROR_STRIP_TRAILING_WHITESPACE
ERROR_VARIABLE
GIT_PATCH_ERROR
RESULT_VARIABLE
GIT_PATCH_RESULT
)
if(NOT GIT_PATCH_RESULT EQUAL 0 AND NOT GIT_PATCH_ERROR MATCHES "cleanly")
file(REMOVE_RECURSE ${GIT_PATH})
message(FATAL_ERROR "Failed to apply patch: ${GIT_PATCH_ERROR}")
endif()
else()
message(STATUS "Copying file ${GIT_PATCH_NAME}...")
file(COPY ${GIT_PATCH} DESTINATION ${GIT_PATH})
endif()
endforeach()
endif()
file(WRITE ${GIT_PATH}/.ref ${GIT_REF})
message(STATUS "Cloned ${GIT_REPOSITORY}")

View File

@@ -54,16 +54,16 @@ register_command(
COMMENT
"Generating src/js_lexer/*.blob"
COMMAND
${CMAKE_ZIG_COMPILER}
${ZIG_EXECUTABLE}
run
${CMAKE_ZIG_FLAGS}
${BUN_ZIG_IDENTIFIER_SCRIPT}
SOURCES
${BUN_ZIG_IDENTIFIER_SOURCES}
OUTPUTS
${BUN_ZIG_IDENTIFIER_OUTPUTS}
TARGETS
clone-zig
OUTPUTS
${BUN_ZIG_IDENTIFIER_OUTPUTS}
)
set(BUN_ERROR_SOURCE ${CWD}/packages/bun-error)
@@ -324,40 +324,41 @@ register_command(
${BUN_JAVASCRIPT_OUTPUTS}
)
set(BUN_KIT_RUNTIME_CODEGEN_SCRIPT ${CWD}/src/codegen/kit-codegen.ts)
set(BUN_BAKE_RUNTIME_CODEGEN_SCRIPT ${CWD}/src/codegen/bake-codegen.ts)
file(GLOB_RECURSE BUN_KIT_RUNTIME_SOURCES ${CONFIGURE_DEPENDS}
${CWD}/src/kit/*.ts
${CWD}/src/kit/*/*.ts
file(GLOB_RECURSE BUN_BAKE_RUNTIME_SOURCES ${CONFIGURE_DEPENDS}
${CWD}/src/bake/*.ts
${CWD}/src/bake/*/*.ts
${CWD}/src/bake/*/*.css
)
list(APPEND BUN_KIT_RUNTIME_CODEGEN_SOURCES
list(APPEND BUN_BAKE_RUNTIME_CODEGEN_SOURCES
${CWD}/src/bun.js/bindings/InternalModuleRegistry.cpp
)
set(BUN_KIT_RUNTIME_OUTPUTS
${CODEGEN_PATH}/kit_empty_file
${CODEGEN_PATH}/kit.client.js
${CODEGEN_PATH}/kit.server.js
set(BUN_BAKE_RUNTIME_OUTPUTS
${CODEGEN_PATH}/bake.client.js
${CODEGEN_PATH}/bake.server.js
)
register_command(
TARGET
bun-kit-codegen
bun-bake-codegen
COMMENT
"Bundling Kit Runtime"
COMMAND
${BUN_EXECUTABLE}
run
${BUN_KIT_RUNTIME_CODEGEN_SCRIPT}
${BUN_BAKE_RUNTIME_CODEGEN_SCRIPT}
--debug=${DEBUG}
--codegen_root=${CODEGEN_PATH}
SOURCES
${BUN_KIT_RUNTIME_SOURCES}
${BUN_KIT_RUNTIME_CODEGEN_SOURCES}
${BUN_KIT_RUNTIME_CODEGEN_SCRIPT}
${BUN_BAKE_RUNTIME_SOURCES}
${BUN_BAKE_RUNTIME_CODEGEN_SOURCES}
${BUN_BAKE_RUNTIME_CODEGEN_SCRIPT}
OUTPUTS
${BUN_KIT_RUNTIME_OUTPUTS}
${CODEGEN_PATH}/bake_empty_file
${BUN_BAKE_RUNTIME_OUTPUTS}
)
set(BUN_JS_SINK_SCRIPT ${CWD}/src/codegen/generate-jssink.ts)
@@ -398,6 +399,7 @@ set(BUN_OBJECT_LUT_SOURCES
${CWD}/src/bun.js/bindings/BunProcess.cpp
${CWD}/src/bun.js/bindings/ProcessBindingConstants.cpp
${CWD}/src/bun.js/bindings/ProcessBindingNatives.cpp
${CWD}/src/bun.js/modules/NodeModuleModule.cpp
)
set(BUN_OBJECT_LUT_OUTPUTS
@@ -407,8 +409,10 @@ set(BUN_OBJECT_LUT_OUTPUTS
${CODEGEN_PATH}/BunProcess.lut.h
${CODEGEN_PATH}/ProcessBindingConstants.lut.h
${CODEGEN_PATH}/ProcessBindingNatives.lut.h
${CODEGEN_PATH}/NodeModuleModule.lut.h
)
macro(WEBKIT_ADD_SOURCE_DEPENDENCIES _source _deps)
set(_tmp)
get_source_file_property(_tmp ${_source} OBJECT_DEPENDS)
@@ -484,6 +488,9 @@ list(APPEND BUN_ZIG_SOURCES
${CWD}/build.zig
${CWD}/root.zig
${CWD}/root_wasm.zig
)
set(BUN_ZIG_GENERATED_SOURCES
${BUN_ZIG_IDENTIFIER_OUTPUTS}
${BUN_ERROR_OUTPUTS}
${BUN_FALLBACK_DECODER_OUTPUT}
@@ -496,9 +503,9 @@ list(APPEND BUN_ZIG_SOURCES
# In debug builds, these are not embedded, but rather referenced at runtime.
if (DEBUG)
list(APPEND BUN_ZIG_SOURCES ${CODEGEN_PATH}/kit_empty_file)
list(APPEND BUN_ZIG_GENERATED_SOURCES ${CODEGEN_PATH}/bake_empty_file)
else()
list(APPEND BUN_ZIG_SOURCES ${BUN_KIT_RUNTIME_OUTPUTS})
list(APPEND BUN_ZIG_GENERATED_SOURCES ${BUN_BAKE_RUNTIME_OUTPUTS})
endif()
set(BUN_ZIG_OUTPUT ${BUILD_PATH}/bun-zig.o)
@@ -527,7 +534,7 @@ register_command(
COMMENT
"Building src/*.zig for ${ZIG_TARGET}"
COMMAND
${CMAKE_ZIG_COMPILER}
${ZIG_EXECUTABLE}
build obj
${CMAKE_ZIG_FLAGS}
--prefix ${BUILD_PATH}
@@ -543,10 +550,11 @@ register_command(
-Dgenerated-code=${CODEGEN_PATH}
ARTIFACTS
${BUN_ZIG_OUTPUT}
SOURCES
${BUN_ZIG_SOURCES}
TARGETS
clone-zig
SOURCES
${BUN_ZIG_SOURCES}
${BUN_ZIG_GENERATED_SOURCES}
)
set_property(TARGET bun-zig PROPERTY JOB_POOL compile_pool)
@@ -565,7 +573,8 @@ file(GLOB BUN_CXX_SOURCES ${CONFIGURE_DEPENDS}
${CWD}/src/bun.js/bindings/webcrypto/*.cpp
${CWD}/src/bun.js/bindings/webcrypto/*/*.cpp
${CWD}/src/bun.js/bindings/v8/*.cpp
${CWD}/src/kit/*.cpp
${CWD}/src/bun.js/bindings/v8/shim/*.cpp
${CWD}/src/bake/*.cpp
${CWD}/src/deps/*.cpp
${BUN_USOCKETS_SOURCE}/src/crypto/*.cpp
)
@@ -577,6 +586,10 @@ file(GLOB BUN_C_SOURCES ${CONFIGURE_DEPENDS}
${BUN_USOCKETS_SOURCE}/src/crypto/*.c
)
if(WIN32)
list(APPEND BUN_C_SOURCES ${CWD}/src/bun.js/bindings/windows/musl-memmem.c)
endif()
register_repository(
NAME
picohttpparser
@@ -588,15 +601,27 @@ register_repository(
picohttpparser.c
)
list(APPEND BUN_C_SOURCES ${VENDOR_PATH}/picohttpparser/picohttpparser.c)
set(NODEJS_HEADERS_PATH ${VENDOR_PATH}/nodejs)
if(WIN32)
list(APPEND BUN_C_SOURCES ${CWD}/src/bun.js/bindings/windows/musl-memmem.c)
endif()
register_command(
TARGET
bun-node-headers
COMMENT
"Download node ${NODEJS_VERSION} headers"
COMMAND
${CMAKE_COMMAND}
-DDOWNLOAD_PATH=${NODEJS_HEADERS_PATH}
-DDOWNLOAD_URL=https://nodejs.org/dist/v${NODEJS_VERSION}/node-v${NODEJS_VERSION}-headers.tar.gz
-P ${CWD}/cmake/scripts/DownloadUrl.cmake
OUTPUTS
${NODEJS_HEADERS_PATH}/include/node/node_version.h
)
list(APPEND BUN_CPP_SOURCES
${BUN_C_SOURCES}
${BUN_CXX_SOURCES}
${VENDOR_PATH}/picohttpparser/picohttpparser.c
${NODEJS_HEADERS_PATH}/include/node/node_version.h
${BUN_ZIG_GENERATED_CLASSES_OUTPUTS}
${BUN_JS_SINK_OUTPUTS}
${BUN_JAVASCRIPT_OUTPUTS}
@@ -674,6 +699,7 @@ target_include_directories(${bun} PRIVATE
${CWD}/src/bun.js/bindings/webcore
${CWD}/src/bun.js/bindings/webcrypto
${CWD}/src/bun.js/bindings/sqlite
${CWD}/src/bun.js/bindings/v8
${CWD}/src/bun.js/modules
${CWD}/src/js/builtins
${CWD}/src/napi
@@ -681,6 +707,7 @@ target_include_directories(${bun} PRIVATE
${CODEGEN_PATH}
${VENDOR_PATH}
${VENDOR_PATH}/picohttpparser
${NODEJS_HEADERS_PATH}/include
)
# --- C/C++ Definitions ---
@@ -820,8 +847,34 @@ elseif(APPLE)
-fno-keep-static-consts
)
else()
# Try to use lld-16 if available, otherwise fallback to lld
# Cache it so we don't have to re-run CMake to pick it up
if((NOT DEFINED LLD_NAME) AND (NOT CI OR BUN_LINK_ONLY))
find_program(LLD_EXECUTABLE_NAME lld-${LLVM_VERSION_MAJOR})
if(NOT LLD_EXECUTABLE_NAME)
if(CI)
# Ensure we don't use a differing version of lld in CI vs clang
message(FATAL_ERROR "lld-${LLVM_VERSION_MAJOR} not found. Please make sure you have LLVM ${LLVM_VERSION_MAJOR}.x installed and set to lld-${LLVM_VERSION_MAJOR}")
endif()
# To make it easier for contributors, allow differing versions of lld vs clang/cmake
find_program(LLD_EXECUTABLE_NAME lld)
endif()
if(NOT LLD_EXECUTABLE_NAME)
message(FATAL_ERROR "LLD not found. Please make sure you have LLVM ${LLVM_VERSION_MAJOR}.x installed and lld is available in your PATH as lld-${LLVM_VERSION_MAJOR}")
endif()
# normalize to basename so it can be used with -fuse-ld
get_filename_component(LLD_NAME ${LLD_EXECUTABLE_NAME} NAME CACHE)
message(STATUS "Using linker: ${LLD_NAME} (${LLD_EXECUTABLE_NAME})")
elseif(NOT DEFINED LLD_NAME)
set(LLD_NAME lld-${LLVM_VERSION_MAJOR})
endif()
target_link_options(${bun} PUBLIC
-fuse-ld=lld-${LLVM_VERSION_MAJOR}
-fuse-ld=${LLD_NAME}
-fno-pic
-static-libstdc++
-static-libgcc
@@ -830,26 +883,33 @@ else()
-Wl,--as-needed
-Wl,--gc-sections
-Wl,-z,stack-size=12800000
-Wl,--wrap=fcntl
-Wl,--wrap=fcntl64
-Wl,--wrap=stat64
-Wl,--wrap=pow
-Wl,--wrap=cosf
-Wl,--wrap=exp
-Wl,--wrap=expf
-Wl,--wrap=log
-Wl,--wrap=log2
-Wl,--wrap=lstat
-Wl,--wrap=stat64
-Wl,--wrap=stat
-Wl,--wrap=fcntl
-Wl,--wrap=fcntl64
-Wl,--wrap=fmod
-Wl,--wrap=fmodf
-Wl,--wrap=fstat
-Wl,--wrap=fstatat
-Wl,--wrap=lstat64
-Wl,--wrap=fstat64
-Wl,--wrap=fstatat
-Wl,--wrap=fstatat64
-Wl,--wrap=log
-Wl,--wrap=log10f
-Wl,--wrap=log2
-Wl,--wrap=log2f
-Wl,--wrap=logf
-Wl,--wrap=lstat
-Wl,--wrap=lstat64
-Wl,--wrap=mknod
-Wl,--wrap=mknodat
-Wl,--wrap=pow
-Wl,--wrap=sincosf
-Wl,--wrap=sinf
-Wl,--wrap=stat
-Wl,--wrap=stat64
-Wl,--wrap=statx
-Wl,--wrap=fmod
-Wl,--wrap=tanf
-Wl,--compress-debug-sections=zlib
-Wl,-z,lazy
-Wl,-z,norelro

View File

@@ -0,0 +1,43 @@
find_command(
VARIABLE
GIT_PROGRAM
COMMAND
git
REQUIRED
OFF
)
if(NOT GIT_PROGRAM)
return()
endif()
set(GIT_DIFF_COMMAND ${GIT_PROGRAM} diff --no-color --name-only --diff-filter=AMCR origin/main HEAD)
execute_process(
COMMAND
${GIT_DIFF_COMMAND}
WORKING_DIRECTORY
${CWD}
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE
GIT_DIFF
ERROR_STRIP_TRAILING_WHITESPACE
ERROR_VARIABLE
GIT_DIFF_ERROR
RESULT_VARIABLE
GIT_DIFF_RESULT
)
if(NOT GIT_DIFF_RESULT EQUAL 0)
message(${WARNING} "Command failed: ${GIT_DIFF_COMMAND} ${GIT_DIFF_ERROR}")
return()
endif()
string(REPLACE "\n" ";" GIT_CHANGED_SOURCES "${GIT_DIFF}")
if(CI)
setx(GIT_CHANGED_SOURCES ${GIT_CHANGED_SOURCES})
endif()
list(TRANSFORM GIT_CHANGED_SOURCES PREPEND ${CWD}/)
list(LENGTH GIT_CHANGED_SOURCES GIT_CHANGED_SOURCES_COUNT)

View File

@@ -5,45 +5,68 @@ else()
endif()
optionx(LLVM_VERSION STRING "The version of LLVM to use" DEFAULT ${DEFAULT_LLVM_VERSION})
parse_semver(${LLVM_VERSION} LLVM)
string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" match ${LLVM_VERSION})
if(NOT match)
return()
endif()
set(LLVM_VERSION_MAJOR ${CMAKE_MATCH_1})
set(LLVM_VERSION_MINOR ${CMAKE_MATCH_2})
set(LLVM_VERSION_PATCH ${CMAKE_MATCH_3})
set(LLVM_PATHS)
if(APPLE)
execute_process(
COMMAND brew --prefix llvm@${LLVM_VERSION_MAJOR}
OUTPUT_VARIABLE DEFAULT_LLVM_PREFIX
COMMAND brew --prefix
OUTPUT_VARIABLE HOMEBREW_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if(NOT DEFAULT_LLVM_PREFIX)
set(DEFAULT_LLVM_PREFIX /opt/homebrew/opt/llvm)
if(NOT HOMEBREW_PREFIX)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|ARM64|aarch64|AARCH64")
set(HOMEBREW_PREFIX /opt/homebrew)
else()
set(HOMEBREW_PREFIX /usr/local)
endif()
endif()
elseif(NOT WIN32)
set(DEFAULT_LLVM_PREFIX /usr/lib/llvm-${LLVM_VERSION_MAJOR})
else()
set(DEFAULT_LLVM_PREFIX /usr/lib)
list(APPEND LLVM_PATHS
${HOMEBREW_PREFIX}/opt/llvm@${LLVM_VERSION_MAJOR}/bin
${HOMEBREW_PREFIX}/opt/llvm/bin
)
endif()
optionx(LLVM_PREFIX FILEPATH "The path to the LLVM installation" DEFAULT ${DEFAULT_LLVM_PREFIX})
set(LLVM_PATH ${LLVM_PREFIX}/bin)
if(UNIX)
list(APPEND LLVM_PATHS
/usr/lib/llvm-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}/bin
/usr/lib/llvm-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}/bin
/usr/lib/llvm-${LLVM_VERSION_MAJOR}/bin
/usr/lib/llvm/bin
)
endif()
macro(find_llvm_command VARIABLE COMMAND)
macro(find_llvm_command variable command)
find_command(
VARIABLE ${VARIABLE}
COMMAND ${COMMAND} ${COMMAND}-${LLVM_VERSION_MAJOR}
PATHS ${LLVM_PATH}
VARIABLE ${variable}
VERSION_VARIABLE LLVM_VERSION
COMMAND ${command} ${command}-${LLVM_VERSION_MAJOR}
PATHS ${LLVM_PATHS}
VERSION ${LLVM_VERSION}
)
list(APPEND CMAKE_ARGS -D${VARIABLE}=${${VARIABLE}})
list(APPEND CMAKE_ARGS -D${variable}=${${variable}})
endmacro()
macro(find_llvm_command_no_version VARIABLE COMMAND)
macro(find_llvm_command_no_version variable command)
find_command(
VARIABLE ${VARIABLE}
COMMAND ${COMMAND} ${COMMAND}-${LLVM_VERSION_MAJOR}
PATHS ${LLVM_PATH}
VARIABLE ${variable}
VERSION_VARIABLE LLVM_VERSION
COMMAND ${command} ${command}-${LLVM_VERSION_MAJOR}
PATHS ${LLVM_PATHS}
REQUIRED ON
)
list(APPEND CMAKE_ARGS -D${VARIABLE}=${${VARIABLE}})
list(APPEND CMAKE_ARGS -D${variable}=${${variable}})
endmacro()
if(WIN32)

View File

@@ -2,7 +2,7 @@ option(WEBKIT_VERSION "The version of WebKit to use")
option(WEBKIT_LOCAL "If a local version of WebKit should be used instead of downloading")
if(NOT WEBKIT_VERSION)
set(WEBKIT_VERSION 4a2db3254a9535949a5d5380eb58cf0f77c8e15a)
set(WEBKIT_VERSION 76798f7b2fb287ee9f1ecce98bae895a2d026d93)
endif()
if(WEBKIT_LOCAL)

View File

@@ -16,6 +16,8 @@ else()
unsupported(CMAKE_SYSTEM_NAME)
endif()
optionx(ZIG_VERSION STRING "The zig version of the compiler to download" DEFAULT "0.13.0")
optionx(ZIG_COMMIT STRING "The zig commit to use in oven-sh/zig" DEFAULT "131a009ba2eb127a3447d05b9e12f710429aa5ee")
optionx(ZIG_TARGET STRING "The zig target to use" DEFAULT ${DEFAULT_ZIG_TARGET})
if(CMAKE_BUILD_TYPE STREQUAL "Release")
@@ -43,101 +45,39 @@ optionx(ZIG_OPTIMIZE "ReleaseFast|ReleaseSafe|ReleaseSmall|Debug" "The Zig optim
# Change to "bc" to experiment, "Invalid record" means it is not valid output.
optionx(ZIG_OBJECT_FORMAT "obj|bc" "Output file format for Zig object files" DEFAULT obj)
optionx(ZIG_VERSION STRING "The version of zig to use" DEFAULT "0.13.0")
optionx(ZIG_LOCAL_CACHE_DIR FILEPATH "The path to local the zig cache directory" DEFAULT ${CACHE_PATH}/zig/local)
optionx(ZIG_GLOBAL_CACHE_DIR FILEPATH "The path to the global zig cache directory" DEFAULT ${CACHE_PATH}/zig/global)
setx(ZIG_REPOSITORY_PATH ${VENDOR_PATH}/zig)
setx(ZIG_PATH ${CACHE_PATH}/zig/bin)
register_repository(
NAME
zig
REPOSITORY
oven-sh/zig
COMMIT
131a009ba2eb127a3447d05b9e12f710429aa5ee
PATH
${ZIG_REPOSITORY_PATH}
)
setenv(ZIG_LOCAL_CACHE_DIR ${ZIG_LOCAL_CACHE_DIR})
setenv(ZIG_GLOBAL_CACHE_DIR ${ZIG_GLOBAL_CACHE_DIR})
setx(ZIG_PATH ${VENDOR_PATH}/zig)
if(WIN32)
setx(ZIG_EXECUTABLE ${ZIG_PATH}/zig.exe)
else()
setx(ZIG_EXECUTABLE ${ZIG_PATH}/zig)
endif()
set(CMAKE_ZIG_FLAGS
--cache-dir ${ZIG_LOCAL_CACHE_DIR}
--global-cache-dir ${ZIG_GLOBAL_CACHE_DIR}
--zig-lib-dir ${ZIG_REPOSITORY_PATH}/lib
--zig-lib-dir ${ZIG_PATH}/lib
)
find_command(
VARIABLE
CMAKE_ZIG_COMPILER
COMMAND
zig
zig.exe
PATHS
${ZIG_PATH}
VERSION
${ZIG_VERSION}
REQUIRED
OFF
)
if(CMAKE_ZIG_COMPILER)
return()
endif()
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64|aarch64")
set(ZIG_HOST_ARCH "aarch64")
elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|x64|AMD64")
set(ZIG_HOST_ARCH "x86_64")
else()
unsupported(CMAKE_HOST_SYSTEM_PROCESSOR)
endif()
if(CMAKE_HOST_APPLE)
set(ZIG_HOST_OS "macos")
elseif(CMAKE_HOST_WIN32)
set(ZIG_HOST_OS "windows")
elseif(CMAKE_HOST_UNIX)
set(ZIG_HOST_OS "linux")
else()
unsupported(CMAKE_HOST_SYSTEM_NAME)
endif()
set(ZIG_NAME zig-${ZIG_HOST_OS}-${ZIG_HOST_ARCH}-${ZIG_VERSION})
if(CMAKE_HOST_WIN32)
set(ZIG_EXE "zig.exe")
set(ZIG_FILENAME ${ZIG_NAME}.zip)
else()
set(ZIG_EXE "zig")
set(ZIG_FILENAME ${ZIG_NAME}.tar.xz)
endif()
setx(ZIG_DOWNLOAD_URL https://ziglang.org/download/${ZIG_VERSION}/${ZIG_FILENAME})
file(DOWNLOAD ${ZIG_DOWNLOAD_URL} ${TMP_PATH}/${ZIG_FILENAME} SHOW_PROGRESS)
file(ARCHIVE_EXTRACT INPUT ${TMP_PATH}/${ZIG_FILENAME} DESTINATION ${TMP_PATH} TOUCH)
file(REMOVE ${TMP_PATH}/${ZIG_FILENAME})
file(COPY ${TMP_PATH}/${ZIG_NAME}/${ZIG_EXE} DESTINATION ${ZIG_PATH})
file(CHMOD ${ZIG_PATH}/${ZIG_EXE} PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE)
setx(CMAKE_ZIG_COMPILER ${ZIG_PATH}/${ZIG_EXE})
if(NOT WIN32)
file(CREATE_LINK ${ZIG_PATH}/${ZIG_EXE} ${ZIG_PATH}/zig.exe SYMBOLIC)
endif()
# Some zig commands need the executable to be in the same directory as the zig repository
register_command(
COMMENT
"Creating symlink for zig"
COMMAND
${CMAKE_COMMAND} -E copy ${ZIG_PATH}/${ZIG_EXE} ${ZIG_REPOSITORY_PATH}/${ZIG_EXE}
&& ${CMAKE_COMMAND} -E create_symlink ${ZIG_REPOSITORY_PATH}/${ZIG_EXE} ${ZIG_REPOSITORY_PATH}/zig.exe
OUTPUTS
${ZIG_REPOSITORY_PATH}/${ZIG_EXE}
${ZIG_REPOSITORY_PATH}/zig.exe
TARGETS
TARGET
clone-zig
COMMENT
"Downloading zig"
COMMAND
${CMAKE_COMMAND}
-DZIG_PATH=${ZIG_PATH}
-DZIG_VERSION=${ZIG_VERSION}
-DZIG_COMMIT=${ZIG_COMMIT}
-P ${CWD}/cmake/scripts/DownloadZig.cmake
SOURCES
${CWD}/cmake/scripts/DownloadZig.cmake
OUTPUTS
${ZIG_EXECUTABLE}
)

262
docs/api/color.md Normal file
View File

@@ -0,0 +1,262 @@
`Bun.color(input, outputFormat?)` leverages Bun's CSS parser to parse, normalize, and convert colors from user input to a variety of output formats, including:
| Format | Example |
| ------------ | -------------------------------- |
| `"css"` | `"red"` |
| `"ansi"` | `"\x1b[38;2;255;0;0m"` |
| `"ansi-16"` | `"\x1b[38;5;\tm"` |
| `"ansi-256"` | `"\x1b[38;5;196m"` |
| `"ansi-16m"` | `"\x1b[38;2;255;0;0m"` |
| `"number"` | `0x1a2b3c` |
| `"rgb"` | `"rgb(255, 99, 71)"` |
| `"rgba"` | `"rgba(255, 99, 71, 0.5)"` |
| `"hsl"` | `"hsl(120, 50%, 50%)"` |
| `"hex"` | `"#1a2b3c"` |
| `"HEX"` | `"#1A2B3C"` |
| `"{rgb}"` | `{ r: 255, g: 99, b: 71 }` |
| `"{rgba}"` | `{ r: 255, g: 99, b: 71, a: 1 }` |
| `"[rgb]"` | `[ 255, 99, 71 ]` |
| `"[rgba]"` | `[ 255, 99, 71, 255]` |
There are many different ways to use this API:
- Validate and normalize colors to persist in a database (`number` is the most database-friendly)
- Convert colors to different formats
- Colorful logging beyond the 16 colors many use today (use `ansi` if you don't want to figure out what the user's terminal supports, otherwise use `ansi-16`, `ansi-256`, or `ansi-16m` for how many colors the terminal supports)
- Format colors for use in CSS injected into HTML
- Get the `r`, `g`, `b`, and `a` color components as JavaScript objects or numbers from a CSS color string
You can think of this as an alternative to the popular npm packages [`color`](https://github.com/Qix-/color) and [`tinycolor2`](https://github.com/bgrins/TinyColor) except with full support for parsing CSS color strings and zero dependencies built directly into Bun.
### Flexible input
You can pass in any of the following:
- Standard CSS color names like `"red"`
- Numbers like `0xff0000`
- Hex strings like `"#f00"`
- RGB strings like `"rgb(255, 0, 0)"`
- RGBA strings like `"rgba(255, 0, 0, 1)"`
- HSL strings like `"hsl(0, 100%, 50%)"`
- HSLA strings like `"hsla(0, 100%, 50%, 1)"`
- RGB objects like `{ r: 255, g: 0, b: 0 }`
- RGBA objects like `{ r: 255, g: 0, b: 0, a: 1 }`
- RGB arrays like `[255, 0, 0]`
- RGBA arrays like `[255, 0, 0, 255]`
- LAB strings like `"lab(50% 50% 50%)"`
- ... anything else that CSS can parse as a single color value
### Format colors as CSS
The `"css"` format outputs valid CSS for use in stylesheets, inline styles, CSS variables, css-in-js, etc. It returns the most compact representation of the color as a string.
```ts
Bun.color("red", "css"); // "red"
Bun.color(0xff0000, "css"); // "#f000"
Bun.color("#f00", "css"); // "red"
Bun.color("#ff0000", "css"); // "red"
Bun.color("rgb(255, 0, 0)", "css"); // "red"
Bun.color("rgba(255, 0, 0, 1)", "css"); // "red"
Bun.color("hsl(0, 100%, 50%)", "css"); // "red"
Bun.color("hsla(0, 100%, 50%, 1)", "css"); // "red"
Bun.color({ r: 255, g: 0, b: 0 }, "css"); // "red"
Bun.color({ r: 255, g: 0, b: 0, a: 1 }, "css"); // "red"
Bun.color([255, 0, 0], "css"); // "red"
Bun.color([255, 0, 0, 255], "css"); // "red"
```
If the input is unknown or fails to parse, `Bun.color` returns `null`.
### Format colors as ANSI (for terminals)
The `"ansi"` format outputs ANSI escape codes for use in terminals to make text colorful.
```ts
Bun.color("red", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color(0xff0000, "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("#f00", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("#ff0000", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("rgb(255, 0, 0)", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("rgba(255, 0, 0, 1)", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("hsl(0, 100%, 50%)", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color("hsla(0, 100%, 50%, 1)", "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color({ r: 255, g: 0, b: 0 }, "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color({ r: 255, g: 0, b: 0, a: 1 }, "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color([255, 0, 0], "ansi"); // "\u001b[38;2;255;0;0m"
Bun.color([255, 0, 0, 255], "ansi"); // "\u001b[38;2;255;0;0m"
```
This gets the color depth of stdout and automatically chooses one of `"ansi-16m"`, `"ansi-256"`, `"ansi-16"` based on the environment variables. If stdout doesn't support any form of ANSI color, it returns an empty string. As with the rest of Bun's color API, if the input is unknown or fails to parse, it returns `null`.
#### 24-bit ANSI colors (`ansi-16m`)
The `"ansi-16m"` format outputs 24-bit ANSI colors for use in terminals to make text colorful. 24-bit color means you can display 16 million colors on supported terminals, and requires a modern terminal that supports it.
This converts the input color to RGBA, and then outputs that as an ANSI color.
```ts
Bun.color("red", "ansi-16m"); // "\x1b[38;2;255;0;0m"
Bun.color(0xff0000, "ansi-16m"); // "\x1b[38;2;255;0;0m"
Bun.color("#f00", "ansi-16m"); // "\x1b[38;2;255;0;0m"
Bun.color("#ff0000", "ansi-16m"); // "\x1b[38;2;255;0;0m"
```
#### 256 ANSI colors (`ansi-256`)
The `"ansi-256"` format approximates the input color to the nearest of the 256 ANSI colors supported by some terminals.
```ts
Bun.color("red", "ansi-256"); // "\u001b[38;5;196m"
Bun.color(0xff0000, "ansi-256"); // "\u001b[38;5;196m"
Bun.color("#f00", "ansi-256"); // "\u001b[38;5;196m"
Bun.color("#ff0000", "ansi-256"); // "\u001b[38;5;196m"
```
To convert from RGBA to one of the 256 ANSI colors, we ported the algorithm that [`tmux` uses](https://github.com/tmux/tmux/blob/dae2868d1227b95fd076fb4a5efa6256c7245943/colour.c#L44-L55).
#### 16 ANSI colors (`ansi-16`)
The `"ansi-16"` format approximates the input color to the nearest of the 16 ANSI colors supported by most terminals.
```ts
Bun.color("red", "ansi-16"); // "\u001b[38;5;\tm"
Bun.color(0xff0000, "ansi-16"); // "\u001b[38;5;\tm"
Bun.color("#f00", "ansi-16"); // "\u001b[38;5;\tm"
Bun.color("#ff0000", "ansi-16"); // "\u001b[38;5;\tm"
```
This works by first converting the input to a 24-bit RGB color space, then to `ansi-256`, and then we convert that to the nearest 16 ANSI color.
### Format colors as numbers
The `"number"` format outputs a 24-bit number for use in databases, configuration, or any other use case where a compact representation of the color is desired.
```ts
Bun.color("red", "number"); // 16711680
Bun.color(0xff0000, "number"); // 16711680
Bun.color({ r: 255, g: 0, b: 0 }, "number"); // 16711680
Bun.color([255, 0, 0], "number"); // 16711680
Bun.color("rgb(255, 0, 0)", "number"); // 16711680
Bun.color("rgba(255, 0, 0, 1)", "number"); // 16711680
Bun.color("hsl(0, 100%, 50%)", "number"); // 16711680
Bun.color("hsla(0, 100%, 50%, 1)", "number"); // 16711680
```
### Get the red, green, blue, and alpha channels
You can use the `"{rgba}"`, `"{rgb}"`, `"[rgba]"` and `"[rgb]"` formats to get the red, green, blue, and alpha channels as objects or arrays.
#### `{rgba}` object
The `"{rgba}"` format outputs an object with the red, green, blue, and alpha channels.
```ts
type RGBAObject = {
// 0 - 255
r: number;
// 0 - 255
g: number;
// 0 - 255
b: number;
// 0 - 1
a: number;
};
```
Example:
```ts
Bun.color("hsl(0, 0%, 50%)", "{rgba}"); // { r: 128, g: 128, b: 128, a: 1 }
Bun.color("red", "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 }
Bun.color(0xff0000, "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 }
Bun.color({ r: 255, g: 0, b: 0 }, "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 }
Bun.color([255, 0, 0], "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 }
```
To behave similarly to CSS, the `a` channel is a decimal number between `0` and `1`.
The `"{rgb}"` format is similar, but it doesn't include the alpha channel.
```ts
Bun.color("hsl(0, 0%, 50%)", "{rgb}"); // { r: 128, g: 128, b: 128 }
Bun.color("red", "{rgb}"); // { r: 255, g: 0, b: 0 }
Bun.color(0xff0000, "{rgb}"); // { r: 255, g: 0, b: 0 }
Bun.color({ r: 255, g: 0, b: 0 }, "{rgb}"); // { r: 255, g: 0, b: 0 }
Bun.color([255, 0, 0], "{rgb}"); // { r: 255, g: 0, b: 0 }
```
#### `[rgba]` array
The `"[rgba]"` format outputs an array with the red, green, blue, and alpha channels.
```ts
// All values are 0 - 255
type RGBAArray = [number, number, number, number];
```
Example:
```ts
Bun.color("hsl(0, 0%, 50%)", "[rgba]"); // [128, 128, 128, 255]
Bun.color("red", "[rgba]"); // [255, 0, 0, 255]
Bun.color(0xff0000, "[rgba]"); // [255, 0, 0, 255]
Bun.color({ r: 255, g: 0, b: 0 }, "[rgba]"); // [255, 0, 0, 255]
Bun.color([255, 0, 0], "[rgba]"); // [255, 0, 0, 255]
```
Unlike the `"{rgba}"` format, the alpha channel is an integer between `0` and `255`. This is useful for typed arrays where each channel must be the same underlying type.
The `"[rgb]"` format is similar, but it doesn't include the alpha channel.
```ts
Bun.color("hsl(0, 0%, 50%)", "[rgb]"); // [128, 128, 128]
Bun.color("red", "[rgb]"); // [255, 0, 0]
Bun.color(0xff0000, "[rgb]"); // [255, 0, 0]
Bun.color({ r: 255, g: 0, b: 0 }, "[rgb]"); // [255, 0, 0]
Bun.color([255, 0, 0], "[rgb]"); // [255, 0, 0]
```
### Format colors as hex strings
The `"hex"` format outputs a lowercase hex string for use in CSS or other contexts.
```ts
Bun.color("hsl(0, 0%, 50%)", "hex"); // "#808080"
Bun.color("red", "hex"); // "#ff0000"
Bun.color(0xff0000, "hex"); // "#ff0000"
Bun.color({ r: 255, g: 0, b: 0 }, "hex"); // "#ff0000"
Bun.color([255, 0, 0], "hex"); // "#ff0000"
```
The `"HEX"` format is similar, but it outputs a hex string with uppercase letters instead of lowercase letters.
```ts
Bun.color("hsl(0, 0%, 50%)", "HEX"); // "#808080"
Bun.color("red", "HEX"); // "#FF0000"
Bun.color(0xff0000, "HEX"); // "#FF0000"
Bun.color({ r: 255, g: 0, b: 0 }, "HEX"); // "#FF0000"
Bun.color([255, 0, 0], "HEX"); // "#FF0000"
```
### Bundle-time client-side color formatting
Like many of Bun's APIs, you can use macros to invoke `Bun.color` at bundle-time for use in client-side JavaScript builds:
```ts#client-side.ts
import { color } from "bun" with { type: "macro" };
console.log(color("#f00", "css"));
```
Then, build the client-side code:
```sh
bun build ./client-side.ts
```
This will output the following to `client-side.js`:
```js
// client-side.ts
console.log("red");
```

View File

@@ -206,4 +206,42 @@ console.log(arr);
// => Uint8Array(32) [ 185, 77, 39, 185, 147, ... ]
```
<!-- Bun.sha; -->
### HMAC in `Bun.CryptoHasher`
`Bun.CryptoHasher` can be used to compute HMAC digests. To do so, pass the key to the constructor.
```ts
const hasher = new Bun.CryptoHasher("sha256", "secret-key");
hasher.update("hello world");
console.log(hasher.digest("hex"));
// => "095d5a21fe6d0646db223fdf3de6436bb8dfb2fab0b51677ecf6441fcf5f2a67"
```
When using HMAC, a more limited set of algorithms are supported:
- `"blake2b512"`
- `"md5"`
- `"sha1"`
- `"sha224"`
- `"sha256"`
- `"sha384"`
- `"sha512-224"`
- `"sha512-256"`
- `"sha512"`
Unlike the non-HMAC `Bun.CryptoHasher`, the HMAC `Bun.CryptoHasher` instance is not reset after `.digest()` is called, and attempting to use the same instance again will throw an error.
Other methods like `.copy()` and `.update()` are supported (as long as it's before `.digest()`), but methods like `.digest()` that finalize the hasher are not.
```ts
const hasher = new Bun.CryptoHasher("sha256", "secret-key");
hasher.update("hello world");
const copy = hasher.copy();
copy.update("!");
console.log(copy.digest("hex"));
// => "3840176c3d8923f59ac402b7550404b28ab11cb0ef1fa199130a5c37864b5497"
console.log(hasher.digest("hex"));
// => "095d5a21fe6d0646db223fdf3de6436bb8dfb2fab0b51677ecf6441fcf5f2a67"
```

View File

@@ -100,12 +100,30 @@ When deploying to production, we recommend the following:
bun build --compile --minify --sourcemap ./path/to/my/app.ts --outfile myapp
```
**What do these flags do?**
### Bytecode compilation
To improve startup time, enable bytecode compilation:
```sh
bun build --compile --minify --sourcemap --bytecode ./path/to/my/app.ts --outfile myapp
```
Using bytecode compilation, `tsc` starts 2x faster:
{% image src="https://github.com/user-attachments/assets/dc8913db-01d2-48f8-a8ef-ac4e984f9763" width="689" /%}
Bytecode compilation moves parsing overhead for large input files from runtime to bundle time. Your app starts faster, in exchange for making the `bun build` command a little slower. It doesn't obscure source code.
**Experimental:** Bytecode compilation is an experimental feature introduced in Bun v1.1.30. Only `cjs` format is supported (which means no top-level-await). Let us know if you run into any issues!
### What do these flags do?
The `--minify` argument optimizes the size of the transpiled output code. If you have a large application, this can save megabytes of space. For smaller applications, it might still improve start time a little.
The `--sourcemap` argument embeds a sourcemap compressed with zstd, so that errors & stacktraces point to their original locations instead of the transpiled location. Bun will automatically decompress & resolve the sourcemap when an error occurs.
The `--bytecode` argument enables bytecode compilation. Every time you run JavaScript code in Bun, JavaScriptCore (the engine) will compile your source code into bytecode. We can move this parsing work from runtime to bundle time, saving you startup time.
## Worker
To use workers in a standalone executable, add the worker's entrypoint to the CLI arguments:

View File

@@ -330,6 +330,8 @@ Depending on the target, Bun will apply different module resolution rules and op
If any entrypoints contains a Bun shebang (`#!/usr/bin/env bun`) the bundler will default to `target: "bun"` instead of `"browser"`.
When using `target: "bun"` and `format: "cjs"` together, the `// @bun @bun-cjs` pragma is added and the CommonJS wrapper function is not compatible with Node.js.
---
- `node`
@@ -341,7 +343,11 @@ Depending on the target, Bun will apply different module resolution rules and op
Specifies the module format to be used in the generated bundles.
Currently the bundler only supports one module format: `"esm"`. Support for `"cjs"` and `"iife"` are planned.
Bun defaults to `"esm"`, and provides experimental support for `"cjs"` and `"iife"`.
#### `format: "esm"` - ES Module
This is the default format, which supports ES Module syntax including top-level `await`, import.meta, and more.
{% codetabs %}
@@ -359,44 +365,31 @@ $ bun build ./index.tsx --outdir ./out --format esm
{% /codetabs %}
<!-- ### `bundling`
To use ES Module syntax in browsers, set `format` to `"esm"` and make sure your `<script type="module">` tag has `type="module"` set.
Whether to enable bundling.
#### `format: "cjs"` - CommonJS
{% codetabs group="a" %}
To build a CommonJS module, set `format` to `"cjs"`. When choosing `"cjs"`, the default target changes from `"browser"` (esm) to `"node"` (cjs). CommonJS modules transpiled with `format: "cjs", target: "node"` can be executed in both Bun and Node.js (assuming the APIs in use are supported by both).
{% codetabs %}
```ts#JavaScript
await Bun.build({
entrypoints: ['./index.tsx'],
outdir: './out',
bundling: true, // default
format: "cjs",
})
```
```bash#CLI
# bundling is enabled by default
$ bun build ./index.tsx --outdir ./out
$ bun build ./index.tsx --outdir ./out --format cjs
```
{% /codetabs %}
Set to `false` to disable bundling. Instead, files will be transpiled and individually written to `outdir`.
#### `format: "iife"` - IIFE
{% codetabs group="a" %}
```ts#JavaScript
await Bun.build({
entrypoints: ['./index.tsx'],
outdir: './out',
bundling: false,
})
```
```bash#CLI
$ bun build ./index.tsx --outdir ./out --no-bundling
```
{% /codetabs %} -->
TODO: document IIFE once we support globalNames.
### `splitting`
@@ -1138,7 +1131,7 @@ Each artifact also contains the following properties:
---
- `kind`
- What kind of build output this file is. A build generates bundled entrypoints, code-split "chunks", sourcemaps, and copied assets (like images).
- What kind of build output this file is. A build generates bundled entrypoints, code-split "chunks", sourcemaps, bytecode, and copied assets (like images).
---
@@ -1203,6 +1196,26 @@ BuildArtifact (entry-point) {
{% /codetabs %}
### Bytecode
The `bytecode: boolean` option can be used to generate bytecode for any JavaScript/TypeScript entrypoints. This can greatly improve startup times for large applications. Only supported for `"cjs"` format, only supports `"target": "bun"` and dependent on a matching version of Bun. This adds a corresponding `.jsc` file for each entrypoint.
{% codetabs %}
```ts#JavaScript
await Bun.build({
entrypoints: ["./index.tsx"],
outdir: "./out",
bytecode: true,
})
```
```bash#CLI
$ bun build ./index.tsx --outdir ./out --bytecode
```
{% /codetabs %}
### Executables
Bun supports "compiling" a JavaScript/TypeScript entrypoint into a standalone executable. This executable contains a copy of the Bun binary.
@@ -1266,33 +1279,104 @@ interface Bun {
build(options: BuildOptions): Promise<BuildOutput>;
}
interface BuildOptions {
entrypoints: string[]; // required
outdir?: string; // default: no write (in-memory only)
format?: "esm"; // later: "cjs" | "iife"
target?: "browser" | "bun" | "node"; // "browser"
splitting?: boolean; // true
plugins?: BunPlugin[]; // [] // See https://bun.sh/docs/bundler/plugins
loader?: { [k in string]: Loader }; // See https://bun.sh/docs/bundler/loaders
manifest?: boolean; // false
external?: string[]; // []
sourcemap?: "none" | "inline" | "linked" | "external" | "linked" | boolean; // "none"
root?: string; // computed from entrypoints
interface BuildConfig {
entrypoints: string[]; // list of file path
outdir?: string; // output directory
target?: Target; // default: "browser"
/**
* Output module format. Top-level await is only supported for `"esm"`.
*
* Can be:
* - `"esm"`
* - `"cjs"` (**experimental**)
* - `"iife"` (**experimental**)
*
* @default "esm"
*/
format?: /**
* ECMAScript Module format
*/
| "esm"
/**
* CommonJS format
* **Experimental**
*/
| "cjs"
/**
* IIFE format
* **Experimental**
*/
| "iife";
naming?:
| string
| {
entry?: string; // '[dir]/[name].[ext]'
chunk?: string; // '[name]-[hash].[ext]'
asset?: string; // '[name]-[hash].[ext]'
};
publicPath?: string; // e.g. http://mydomain.com/
chunk?: string;
entry?: string;
asset?: string;
}; // | string;
root?: string; // project root
splitting?: boolean; // default true, enable code splitting
plugins?: BunPlugin[];
// manifest?: boolean; // whether to return manifest
external?: string[];
packages?: "bundle" | "external";
publicPath?: string;
define?: Record<string, string>;
// origin?: string; // e.g. http://mydomain.com
loader?: { [k in string]: Loader };
sourcemap?: "none" | "linked" | "inline" | "external" | "linked"; // default: "none", true -> "inline"
/**
* package.json `exports` conditions used when resolving imports
*
* Equivalent to `--conditions` in `bun build` or `bun run`.
*
* https://nodejs.org/api/packages.html#exports
*/
conditions?: Array<string> | string;
minify?:
| boolean // false
| boolean
| {
identifiers?: boolean;
whitespace?: boolean;
syntax?: boolean;
identifiers?: boolean;
};
/**
* Ignore dead code elimination/tree-shaking annotations such as @__PURE__ and package.json
* "sideEffects" fields. This should only be used as a temporary workaround for incorrect
* annotations in libraries.
*/
ignoreDCEAnnotations?: boolean;
/**
* Force emitting @__PURE__ annotations even if minify.whitespace is true.
*/
emitDCEAnnotations?: boolean;
// treeshaking?: boolean;
// jsx?:
// | "automatic"
// | "classic"
// | /* later: "preserve" */ {
// runtime?: "automatic" | "classic"; // later: "preserve"
// /** Only works when runtime=classic */
// factory?: string; // default: "React.createElement"
// /** Only works when runtime=classic */
// fragment?: string; // default: "React.Fragment"
// /** Only works when runtime=automatic */
// importSource?: string; // default: "react"
// };
/**
* Generate bytecode for the output. This can dramatically improve cold
* start times, but will make the final output larger and slightly increase
* memory usage.
*
* Bytecode is currently only supported for CommonJS (`format: "cjs"`).
*
* Must be `target: "bun"`
* @default false
*/
bytecode?: boolean;
}
interface BuildOutput {
@@ -1304,9 +1388,9 @@ interface BuildOutput {
interface BuildArtifact extends Blob {
path: string;
loader: Loader;
hash?: string;
kind: "entry-point" | "chunk" | "asset" | "sourcemap";
sourcemap?: BuildArtifact;
hash: string | null;
kind: "entry-point" | "chunk" | "asset" | "sourcemap" | "bytecode";
sourcemap: BuildArtifact | null;
}
type Loader =

View File

@@ -59,7 +59,7 @@ In Bun's CLI, simple boolean flags like `--minify` do not accept an argument. Ot
- `--format`
- `--format`
- Bun only supports `"esm"` currently but other module formats are planned. esbuild defaults to `"iife"`.
- Bun supports `"esm"` and `"cjs"` currently, but more module formats are planned. esbuild defaults to `"iife"`.
---

107
docs/cli/publish.md Normal file
View File

@@ -0,0 +1,107 @@
Use `bun publish` to publish a package to the npm registry.
`bun publish` will automatically pack your package into a tarball, strip workspace protocols from the `package.json` (resolving versions if necessary), and publish to the registry specified in your configuration files. Both `bunfig.toml` and `.npmrc` files are supported.
```sh
## Publishing the package from the current working directory
$ bun publish
## Output
bun publish v1.1.30 (ca7428e9)
packed 203B package.json
packed 224B README.md
packed 30B index.ts
packed 0.64KB tsconfig.json
Total files: 4
Shasum: 79e2b4377b63f4de38dc7ea6e5e9dbee08311a69
Integrity: sha512-6QSNlDdSwyG/+[...]X6wXHriDWr6fA==
Unpacked size: 1.1KB
Packed size: 0.76KB
Tag: latest
Access: default
Registry: http://localhost:4873/
+ publish-1@1.0.0
```
Alternatively, you can pack and publish your package separately by using `bun pm pack` followed by `bun publish` with the path to the output tarball.
```sh
$ bun pm pack
...
$ bun publish ./package.tgz
```
{% callout %}
**Note** - `bun publish` will not run lifecycle scripts (`prepublishOnly/prepack/prepare/postpack/publish/postpublish`) if a tarball path is provided. Scripts will only be run if the package is packed by `bun publish`.
{% /callout %}
### `--access`
The `--access` flag can be used to set the access level of the package being published. The access level can be one of `public` or `restricted`. Unscoped packages are always public, and attempting to publish an unscoped package with `--access restricted` will result in an error.
```sh
$ bun publish --access public
```
`--access` can also be set in the `publishConfig` field of your `package.json`.
```json
{
"publishConfig": {
"access": "restricted"
}
}
```
### `--tag`
Set the tag of the package version being published. By default, the tag is `latest`. The initial version of a package is always given the `latest` tag in addition to the specified tag.
```sh
$ bun publish --tag alpha
```
`--tag` can also be set in the `publishConfig` field of your `package.json`.
```json
{
"publishConfig": {
"tag": "next"
}
}
```
### `--dry-run`
The `--dry-run` flag can be used to simulate the publish process without actually publishing the package. This is useful for verifying the contents of the published package without actually publishing the package.
```sh
$ bun publish --dry-run
```
### `--auth-type`
If you have 2FA enabled for your npm account, `bun publish` will prompt you for a one-time password. This can be done through a browser or the CLI. The `--auth-type` flag can be used to tell the npm registry which method you prefer. The possible values are `web` and `legacy`, with `web` being the default.
```sh
$ bun publish --auth-type legacy
...
This operation requires a one-time password.
Enter OTP: 123456
...
```
### `--otp`
Provide a one-time password directly to the CLI. If the password is valid, this will skip the extra prompt for a one-time password before publishing. Example usage:
```sh
$ bun publish --otp 123456
```
### `--gzip-level`
Specify the level of gzip compression to use when packing the package. Only applies to `bun publish` without a tarball path argument. Values range from `0` to `9` (default is `9`).

View File

@@ -0,0 +1,214 @@
---
name: Migrate from npm install to bun install
---
`bun install` is a Node.js compatible npm client designed to be an incredibly fast successor to npm.
We've put a lot of work into making sure that the migration path from `npm install` to `bun install` is as easy as running `bun install` instead of `npm install`.
- **Designed for Node.js & Bun**: `bun install` installs a Node.js compatible `node_modules` folder. You can use it in place of `npm install` for Node.js projects without any code changes and without using Bun's runtime.
- **Automatically converts `package-lock.json`** to bun's `bun.lockb` lockfile format, preserving your existing resolved dependency versions without any manual work on your part. You can secretly use `bun install` in place of `npm install` at work without anyone noticing.
- **`.npmrc` compatible**: bun install reads npm registry configuration from npm's `.npmrc`, so you can use the same configuration for both npm and Bun.
- **Hardlinks**: On Windows and Linux, `bun install` uses hardlinks to conserve disk space and install times.
```bash
# It only takes one command to migrate
$ bun i
# To add dependencies:
$ bun i @types/bun
# To add devDependencies:
$ bun i -d @types/bun
# To remove a dependency:
$ bun rm @types/bun
```
---
## Run package.json scripts faster
Run scripts from package.json, executables from `node_modules/.bin` (sort of like `npx`), and JavaScript/TypeScript files (just like `node`) - all from a single simple command.
| NPM | Bun |
| ------------------ | ---------------- |
| `npm run <script>` | `bun <script>` |
| `npm exec <bin>` | `bun <bin>` |
| `node <file>` | `bun <file>` |
| `npx <package>` | `bunx <package>` |
When you use `bun run <executable>`, it will choose the locally-installed executable
```sh
# Run a package.json script:
$ bun my-script
$ bun run my-script
# Run an executable in node_modules/.bin:
$ bun my-executable # such as tsc, esbuild, etc.
$ bun run my-executable
# Run a JavaScript/TypeScript file:
$ bun ./index.ts
```
---
## Workspaces? Yes.
`bun install` supports workspaces similarly to npm, with more features.
In package.json, you can set `"workspaces"` to an array of relative paths.
```json#package.json
{
"name": "my-app",
"workspaces": ["packages/*", "apps/*"]
}
```
---
### Filter scripts by workspace name
In Bun, the `--filter` flag accepts a glob pattern, and will run the command concurrently for all workspace packages with a `name` that matches the pattern, respecting dependency order.
```sh
$ bun --filter 'lib-*' my-script
# instead of:
# npm run --workspace lib-foo --workspace lib-bar my-script
```
---
## Update dependencies
To update a dependency, you can use `bun update <package>`. This will update the dependency to the latest version that satisfies the semver range specified in package.json.
```sh
# Update a single dependency
$ bun update @types/bun
# Update all dependencies
$ bun update
# Ignore semver, update to the latest version
$ bun update @types/bun --latest
# Update a dependency to a specific version
$ bun update @types/bun@1.1.10
# Update all dependencies to the latest versions
$ bun update --latest
```
---
### View outdated dependencies
To view outdated dependencies, run `bun outdated`. This is like `npm outdated` but with more compact output.
```sh
$ bun outdated
┌────────────────────────────────────────┬─────────┬────────┬────────┐
│ Package │ Current │ Update │ Latest │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @types/bun (dev) │ 1.1.6 │ 1.1.10 │ 1.1.10 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @types/react (dev) │ 18.3.3 │ 18.3.8 │ 18.3.8 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @typescript-eslint/eslint-plugin (dev) │ 7.16.1 │ 7.18.0 │ 8.6.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @typescript-eslint/parser (dev) │ 7.16.1 │ 7.18.0 │ 8.6.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ @vscode/debugadapter (dev) │ 1.66.0 │ 1.67.0 │ 1.67.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ esbuild (dev) │ 0.21.5 │ 0.21.5 │ 0.24.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ eslint (dev) │ 9.7.0 │ 9.11.0 │ 9.11.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ mitata (dev) │ 0.1.11 │ 0.1.14 │ 1.0.2 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ prettier-plugin-organize-imports (dev) │ 4.0.0 │ 4.1.0 │ 4.1.0 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ source-map-js (dev) │ 1.2.0 │ 1.2.1 │ 1.2.1 │
├────────────────────────────────────────┼─────────┼────────┼────────┤
│ typescript (dev) │ 5.5.3 │ 5.6.2 │ 5.6.2 │
└────────────────────────────────────────┴─────────┴────────┴────────┘
```
---
## List installed packages
To list installed packages, you can use `bun pm ls`. This will list all the packages that are installed in the `node_modules` folder using Bun's lockfile as the source of truth. You can pass the `-a` flag to list all installed packages, including transitive dependencies.
```sh
# List top-level installed packages:
$ bun pm ls
my-pkg node_modules (781)
├── @types/node@20.16.5
├── @types/react@18.3.8
├── @types/react-dom@18.3.0
├── eslint@8.57.1
├── eslint-config-next@14.2.8
# List all installed packages:
$ bun pm ls -a
my-pkg node_modules
├── @alloc/quick-lru@5.2.0
├── @isaacs/cliui@8.0.2
│ └── strip-ansi@7.1.0
│ └── ansi-regex@6.1.0
├── @jridgewell/gen-mapping@0.3.5
├── @jridgewell/resolve-uri@3.1.2
...
```
---
## Create a package tarball
To create a package tarball, you can use `bun pm pack`. This will create a tarball of the package in the current directory.
```sh
# Create a tarball
$ bun pm pack
Total files: 46
Shasum: 2ee19b6f0c6b001358449ca0eadead703f326216
Integrity: sha512-ZV0lzWTEkGAMz[...]Gl4f8lA9sl97g==
Unpacked size: 0.41MB
Packed size: 117.50KB
```
---
## Shebang
If the package references `node` in the `#!/usr/bin/env node` shebang, `bun run` will by default respect it and use the system's `node` executable. You can force it to use Bun's `node` by passing `--bun` to `bun run`.
When you pass `--bun` to `bun run`, we create a symlink to the locally-installed Bun executable named `"node"` in a temporary directory and add that to your `PATH` for the duration of the script's execution.
```sh
# Force using Bun's runtime instead of node
$ bun --bun my-script
# This also works:
$ bun run --bun my-script
```
---
## Global installs
You can install packages globally using `bun i -g <package>`. This will install into a `.bun/install/global/node_modules` folder inside your home directory by default.
```sh
# Install a package globally
$ bun i -g eslint
# Run a globally-installed package without the `bun run` prefix
$ eslint --init
```

View File

@@ -41,7 +41,7 @@ In the root `package.json`, the `"workspaces"` key is used to indicate which sub
**Glob support** — Bun supports full glob syntax in `"workspaces"` (see [here](https://bun.sh/docs/api/glob#supported-glob-patterns) for a comprehensive list of supported syntax), _except_ for exclusions (e.g. `!**/excluded/**`), which are not implemented yet.
{% /callout %}
Each workspace has it's own `package.json` When referencing other packages in the monorepo, use `"workspace:*"` as the version field in your `package.json`.
Each workspace has it's own `package.json`. When referencing other packages in the monorepo, semver or workspace protocols (e.g. `workspace:*`) can be used as the version field in your `package.json`.
```json
{
@@ -53,10 +53,6 @@ Each workspace has it's own `package.json` When referencing other packages in th
}
```
{% callout %}
**Version support** — Bun supports simple `workspace:*` versions in `"dependencies"`. Full version syntax (e.g. `workspace:^*`) is not yet supported.
{% /callout %}
Workspaces have a couple major benefits.
- **Code can be split into logical parts.** If one package relies on another, you can simply add it as a dependency in `package.json`. If package `b` depends on `a`, `bun install` will install your local `packages/a` directory into `node_modules` instead of downloading it from the npm registry.

View File

@@ -164,6 +164,9 @@ export default {
page("cli/update", "`bun update`", {
description: "Update your project's dependencies.",
}),
page("cli/publish", "`bun publish`", {
description: "Publish your package to an npm registry.",
}),
page("cli/outdated", "`bun outdated`", {
description: "Check for outdated dependencies.",
}),
@@ -374,6 +377,10 @@ export default {
description: `Bun's native Semver implementation is 20x faster than the popular \`node-semver\` package.`,
}), // "`Semver`"),
page("api/color", "Color", {
description: `Bun's color function leverages Bun's CSS parser for parsing, normalizing, and converting colors from user input to a variety of output formats.`,
}), // "`Color`"),
// divider("Dev Server"),
// page("bun-dev", "Vanilla"),
// page("dev/css", "CSS"),

View File

@@ -67,6 +67,7 @@ After Visual Studio, you need the following:
- Perl
- Ruby
- Node.js
- Ccache
{% callout %}
**Note** The Zig compiler is automatically downloaded, installed, and updated by the building process.
@@ -78,12 +79,12 @@ After Visual Studio, you need the following:
```ps1#WinGet
## Select "Add LLVM to the system PATH for all users" in the LLVM installer
> winget install -i LLVM.LLVM -v 18.1.8 && winget install GoLang.Go Rustlang.Rustup NASM.NASM StrawberryPerl.StrawberryPerl RubyInstallerTeam.Ruby.3.2 OpenJS.NodeJS.LTS
> winget install -i LLVM.LLVM -v 18.1.8 && winget install GoLang.Go Rustlang.Rustup NASM.NASM StrawberryPerl.StrawberryPerl RubyInstallerTeam.Ruby.3.2 OpenJS.NodeJS.LTS Ccache.Ccache
```
```ps1#Scoop
> irm https://get.scoop.sh | iex
> scoop install nodejs-lts go rust nasm ruby perl
> scoop install nodejs-lts go rust nasm ruby perl ccache
# scoop seems to be buggy if you install llvm and the rest at the same time
> scoop install llvm@18.1.8
```
@@ -104,10 +105,10 @@ If you intend on building WebKit locally (optional), you should install these pa
{% /codetabs %}
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:
From here on out, it is **expected you use a PowerShell Terminal with `.\scripts\vs-shell.ps1` sourced**. This script is available in the Bun repository and can be loaded by executing it:
```ps1
> .\scripts\env.ps1
> .\scripts\vs-shell.ps1
```
To verify, you can check for an MSVC-only command line such as `mt.exe`
@@ -117,49 +118,41 @@ To verify, you can check for an MSVC-only command line such as `mt.exe`
```
{% callout %}
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.
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\vs-shell.ps1 sourced.
{% /callout %}
## Building
```ps1
> bun install
> bun run build
> .\scripts\env.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
# Configure build environment
> cmake -Bbuild -GNinja -DCMAKE_BUILD_TYPE=Debug
# Build bun
> ninja -Cbuild
# after the initial `bun run build` you can use the following to build
> ninja -Cbuild/debug
```
If this was successful, you should have a `bun-debug.exe` in the `build` folder.
If this was successful, you should have a `bun-debug.exe` in the `build/debug` folder.
```ps1
> .\build\bun-debug.exe --revision
> .\build\debug\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).
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\debug` 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`
- WebKit is extracted to `build/debug/cache/webkit/`
- Zig is extracted to `build/debug/cache/zig/bin/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.
You can run the test suite either using `bun test <path>`, 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
# the package.json script "test" uses "build/debug/bun-debug.exe" by default
> bun run test
# Run an individual test file:

View File

@@ -76,6 +76,12 @@ test("wat", async () => {
}, 500); // test must run in <500ms
```
In `bun:test`, test timeouts throw an uncatchable exception to force the test to stop running and fail. We also kill any child processes that were spawned in the test to avoid leaving behind zombie processes lurking in the background.
### 🧟 Zombie process killer
When a test times out and processes spawned in the test via `Bun.spawn`, `Bun.spawnSync`, or `node:child_process` are not killed, they will be automatically killed and a message will be logged to the console.
## `test.skip`
Skip individual tests with `test.skip`. These tests will not be run.
@@ -324,6 +330,7 @@ Bun implements the following matchers. Full Jest compatibility is on the roadmap
- [`.toContainAllValues()`](https://jest-extended.jestcommunity.dev/docs/matchers/Object#tocontainallvaluesvalues)
---
- ✅
- [`.toContainAnyValues()`](https://jest-extended.jestcommunity.dev/docs/matchers/Object#tocontainanyvaluesvalues)

View File

@@ -40,7 +40,7 @@ JSC_DEFINE_HOST_FUNCTION(jsFunctionWrite, (JSC::JSGlobalObject * globalObject,
int32_t fd = STDOUT_FILENO;
if (callframe->argumentCount() > 1) {
fd = arg1.toInt32(globalObject);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
RETURN_IF_EXCEPTION(scope, {});
} else {
toWriteArg = arg1;
}
@@ -53,7 +53,7 @@ JSC_DEFINE_HOST_FUNCTION(jsFunctionWrite, (JSC::JSGlobalObject * globalObject,
}
auto string = toWriteArg.toWTFString(globalObject);
RETURN_IF_EXCEPTION(scope, encodedJSValue());
RETURN_IF_EXCEPTION(scope, {});
auto utf8 = string.utf8();
auto length = utf8.length();
auto written = write(fd, utf8.data(), length);

View File

@@ -1,7 +1,7 @@
{
"private": true,
"name": "bun",
"version": "1.1.29",
"version": "1.1.30",
"workspaces": [
"./packages/bun-types"
],
@@ -21,7 +21,10 @@
"react": "^18.3.1",
"react-dom": "^18.3.1",
"source-map-js": "^1.2.0",
"typescript": "^5.4.5"
"typescript": "^5.4.5",
"caniuse-lite": "^1.0.30001620",
"autoprefixer": "^10.4.19",
"@mdn/browser-compat-data": "~5.5.28"
},
"resolutions": {
"bun-types": "workspace:packages/bun-types"
@@ -42,18 +45,32 @@
"build:debug-zig-release": "cmake . -DCMAKE_BUILD_TYPE=Release -DZIG_OPTIMIZE=Debug -GNinja -Bbuild-debug-zig-release && ninja -Cbuild-debug-zig-release",
"bump": "bun ./scripts/bump.ts",
"typecheck": "tsc --noEmit && cd test && bun run typecheck",
"fmt": "prettier --config=.prettierrc-ci --write --cache './{.vscode,src,test,bench,packages/{bun-types,bun-inspector-*,bun-vscode,bun-debug-adapter-protocol}}/**/*.{mjs,ts,tsx,js,jsx}'",
"fmt:cpp": "clang-format -i src/bun.js/bindings/**/*.{cpp,h} --verbose",
"fmt:zig": "bun run zig:fmt",
"fmt": "bun run prettier",
"fmt:cpp": "bun run clang-format",
"fmt:zig": "bun run zig-format",
"lint": "eslint './**/*.d.ts' --cache",
"lint:fix": "eslint './**/*.d.ts' --cache --fix",
"test": "node scripts/runner.node.mjs ./build/bun-debug",
"test:release": "node scripts/runner.node.mjs ./build-release/bun",
"test": "node scripts/runner.node.mjs --exec-path ./build/debug/bun-debug",
"test:release": "node scripts/runner.node.mjs --exec-path ./build/release/bun",
"banned": "bun packages/bun-internal-test/src/linter.ts",
"zig": "vendor/zig/zig.exe",
"zig:fmt": "bun run zig fmt src/*.zig src/*/*.zig src/*/*/*.zig src/*/*/*/*.zig",
"zig:fmt": "bun run zig-format",
"zig:check": "bun run zig build check --summary new",
"zig:check-all": "bun run zig build check-all --summary new",
"zig:check-windows": "bun run zig build check-windows --summary new"
"zig:check-windows": "bun run zig build check-windows --summary new",
"cmake": "bun ./scripts/build.mjs -DCMAKE_BUILD_TYPE=Debug -DENABLE_ANALYSIS=ON -B build/debug",
"clang-format": "bun run cmake --target clang-format",
"clang-format:check": "bun run cmake --target clang-format-check",
"clang-format:diff": "bun run cmake --target clang-format-diff",
"clang-tidy": "bun run cmake --target clang-tidy",
"clang-tidy:check": "bun run cmake --target clang-tidy-check",
"clang-tidy:diff": "bun run cmake --target clang-tidy-diff",
"zig-format": "bun run cmake --target zig-format",
"zig-format:check": "bun run cmake --target zig-format-check",
"zig-format:diff": "bun run cmake --target zig-format-diff",
"prettier": "bun run cmake --target prettier",
"prettier:check": "bun run cmake --target prettier-check",
"prettier:extra": "bun run cmake --target prettier-extra",
"prettier:diff": "bun run cmake --target prettier-diff"
}
}

View File

@@ -1,4 +0,0 @@
bin/bun-profile
bin/*.o
*.o
*.a

View File

@@ -2,13 +2,27 @@ import type { InspectorEventMap } from "../../../bun-inspector-protocol/src/insp
import type { JSC } from "../../../bun-inspector-protocol/src/protocol";
import type { DAP } from "../protocol";
// @ts-ignore
import type { ChildProcess } from "node:child_process";
import { spawn } from "node:child_process";
import { ChildProcess, spawn } from "node:child_process";
import { EventEmitter } from "node:events";
import { WebSocketInspector, remoteObjectToString } from "../../../bun-inspector-protocol/index";
import { UnixSignal, randomUnixPath } from "./signal";
import { AddressInfo, createServer } from "node:net";
import * as path from "node:path";
import { remoteObjectToString, WebSocketInspector } from "../../../bun-inspector-protocol/index";
import { randomUnixPath, TCPSocketSignal, UnixSignal } from "./signal";
import { Location, SourceMap } from "./sourcemap";
export async function getAvailablePort(): Promise<number> {
const server = createServer();
server.listen(0);
return new Promise((resolve, reject) => {
server.on("listening", () => {
const { port } = server.address() as AddressInfo;
server.close(() => {
resolve(port);
});
});
});
}
const capabilities: DAP.Capabilities = {
supportsConfigurationDoneRequest: true,
supportsFunctionBreakpoints: true,
@@ -489,36 +503,73 @@ export class DebugAdapter extends EventEmitter<DebugAdapterEventMap> implements
...env,
};
const url = `ws+unix://${randomUnixPath()}`;
const signal = new UnixSignal();
if (process.platform !== "win32") {
// we're on unix
const url = `ws+unix://${randomUnixPath()}`;
const signal = new UnixSignal();
signal.on("Signal.received", () => {
this.#attach({ url });
});
signal.on("Signal.received", () => {
this.#attach({ url });
});
this.once("Adapter.terminated", () => {
signal.close();
});
this.once("Adapter.terminated", () => {
signal.close();
});
const query = stopOnEntry ? "break=1" : "wait=1";
processEnv["BUN_INSPECT"] = `${url}?${query}`;
processEnv["BUN_INSPECT_NOTIFY"] = signal.url;
const query = stopOnEntry ? "break=1" : "wait=1";
processEnv["BUN_INSPECT"] = `${url}?${query}`;
processEnv["BUN_INSPECT_NOTIFY"] = signal.url;
// This is probably not correct, but it's the best we can do for now.
processEnv["FORCE_COLOR"] = "1";
processEnv["BUN_QUIET_DEBUG_LOGS"] = "1";
processEnv["BUN_DEBUG_QUIET_LOGS"] = "1";
// This is probably not correct, but it's the best we can do for now.
processEnv["FORCE_COLOR"] = "1";
processEnv["BUN_QUIET_DEBUG_LOGS"] = "1";
processEnv["BUN_DEBUG_QUIET_LOGS"] = "1";
const started = await this.#spawn({
command: runtime,
args: processArgs,
env: processEnv,
cwd,
isDebugee: true,
});
const started = await this.#spawn({
command: runtime,
args: processArgs,
env: processEnv,
cwd,
isDebugee: true,
});
if (!started) {
throw new Error("Program could not be started.");
if (!started) {
throw new Error("Program could not be started.");
}
} else {
// we're on windows
// Create TCPSocketSignal
const url = `ws://127.0.0.1:${await getAvailablePort()}/${getRandomId()}`; // 127.0.0.1 so it resolves correctly on windows
const signal = new TCPSocketSignal(await getAvailablePort());
signal.on("Signal.received", async () => {
this.#attach({ url });
});
this.once("Adapter.terminated", () => {
signal.close();
});
const query = stopOnEntry ? "break=1" : "wait=1";
processEnv["BUN_INSPECT"] = `${url}?${query}`;
processEnv["BUN_INSPECT_NOTIFY"] = signal.url; // 127.0.0.1 so it resolves correctly on windows
// This is probably not correct, but it's the best we can do for now.
processEnv["FORCE_COLOR"] = "1";
processEnv["BUN_QUIET_DEBUG_LOGS"] = "1";
processEnv["BUN_DEBUG_QUIET_LOGS"] = "1";
const started = await this.#spawn({
command: runtime,
args: processArgs,
env: processEnv,
cwd,
isDebugee: true,
});
if (!started) {
throw new Error("Program could not be started.");
}
}
}
@@ -684,6 +735,9 @@ export class DebugAdapter extends EventEmitter<DebugAdapterEventMap> implements
async breakpointLocations(request: DAP.BreakpointLocationsRequest): Promise<DAP.BreakpointLocationsResponse> {
const { line, endLine, column, endColumn, source: source0 } = request;
if (process.platform === "win32") {
source0.path = source0.path ? normalizeWindowsPath(source0.path) : source0.path;
}
const source = await this.#getSource(sourceToId(source0));
const { locations } = await this.send("Debugger.getBreakpointLocations", {
@@ -788,6 +842,9 @@ export class DebugAdapter extends EventEmitter<DebugAdapterEventMap> implements
}
async #setBreakpointsByUrl(url: string, requests: DAP.SourceBreakpoint[], unsetOld?: boolean): Promise<Breakpoint[]> {
if (process.platform === "win32") {
url = url ? normalizeWindowsPath(url) : url;
}
const source = this.#getSourceIfPresent(url);
// If the source is not loaded, set a placeholder breakpoint at the start of the file.
@@ -1161,6 +1218,9 @@ export class DebugAdapter extends EventEmitter<DebugAdapterEventMap> implements
async gotoTargets(request: DAP.GotoTargetsRequest): Promise<DAP.GotoTargetsResponse> {
const { source: source0 } = request;
if (process.platform === "win32") {
source0.path = source0.path ? normalizeWindowsPath(source0.path) : source0.path;
}
const source = await this.#getSource(sourceToId(source0));
const { breakpoints } = await this.breakpointLocations(request);
@@ -1327,7 +1387,7 @@ export class DebugAdapter extends EventEmitter<DebugAdapterEventMap> implements
// 1. If it has a `path`, the client retrieves the source from the file system.
// 2. If it has a `sourceReference`, the client sends a `source` request.
// Moreover, the code is usually shown in a read-only editor.
const isUserCode = url.startsWith("/");
const isUserCode = path.isAbsolute(url);
const sourceMap = SourceMap(sourceMapURL);
const name = sourceName(url);
const presentationHint = sourcePresentationHint(url);
@@ -1646,12 +1706,11 @@ export class DebugAdapter extends EventEmitter<DebugAdapterEventMap> implements
// If the source does not have a path or is a builtin module,
// it cannot be retrieved from the file system.
if (typeof sourceId === "number" || !sourceId.startsWith("/")) {
if (typeof sourceId === "number" || !path.isAbsolute(sourceId)) {
throw new Error(`Source not found: ${sourceId}`);
}
// If the source is not present, it may not have been loaded yet.
// In that case, wait for it to be loaded.
let resolves = this.#pendingSources.get(sourceId);
if (!resolves) {
this.#pendingSources.set(sourceId, (resolves = []));
@@ -2107,7 +2166,6 @@ export class DebugAdapter extends EventEmitter<DebugAdapterEventMap> implements
close(): void {
this.#process?.kill();
// this.#signal?.close();
this.#inspector.close();
this.#reset();
}
@@ -2149,10 +2207,10 @@ function titleize(name: string): string {
}
function sourcePresentationHint(url?: string): DAP.Source["presentationHint"] {
if (!url || !url.startsWith("/")) {
if (!url || !path.isAbsolute(url)) {
return "deemphasize";
}
if (url.includes("/node_modules/")) {
if (url.includes("/node_modules/") || url.includes("\\node_modules\\")) {
return "normal";
}
return "emphasize";
@@ -2163,6 +2221,9 @@ function sourceName(url?: string): string {
return "unknown.js";
}
if (isJavaScript(url)) {
if (process.platform === "win32") {
url = url.replaceAll("\\", "/");
}
return url.split("/").pop() || url;
}
return `${url}.js`;
@@ -2567,3 +2628,15 @@ let sequence = 1;
function nextId(): number {
return sequence++;
}
export function getRandomId() {
return Math.random().toString(36).slice(2);
}
export function normalizeWindowsPath(winPath: string): string {
winPath = path.normalize(winPath);
if (winPath[1] === ":" && (winPath[2] === "\\" || winPath[2] === "/")) {
return (winPath.charAt(0).toUpperCase() + winPath.slice(1)).replaceAll("\\\\", "\\");
}
return winPath;
}

View File

@@ -1,5 +1,5 @@
import { EventEmitter } from "node:events";
import type { Server } from "node:net";
import type { Server, Socket } from "node:net";
import { createServer } from "node:net";
import { tmpdir } from "node:os";
import { join } from "node:path";
@@ -85,3 +85,75 @@ function parseUnixPath(path: string | URL): string {
throw new Error(`Invalid UNIX path: ${path}`);
}
}
export type TCPSocketSignalEventMap = {
"Signal.listening": [];
"Signal.error": [Error];
"Signal.closed": [];
"Signal.received": [string];
};
export class TCPSocketSignal extends EventEmitter {
#port: number;
#server: ReturnType<typeof createServer>;
#ready: Promise<void>;
constructor(port: number) {
super();
this.#port = port;
this.#server = createServer((socket: Socket) => {
socket.on("data", data => {
this.emit("Signal.received", data.toString());
});
socket.on("error", error => {
this.emit("Signal.error", error);
});
socket.on("close", () => {
this.emit("Signal.closed");
});
});
this.#ready = new Promise((resolve, reject) => {
this.#server.listen(this.#port, () => {
this.emit("Signal.listening");
resolve();
});
this.#server.on("error", reject);
});
}
emit<E extends keyof TCPSocketSignalEventMap>(event: E, ...args: TCPSocketSignalEventMap[E]): boolean {
if (isDebug) {
console.log(event, ...args);
}
return super.emit(event, ...args);
}
/**
* The TCP port.
*/
get port(): number {
return this.#port;
}
get url(): string {
return `tcp://127.0.0.1:${this.#port}`;
}
/**
* Resolves when the server is listening or rejects if an error occurs.
*/
get ready(): Promise<void> {
return this.#ready;
}
/**
* Closes the server.
*/
close(): void {
this.#server.close();
}
}

View File

@@ -1,4 +0,0 @@
bin/bun-profile
bin/*.o
*.o
*.a

View File

@@ -1,3 +0,0 @@
# `bun-plugin-css`
Not implemented.

View File

@@ -1 +0,0 @@
throw new Error("Not implemented.");

View File

@@ -1,10 +0,0 @@
{
"name": "bun-plugin-css",
"version": "0.0.1-alpha.0",
"module": "index.ts",
"type": "module",
"files": [
"index.ts",
"package.json"
]
}

View File

@@ -1,3 +0,0 @@
# `bun-plugin-lightningcss`
Not implemented.

View File

@@ -1 +0,0 @@
throw new Error("Not implemented.");

View File

@@ -1,10 +0,0 @@
{
"name": "bun-plugin-lightningcss",
"version": "0.0.1-alpha.0",
"module": "index.ts",
"type": "module",
"files": [
"index.ts",
"package.json"
]
}

View File

@@ -1,3 +0,0 @@
# `bun-plugin-mdx`
Not implemented.

View File

@@ -1 +0,0 @@
throw new Error("Not implemented.");

View File

@@ -1,10 +0,0 @@
{
"name": "bun-plugin-mdx",
"version": "0.0.1-alpha.0",
"module": "index.ts",
"type": "module",
"files": [
"index.ts",
"package.json"
]
}

View File

@@ -1,169 +0,0 @@
# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore
# Logs
logs
_.log
npm-debug.log_
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
# Runtime data
pids
_.pid
_.seed
\*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
\*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
\*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
\*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.\*

View File

@@ -1,149 +0,0 @@
# `bun-plugin-server-components`
The official Bun plugin for **server components**.
## Installation
```sh
bun add bun-plugin-server-components -d
```
## Context
Server components are a new abstraction for building web applications. They look similar to standard React/JSX components, but render exclusively on the server. They differ from classic "client components" in a few ways:
1. They can be `async`.
2. Their implementation can run privileged code like database queries. Normally this would be unsafe, because the source code of client components are typically bundled and sent to the client, where they can be inspected and reverse-engineered. Server components are never sent to the client, so they can run privileged code safely.
3. They _cannot_ contain stateful hooks like `useState` or `useEffect`.
Server components require a deep integration with the bundler to work. To understand why, we need a bit of background on how server components work.
### How server components work
Imagine you have a server component that looks like this:
```tsx
// index.tsx
import { Component } from "./Component";
export default async function HomePage() {
return (
<div>
<Component />
</div>
);
}
```
This file imports a client component called `Component`.
```ts
// ./Component.tsx
"use client";
export function Component() {
return <div>Hello world</div>;
}
```
To run this component we need to generate two builds.
> Here the term "build" refers to a typical bundling step—the act of converting a set of entrypoints into a set of bundles.
1. The first is our "server component build". It contains all the code we need to render `HomePage` to a component tree. When an incoming `Request` comes in, we can use React's built-in tools to convert this tree into a "virtual DOM stream" that we can return as a `Response`.
2. The second is our "client build". It contains the bundled versions of all client components that were referenced by our server components.
The browser hits the server and gets back the "virtual DOM stream". The virtual DOM stream will contain references to client components, which will be loaded from the client bundle. React provides a built-in utility (`createFromFetch`)that accepts the VDOM stream, dynamically loads the necessary client components, and returns a renderable component.
```ts
import { createRoot } from "react-dom/client";
import { createFromFetch } from "react-server-dom-webpack/client.browser";
const stream = fetch("/", { headers: { Accept: "text/x-component" } });
const data = createFromFetch(stream);
const root = createRoot(document);
root.render(<App />);
```
### Server-side rendering
One potentially confusing aspect of server components is that they "return" virtual DOM. From the perspective of a server component, client components are black boxes.
If we want to do server-side rendering, we need to render our server component to VDOM, _then_ render the VDOM to plain HTML. These are two distinct steps. The second step requires a _third build_, we we'll call the "SSR build". Like the "client build", this build will bundle all the client components. Unlike the "client build", those bundles will be intended for consumption on the server; in bundler terms, the build's `"target"` will be`"bun"` (or perhaps `"node"`).
### Bundling server components
That's a high-level overview of how server components work. The important takeaway is that we need to generate totally separate bundles for server and client components.
But it's not just a simple matter of running two separate bundling scripts. The true "entrypoints" of our application are the server components. Over the course of bundling our server components, we will discover some files containing the `"use client"` directive; these files then become the entrypoints for our "client build", which will require a totally separate build configuration from the server build.
The goal of this plugin is to hide the complexty of this multi-stage build from the user.
## Usage
To use this plugin:
```ts
import ServerComponentsPlugin from "bun-plugin-server-components";
await Bun.build({
entrypoints: ["./index.tsx"], // server component files
plugins: [
ServerComponentsPlugin({
// plugin configuration
}),
],
// other configuration
});
```
The `"entrypoints"` you pass into `Bun.build()` should be your _server components_. Bun's bundler will automatically detect any files containing the `"use client"` directive, and will use those files as entrypoints for the "client build" and "SSR build". The bundler configuration for these builds can be provided `client` and `ssr` keys respectively.
```ts
import ServerComponentsPlugin from "bun-plugin-server-components";
await Bun.build({
entrypoints: ["./index.tsx"], // server component files
outdir: "./build",
manifest: true,
plugins: [ServerComponentsPlugin({
client: {
entrypoints: [], // optional - additional client entrypoints
outdir: "./build/client", // default: inherits from the main build
target: "browser",
plugins: [/* */],
}
ssr: {
entrypoints: [], // optional - additional SSR entrypoints
outdir: "./build/client", // default: inherits from the main build
target: "bun", // this is default
plugins: [/* */],
}
})],
});
```
The result of `Bun.build()` will contain additional manifests for the SSR and client builds.
```ts
const result = await Bun.build({
// config
plugins: [
ServerComponentsPlugin({
/* config */
}),
],
});
// standard manifest
// for the top-level (server components) build
result.manifest;
// manifest for client build
result.clientManifest;
// manifest for client build
result.ssrManifest;
```
Once the build is complete, use the manifests to implement your RSC server.

View File

@@ -1,10 +0,0 @@
import { BunPlugin, BuildConfig } from "bun";
function Plugin(config: { client?: BuildConfig; ssr?: BuildConfig }): BunPlugin {
return {
name: "bun-plugin-server-components",
SECRET_SERVER_COMPONENTS_INTERNALS: config,
} as any;
}
export default Plugin;

View File

@@ -1,28 +0,0 @@
{
"name": "bun-plugin-server-components",
"version": "0.0.1-alpha.0",
"module": "index.ts",
"type": "module",
"types": "index.ts",
"exports": {
".": {
"import": "./index.ts",
"require": "./index.ts",
"default": "./index.js"
},
"./package.json": "./package.json"
},
"files": [
"index.ts",
"tsconfig.json",
"package.json",
"modules.d.ts"
],
"devDependencies": {
"@types/js-yaml": "^4.0.5"
},
"dependencies": {
"bun-types": "canary",
"js-yaml": "^4.1.0"
}
}

View File

@@ -1,23 +0,0 @@
{
"compilerOptions": {
"lib": ["ESNext"],
"module": "esnext",
"target": "esnext",
"moduleResolution": "bundler",
"moduleDetection": "force",
"allowImportingTsExtensions": true,
"noEmit": true,
"composite": true,
"strict": true,
"downlevelIteration": true,
"skipLibCheck": true,
"jsx": "react-jsx",
"allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": true,
"allowJs": true,
"types": [
"bun-types" // add Bun global
]
},
"include": ["**/*.ts", "modules.d.ts"]
}

View File

@@ -2,6 +2,27 @@ import { AwsClient } from "aws4fetch";
import { getBuild, getRelease, getSemver, getSha } from "../src/github";
import { join, tmp } from "../src/fs";
// The source of truth for the git sha is what's in the local build, extracted from features.json
// NOT the git tag revision.
// Ideally, these are always the same, but mistakes can happen.
const local =
"bun-" +
(
{
darwin: "darwin",
win32: "windows",
linux: "linux",
} as any
)[process.platform] +
"-" +
(
{
arm64: "aarch64",
x64: "x64",
} as any
)[process.arch] +
".zip";
const dryRun = process.argv.includes("--dry-run");
const [tag] = process.argv.slice(2);
@@ -28,40 +49,68 @@ const full_commit_hash = await getSha(tag, "long");
console.log("Found release:", release.tag_name, "with commit hash:", full_commit_hash);
console.log("Found build:", full_commit_hash);
const isCanary = release.tag_name === "canary";
let paths: string[];
if (latest.tag_name === release.tag_name) {
paths = ["releases/latest", `releases/${release.tag_name}`, `releases/${full_commit_hash}`];
} else if (release.tag_name === "canary") {
try {
const build = await getSemver("canary", await getBuild());
paths = ["releases/canary", `releases/${build}`, `releases/${full_commit_hash}-canary`];
} catch (error) {
console.warn(error);
paths = ["releases/canary"];
let paths: string[] = [];
async function setPaths(revision: string, isCanary: boolean) {
const releaseSha = `releases/${revision + (isCanary ? "-canary" : "")}`;
if (latest.tag_name === release.tag_name) {
paths = ["releases/latest", `releases/${release.tag_name}`, releaseSha];
} else if (isCanary) {
try {
const build = await getSemver("canary", await getBuild());
paths = ["releases/canary", `releases/${build}`, releaseSha];
} catch (error) {
console.warn(error);
paths = ["releases/canary", releaseSha];
}
} else {
paths = [`releases/${release.tag_name}`, releaseSha];
}
} else {
paths = [`releases/${release.tag_name}`, `releases/${full_commit_hash}`];
}
console.log("Found paths:", paths);
const local =
"bun-" +
(
{
darwin: "darwin",
win32: "windows",
linux: "linux",
} as any
)[process.platform] +
"-" +
(
{
arm64: "aarch64",
x64: "x64",
} as any
)[process.arch] +
".zip";
console.log("Found paths:", paths);
}
async function getFeaturesJSON(body: ArrayBuffer) {
// extract feature data using the local build
const temp = tmp();
await Bun.write(join(temp, "bun.zip"), body);
let unzip = Bun.spawnSync({
cmd: ["unzip", join(temp, "bun.zip")],
cwd: temp,
});
if (!unzip.success) throw new Error("Failed to unzip");
let data = Bun.spawnSync({
cmd: [
join(temp, local.replace(".zip", ""), "bun"),
"--print",
'JSON.stringify(require("bun:internal-for-testing").crash_handler.getFeatureData())',
],
cwd: temp,
env: {
...process.env,
BUN_DEBUG_QUIET_LOGS: "1",
BUN_GARBAGE_COLLECTOR_LEVEL: "0",
BUN_FEATURE_FLAG_INTERNAL_FOR_TESTING: "1",
},
stdio: ["ignore", "pipe", "inherit"],
});
return data.stdout.toString("utf8").trim();
}
// Make the first asset the local build
for (let i = 0; i < release.assets.length; i++) {
const asset = release.assets[i];
if (asset.name === local) {
release.assets.splice(i, 1);
release.assets.unshift(asset);
break;
}
}
if (release?.assets?.[0]?.name !== local) {
throw new Error("Expected local build to be the first asset");
}
for (const asset of release.assets) {
const url = asset.browser_download_url;
@@ -83,39 +132,25 @@ for (const asset of release.assets) {
contentType = response.headers.get("Content-Type") || "";
}
console.log("Downloading asset:", name);
const body = await response.arrayBuffer();
if (name == local) {
// extract feature data using the local build
const temp = tmp();
await Bun.write(join(temp, "bun.zip"), body);
let unzip = Bun.spawnSync({
cmd: ["unzip", join(temp, "bun.zip")],
cwd: temp,
});
if (!unzip.success) throw new Error("Failed to unzip");
let data = Bun.spawnSync({
cmd: [
join(temp, local.replace(".zip", ""), "bun"),
"--print",
'JSON.stringify(require("bun:internal-for-testing").crash_handler.getFeatureData())',
],
cwd: temp,
env: {
...process.env,
BUN_DEBUG_QUIET_LOGS: "1",
BUN_GARBAGE_COLLECTOR_LEVEL: "0",
BUN_FEATURE_FLAG_INTERNAL_FOR_TESTING: "1",
},
stdio: ["ignore", "pipe", "inherit"],
});
const json = data.stdout.toString("utf8");
const text = await getFeaturesJSON(body);
const features = JSON.parse(text);
const sha = features.revision;
if (features.is_canary && !isCanary) {
console.warn("Local build is a canary but release is not tagged as canary.");
}
await setPaths(sha, features.is_canary);
console.log("features.json:", JSON.stringify(features, null, 2));
for (const path of paths) {
const key = `${path}/features.json`;
console.log("Uploading:", key);
await uploadToS3({
key,
body: new TextEncoder().encode(json).buffer,
body: new TextEncoder().encode(text).buffer,
headers: {
"Content-Type": contentType,
"Content-Disposition": `attachment; filename="${name}"`,

View File

@@ -1497,13 +1497,35 @@ declare module "bun" {
kind: ImportKind;
}
type ModuleFormat = "esm"; // later: "cjs", "iife"
interface BuildConfig {
entrypoints: string[]; // list of file path
outdir?: string; // output directory
target?: Target; // default: "browser"
format?: ModuleFormat; // later: "cjs", "iife"
/**
* Output module format. Top-level await is only supported for `"esm"`.
*
* Can be:
* - `"esm"`
* - `"cjs"` (**experimental**)
* - `"iife"` (**experimental**)
*
* @default "esm"
*/
format?: /**
* ECMAScript Module format
*/
| "esm"
/**
* CommonJS format
* **Experimental**
*/
| "cjs"
/**
* IIFE format
* **Experimental**
*/
| "iife";
naming?:
| string
| {
@@ -1561,6 +1583,18 @@ declare module "bun" {
// /** Only works when runtime=automatic */
// importSource?: string; // default: "react"
// };
/**
* Generate bytecode for the output. This can dramatically improve cold
* start times, but will make the final output larger and slightly increase
* memory usage.
*
* Bytecode is currently only supported for CommonJS (`format: "cjs"`).
*
* Must be `target: "bun"`
* @default false
*/
bytecode?: boolean;
}
namespace Password {
@@ -1781,7 +1815,7 @@ declare module "bun" {
path: string;
loader: Loader;
hash: string | null;
kind: "entry-point" | "chunk" | "asset" | "sourcemap";
kind: "entry-point" | "chunk" | "asset" | "sourcemap" | "bytecode";
sourcemap: BuildArtifact | null;
}
@@ -2282,7 +2316,7 @@ declare module "bun" {
*/
development?: boolean;
error?: (this: Server, request: ErrorLike) => Response | Promise<Response> | undefined | Promise<undefined>;
error?: (this: Server, error: ErrorLike) => Response | Promise<Response> | undefined | Promise<undefined>;
/**
* Uniquely identify a server instance with an ID
@@ -2660,7 +2694,7 @@ declare module "bun" {
* @param closeActiveConnections Immediately terminate in-flight requests, websockets, and stop accepting new connections.
* @default false
*/
stop(closeActiveConnections?: boolean): void;
stop(closeActiveConnections?: boolean): Promise<void>;
/**
* Update the `fetch` and `error` handlers without restarting the server.
@@ -3029,6 +3063,87 @@ declare module "bun" {
type StringLike = string | { toString(): string };
type ColorInput =
| { r: number; g: number; b: number; a?: number }
| [number, number, number]
| [number, number, number, number]
| Uint8Array
| Uint8ClampedArray
| Float32Array
| Float64Array
| string
| number
| { toString(): string };
function color(
input: ColorInput,
outputFormat?: /**
* True color ANSI color string, for use in terminals
* @example \x1b[38;2;100;200;200m
*/
| "ansi"
/**
* 256 color ANSI color string, for use in terminals which don't support true color
*
* Tries to match closest 24-bit color to 256 color palette
*/
| "ansi256"
/**
* Lowercase hex color string without alpha
* @example #aabb11
*/
| "hex"
/**
* RGB color string without alpha
* rgb(100, 200, 200)
*/
| "rgb"
/**
* RGB color string with alpha
* rgba(100, 200, 200, 0.5)
*/
| "rgba"
| "hsl"
| "lab"
| "css"
| "lab"
| "HEX",
): string | null;
function color(
input: ColorInput,
/**
* An array of numbers representing the RGB color
* @example [100, 200, 200]
*/
outputFormat: "[rgb]",
): [number, number, number] | null;
function color(
input: ColorInput,
/**
* An array of numbers representing the RGBA color
* @example [100, 200, 200, 255]
*/
outputFormat: "[rgba]",
): [number, number, number, number] | null;
function color(
input: ColorInput,
/**
* An object representing the RGB color
* @example { r: 100, g: 200, b: 200 }
*/
outputFormat: "{rgb}",
): { r: number; g: number; b: number } | null;
function color(
input: ColorInput,
/**
* An object representing the RGBA color
* @example { r: 100, g: 200, b: 200, a: 0.5 }
*/
outputFormat: "{rgba}",
): { r: number; g: number; b: number; a: number } | null;
function color(input: ColorInput, outputFormat: "number"): number | null;
interface Semver {
/**
* Test if the version satisfies the range. Stringifies both arguments. Returns `true` or `false`.
@@ -3264,8 +3379,9 @@ declare module "bun" {
* Create a new hasher
*
* @param algorithm The algorithm to use. See {@link algorithms} for a list of supported algorithms
* @param hmacKey Optional key for HMAC. Must be a string or `TypedArray`. If not provided, the hasher will be a non-HMAC hasher.
*/
constructor(algorithm: SupportedCryptoAlgorithms);
constructor(algorithm: SupportedCryptoAlgorithms, hmacKey?: string | NodeJS.TypedArray);
/**
* Update the hash with data
@@ -4615,6 +4731,32 @@ declare module "bun" {
* @default cmds[0]
*/
argv0?: string;
/**
* An {@link AbortSignal} that can be used to abort the subprocess.
*
* This is useful for aborting a subprocess when some other part of the
* program is aborted, such as a `fetch` response.
*
* Internally, this works by calling `subprocess.kill(1)`.
*
* @example
* ```ts
* const controller = new AbortController();
* const { signal } = controller;
* const start = performance.now();
* const subprocess = Bun.spawn({
* cmd: ["sleep", "100"],
* signal,
* });
* await Bun.sleep(1);
* controller.abort();
* await subprocess.exited;
* const end = performance.now();
* console.log(end - start); // 1ms instead of 101ms
* ```
*/
signal?: AbortSignal;
}
type OptionsToSubprocess<Opts extends OptionsObject> =
@@ -5118,6 +5260,12 @@ declare module "bun" {
*/
const version: string;
/**
* The current version of Bun with the shortened commit sha of the build
* @example "v1.1.30 (d09df1af)"
*/
const version_with_sha: string;
/**
* The git sha at the time the currently-running version of Bun was compiled
* @example

View File

@@ -0,0 +1 @@
DisableFormat: true

View File

@@ -3645,7 +3645,7 @@ CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\006\040\006\005\026\160\002
END
CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
@@ -7252,7 +7252,7 @@ CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\010\136\303\267\246\103\177\244\340
END
CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
@@ -17020,8 +17020,14 @@ CKA_VALUE MULTILINE_OCTAL
\155\015\277\173\327\222
END
CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
# For Server Distrust After: Sun Jun 30 00:00:00 2024
CKA_NSS_SERVER_DISTRUST_AFTER MULTILINE_OCTAL
\062\064\060\066\063\060\060\060\060\060\060\060\132
END
# For Email Distrust After: Sun Jun 30 00:00:00 2024
CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL
\062\064\060\066\063\060\060\060\060\060\060\060\132
END
# Trust for "GLOBALTRUST 2020"
# Issuer: CN=GLOBALTRUST 2020,O=e-commerce monitoring GmbH,C=AT
@@ -25483,3 +25489,761 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
#
# Certificate "TWCA CYBER Root CA"
#
# Issuer: CN=TWCA CYBER Root CA,OU=Root CA,O=TAIWAN-CA,C=TW
# Serial Number:40:01:34:8c:c2:00:00:00:00:00:00:00:01:3c:f2:c6
# Subject: CN=TWCA CYBER Root CA,OU=Root CA,O=TAIWAN-CA,C=TW
# Not Valid Before: Tue Nov 22 06:54:29 2022
# Not Valid After : Fri Nov 22 15:59:59 2047
# Fingerprint (SHA-256): 3F:63:BB:28:14:BE:17:4E:C8:B6:43:9C:F0:8D:6D:56:F0:B7:C4:05:88:3A:56:48:A3:34:42:4D:6B:3E:C5:58
# Fingerprint (SHA1): F6:B1:1C:1A:83:38:E9:7B:DB:B3:A8:C8:33:24:E0:2D:9C:7F:26:66
CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
CKA_TOKEN CK_BBOOL CK_TRUE
CKA_PRIVATE CK_BBOOL CK_FALSE
CKA_MODIFIABLE CK_BBOOL CK_FALSE
CKA_LABEL UTF8 "TWCA CYBER Root CA"
CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
CKA_SUBJECT MULTILINE_OCTAL
\060\120\061\013\060\011\006\003\125\004\006\023\002\124\127\061
\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116
\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157
\157\164\040\103\101\061\033\060\031\006\003\125\004\003\023\022
\124\127\103\101\040\103\131\102\105\122\040\122\157\157\164\040
\103\101
END
CKA_ID UTF8 "0"
CKA_ISSUER MULTILINE_OCTAL
\060\120\061\013\060\011\006\003\125\004\006\023\002\124\127\061
\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116
\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157
\157\164\040\103\101\061\033\060\031\006\003\125\004\003\023\022
\124\127\103\101\040\103\131\102\105\122\040\122\157\157\164\040
\103\101
END
CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\020\100\001\064\214\302\000\000\000\000\000\000\000\001\074
\362\306
END
CKA_VALUE MULTILINE_OCTAL
\060\202\005\215\060\202\003\165\240\003\002\001\002\002\020\100
\001\064\214\302\000\000\000\000\000\000\000\001\074\362\306\060
\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\120
\061\013\060\011\006\003\125\004\006\023\002\124\127\061\022\060
\020\006\003\125\004\012\023\011\124\101\111\127\101\116\055\103
\101\061\020\060\016\006\003\125\004\013\023\007\122\157\157\164
\040\103\101\061\033\060\031\006\003\125\004\003\023\022\124\127
\103\101\040\103\131\102\105\122\040\122\157\157\164\040\103\101
\060\036\027\015\062\062\061\061\062\062\060\066\065\064\062\071
\132\027\015\064\067\061\061\062\062\061\065\065\071\065\071\132
\060\120\061\013\060\011\006\003\125\004\006\023\002\124\127\061
\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116
\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157
\157\164\040\103\101\061\033\060\031\006\003\125\004\003\023\022
\124\127\103\101\040\103\131\102\105\122\040\122\157\157\164\040
\103\101\060\202\002\042\060\015\006\011\052\206\110\206\367\015
\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202
\002\001\000\306\370\312\036\331\011\040\176\035\154\116\316\217
\343\107\063\104\234\307\311\151\252\072\133\170\356\160\322\222
\370\004\263\122\122\035\147\162\050\241\337\213\135\225\012\376
\352\315\355\367\051\316\360\157\177\254\315\075\357\263\034\105
\152\367\050\220\361\141\127\305\014\304\243\120\135\336\324\265
\313\031\312\200\271\165\316\051\316\322\205\042\354\002\143\314
\104\060\040\332\352\221\133\126\346\035\034\325\235\146\307\077
\337\206\312\113\123\304\331\215\262\035\352\370\334\047\123\243
\107\341\141\314\175\265\260\370\356\163\221\305\316\163\157\316
\356\020\037\032\006\317\351\047\140\305\117\031\344\353\316\042
\046\105\327\140\231\335\316\117\067\340\177\347\143\255\260\270
\131\270\320\006\150\065\140\323\066\256\161\103\004\361\151\145
\170\174\363\037\363\312\050\237\132\040\225\146\264\315\267\356
\217\170\244\105\030\351\046\057\215\233\051\050\261\244\267\072
\155\271\324\034\070\162\105\130\261\136\353\360\050\233\267\202
\312\375\317\326\063\017\237\373\227\236\261\034\234\236\352\137
\136\333\252\335\124\351\060\041\050\155\216\171\363\165\222\214
\046\376\334\305\366\303\260\337\104\131\103\243\266\003\050\366
\010\060\252\015\063\341\357\234\251\007\042\343\131\133\100\217
\332\210\267\151\010\250\267\043\056\104\011\131\067\133\307\343
\027\362\042\353\156\071\122\305\336\124\247\230\311\113\040\225
\334\106\211\137\264\022\371\205\051\216\353\310\047\025\040\300
\113\324\314\174\014\154\064\014\046\233\046\061\246\074\247\366
\331\320\113\242\144\377\073\231\101\162\301\340\160\227\361\044
\273\053\304\164\042\261\254\153\042\062\044\323\170\052\300\300
\241\057\361\122\005\311\077\357\166\146\342\105\330\015\075\255
\225\310\307\211\046\310\017\256\247\003\056\373\301\137\372\040
\341\160\255\260\145\040\067\063\140\260\325\257\327\014\034\302
\220\160\327\112\030\274\176\001\260\260\353\025\036\104\006\315
\244\117\350\014\321\303\040\020\341\124\145\236\266\121\320\032
\166\153\102\132\130\166\064\352\267\067\031\256\056\165\371\226
\345\301\131\367\224\127\051\045\215\072\114\253\115\232\101\320
\137\046\003\002\003\001\000\001\243\143\060\141\060\016\006\003
\125\035\017\001\001\377\004\004\003\002\001\006\060\017\006\003
\125\035\023\001\001\377\004\005\060\003\001\001\377\060\037\006
\003\125\035\043\004\030\060\026\200\024\235\205\141\024\174\301
\142\157\227\150\344\117\067\100\341\255\340\015\126\067\060\035
\006\003\125\035\016\004\026\004\024\235\205\141\024\174\301\142
\157\227\150\344\117\067\100\341\255\340\015\126\067\060\015\006
\011\052\206\110\206\367\015\001\001\014\005\000\003\202\002\001
\000\144\217\172\304\142\016\265\210\314\270\307\206\016\241\112
\026\315\160\013\267\247\205\013\263\166\266\017\247\377\010\213
\013\045\317\250\324\203\165\052\270\226\210\266\373\337\055\055
\264\151\123\041\065\127\326\211\115\163\277\151\217\160\243\141
\314\232\333\036\232\340\040\370\154\273\233\042\235\135\204\061
\232\054\212\335\152\241\327\050\151\312\376\166\125\172\106\147
\353\314\103\210\026\242\003\326\271\027\370\031\154\155\043\002
\177\361\137\320\012\051\043\073\321\252\012\355\251\027\046\124
\012\115\302\245\115\370\305\375\270\201\317\053\054\170\243\147
\114\251\007\232\363\337\136\373\174\365\211\315\164\227\141\020
\152\007\053\201\132\322\216\267\347\040\321\040\156\044\250\204
\047\241\127\254\252\125\130\057\334\331\312\372\150\004\236\355
\104\044\371\164\100\073\043\063\253\203\132\030\046\102\266\155
\124\265\026\140\060\154\261\240\370\270\101\240\135\111\111\322
\145\005\072\352\376\235\141\274\206\331\277\336\323\272\072\261
\177\176\222\064\216\311\000\156\334\230\275\334\354\200\005\255
\002\075\337\145\355\013\003\367\367\026\204\004\061\272\223\224
\330\362\022\370\212\343\277\102\257\247\324\315\021\027\026\310
\102\035\024\250\102\366\322\100\206\240\117\043\312\226\105\126
\140\006\315\267\125\001\246\001\224\145\376\156\005\011\272\264
\244\252\342\357\130\276\275\047\126\330\357\163\161\133\104\063
\362\232\162\352\260\136\076\156\251\122\133\354\160\155\265\207
\217\067\136\074\214\234\316\344\360\316\014\147\101\314\316\366
\200\253\116\314\114\126\365\301\141\131\223\264\076\246\332\270
\067\022\237\052\062\343\213\270\041\354\303\053\145\014\357\042
\336\210\051\073\114\327\372\376\267\341\107\276\234\076\076\203
\373\121\135\365\150\367\056\041\205\334\277\361\132\342\174\327
\305\344\203\301\152\353\272\200\132\336\134\055\160\166\370\310
\345\207\207\312\240\235\241\345\042\022\047\017\104\075\035\154
\352\324\302\213\057\157\171\253\177\120\246\304\031\247\241\172
\267\226\371\301\037\142\132\242\103\007\100\136\046\306\254\355
\256\160\026\305\252\312\162\212\115\260\317\001\213\003\077\156
\327
END
CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
# Trust for "TWCA CYBER Root CA"
# Issuer: CN=TWCA CYBER Root CA,OU=Root CA,O=TAIWAN-CA,C=TW
# Serial Number:40:01:34:8c:c2:00:00:00:00:00:00:00:01:3c:f2:c6
# Subject: CN=TWCA CYBER Root CA,OU=Root CA,O=TAIWAN-CA,C=TW
# Not Valid Before: Tue Nov 22 06:54:29 2022
# Not Valid After : Fri Nov 22 15:59:59 2047
# Fingerprint (SHA-256): 3F:63:BB:28:14:BE:17:4E:C8:B6:43:9C:F0:8D:6D:56:F0:B7:C4:05:88:3A:56:48:A3:34:42:4D:6B:3E:C5:58
# Fingerprint (SHA1): F6:B1:1C:1A:83:38:E9:7B:DB:B3:A8:C8:33:24:E0:2D:9C:7F:26:66
CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
CKA_TOKEN CK_BBOOL CK_TRUE
CKA_PRIVATE CK_BBOOL CK_FALSE
CKA_MODIFIABLE CK_BBOOL CK_FALSE
CKA_LABEL UTF8 "TWCA CYBER Root CA"
CKA_CERT_SHA1_HASH MULTILINE_OCTAL
\366\261\034\032\203\070\351\173\333\263\250\310\063\044\340\055
\234\177\046\146
END
CKA_CERT_MD5_HASH MULTILINE_OCTAL
\013\063\240\227\122\225\324\251\375\273\333\156\243\125\133\121
END
CKA_ISSUER MULTILINE_OCTAL
\060\120\061\013\060\011\006\003\125\004\006\023\002\124\127\061
\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116
\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157
\157\164\040\103\101\061\033\060\031\006\003\125\004\003\023\022
\124\127\103\101\040\103\131\102\105\122\040\122\157\157\164\040
\103\101
END
CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\020\100\001\064\214\302\000\000\000\000\000\000\000\001\074
\362\306
END
CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
#
# Certificate "TWCA Global Root CA G2"
#
# Issuer: CN=TWCA Global Root CA G2,OU=Root CA,O=TAIWAN-CA,C=TW
# Serial Number:40:01:34:8c:c2:00:00:00:00:00:00:00:01:97:58:f4
# Subject: CN=TWCA Global Root CA G2,OU=Root CA,O=TAIWAN-CA,C=TW
# Not Valid Before: Tue Nov 22 06:42:21 2022
# Not Valid After : Fri Nov 22 15:59:59 2047
# Fingerprint (SHA-256): 3A:00:72:D4:9F:FC:04:E9:96:C5:9A:EB:75:99:1D:3C:34:0F:36:15:D6:FD:4D:CE:90:AC:0B:3D:88:EA:D4:F4
# Fingerprint (SHA1): 73:FE:92:2F:83:63:91:FF:C8:C6:C4:DA:D6:20:2F:6B:07:2E:7F:1B
CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
CKA_TOKEN CK_BBOOL CK_TRUE
CKA_PRIVATE CK_BBOOL CK_FALSE
CKA_MODIFIABLE CK_BBOOL CK_FALSE
CKA_LABEL UTF8 "TWCA Global Root CA G2"
CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
CKA_SUBJECT MULTILINE_OCTAL
\060\124\061\013\060\011\006\003\125\004\006\023\002\124\127\061
\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116
\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157
\157\164\040\103\101\061\037\060\035\006\003\125\004\003\023\026
\124\127\103\101\040\107\154\157\142\141\154\040\122\157\157\164
\040\103\101\040\107\062
END
CKA_ID UTF8 "0"
CKA_ISSUER MULTILINE_OCTAL
\060\124\061\013\060\011\006\003\125\004\006\023\002\124\127\061
\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116
\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157
\157\164\040\103\101\061\037\060\035\006\003\125\004\003\023\026
\124\127\103\101\040\107\154\157\142\141\154\040\122\157\157\164
\040\103\101\040\107\062
END
CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\020\100\001\064\214\302\000\000\000\000\000\000\000\001\227
\130\364
END
CKA_VALUE MULTILINE_OCTAL
\060\202\005\225\060\202\003\175\240\003\002\001\002\002\020\100
\001\064\214\302\000\000\000\000\000\000\000\001\227\130\364\060
\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\124
\061\013\060\011\006\003\125\004\006\023\002\124\127\061\022\060
\020\006\003\125\004\012\023\011\124\101\111\127\101\116\055\103
\101\061\020\060\016\006\003\125\004\013\023\007\122\157\157\164
\040\103\101\061\037\060\035\006\003\125\004\003\023\026\124\127
\103\101\040\107\154\157\142\141\154\040\122\157\157\164\040\103
\101\040\107\062\060\036\027\015\062\062\061\061\062\062\060\066
\064\062\062\061\132\027\015\064\067\061\061\062\062\061\065\065
\071\065\071\132\060\124\061\013\060\011\006\003\125\004\006\023
\002\124\127\061\022\060\020\006\003\125\004\012\023\011\124\101
\111\127\101\116\055\103\101\061\020\060\016\006\003\125\004\013
\023\007\122\157\157\164\040\103\101\061\037\060\035\006\003\125
\004\003\023\026\124\127\103\101\040\107\154\157\142\141\154\040
\122\157\157\164\040\103\101\040\107\062\060\202\002\042\060\015
\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002
\017\000\060\202\002\012\002\202\002\001\000\252\016\325\040\222
\001\255\202\371\014\010\221\064\153\212\026\320\106\026\377\003
\270\330\215\352\223\064\373\377\053\275\375\156\252\334\233\362
\206\201\125\365\211\034\304\215\165\152\130\170\221\023\036\002
\023\160\075\357\276\012\347\000\217\270\061\345\164\305\060\276
\377\175\326\231\345\302\102\243\317\041\326\263\010\177\221\325
\141\346\242\225\020\015\357\136\227\013\111\070\325\042\260\327
\213\131\157\237\065\233\177\322\221\314\172\177\273\240\237\336
\125\063\366\113\215\012\352\175\011\300\171\334\275\104\342\376
\034\347\144\041\050\317\004\112\342\264\277\206\171\052\273\016
\223\311\217\136\254\060\071\122\220\007\271\352\234\046\102\024
\304\147\106\376\321\032\150\241\076\120\031\243\046\012\047\051
\220\302\366\264\353\163\232\170\036\341\230\364\145\014\065\041
\006\370\013\336\142\345\115\301\263\135\331\271\372\141\227\052
\343\352\307\104\125\044\222\376\022\247\077\304\167\340\055\002
\201\007\325\373\175\346\020\236\072\264\250\357\354\373\120\352
\065\317\314\176\273\102\271\104\154\122\351\277\052\162\037\077
\336\233\160\351\334\132\305\073\273\277\360\131\205\257\057\301
\260\024\171\005\254\165\237\045\365\021\047\006\140\041\307\155
\145\276\250\211\234\345\254\106\337\370\135\104\003\215\140\275
\367\261\015\314\057\357\101\124\057\356\153\225\271\116\174\064
\337\073\371\167\235\175\315\007\075\034\006\063\022\200\354\162
\234\362\055\202\332\325\073\304\307\371\004\303\144\002\174\365
\065\140\247\264\106\051\056\033\357\245\130\200\056\172\211\121
\070\066\074\375\241\167\270\200\060\320\212\336\215\247\064\046
\354\043\273\030\125\030\066\105\356\355\001\006\252\115\277\144
\014\312\230\227\032\061\002\146\370\170\150\133\210\337\011\250
\347\233\372\064\155\160\034\041\255\010\213\362\241\266\254\166
\152\277\361\200\045\000\276\074\036\115\256\271\074\266\225\143
\275\153\176\107\022\220\125\105\021\215\354\027\037\301\276\047
\201\223\127\143\151\000\046\167\213\303\131\345\173\321\015\104
\362\250\360\367\205\232\005\367\302\056\160\232\223\205\330\225
\220\061\220\124\246\354\013\237\067\105\017\002\003\001\000\001
\243\143\060\141\060\016\006\003\125\035\017\001\001\377\004\004
\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004\005
\060\003\001\001\377\060\037\006\003\125\035\043\004\030\060\026
\200\024\222\214\324\066\321\133\107\123\304\161\015\204\335\144
\052\365\066\144\100\347\060\035\006\003\125\035\016\004\026\004
\024\222\214\324\066\321\133\107\123\304\161\015\204\335\144\052
\365\066\144\100\347\060\015\006\011\052\206\110\206\367\015\001
\001\014\005\000\003\202\002\001\000\045\374\113\332\220\264\332
\165\347\101\072\201\321\246\376\240\152\363\030\161\142\152\044
\010\213\251\172\115\311\125\316\317\020\050\056\004\031\226\005
\317\135\002\040\052\073\263\125\077\001\315\102\315\262\167\355
\377\165\363\174\167\333\226\245\317\214\147\006\364\244\233\162
\366\041\111\011\230\243\062\136\167\132\143\011\357\142\103\227
\002\070\265\352\074\030\120\150\374\131\133\331\171\324\361\344
\126\110\023\126\330\323\161\013\136\170\224\070\021\105\372\005
\027\365\016\165\036\142\122\141\106\272\056\031\255\206\264\210
\017\261\120\346\100\000\064\032\225\235\223\340\121\371\324\125
\106\351\225\074\045\206\056\227\327\001\061\030\104\354\034\140
\351\175\151\257\062\370\227\100\045\044\266\215\032\125\074\305
\267\367\274\006\122\073\161\060\160\076\161\027\176\361\146\004
\136\135\274\212\061\103\246\222\035\173\124\322\245\066\213\157
\215\326\136\332\324\303\056\035\337\071\125\140\202\060\236\047
\377\216\200\335\143\114\246\125\065\330\320\063\251\200\155\076
\136\235\314\250\147\200\146\372\231\127\014\122\312\031\165\260
\070\065\125\052\201\305\214\036\126\327\137\220\362\040\330\332
\340\146\161\351\262\170\253\147\271\044\156\153\066\162\374\157
\215\375\177\162\071\050\147\122\221\005\037\127\145\322\243\247
\015\141\372\241\347\325\065\106\225\311\006\207\366\060\354\062
\121\251\254\126\300\041\116\243\024\164\005\072\274\343\277\155
\075\116\077\136\245\244\155\051\277\204\121\165\123\216\206\032
\365\121\160\052\015\034\116\100\341\375\243\343\245\053\147\220
\222\307\154\256\205\277\072\233\027\025\312\234\052\223\324\115
\071\015\274\040\010\243\215\210\154\011\015\214\256\104\041\115
\311\161\354\330\046\327\027\236\055\021\030\074\243\042\175\270
\047\124\277\150\310\073\102\314\217\136\116\347\334\302\305\372
\152\104\017\215\126\210\172\337\211\204\154\240\263\076\075\361
\145\000\011\210\352\052\353\100\316\263\135\254\062\027\256\301
\233\351\320\301\365\111\224\335\247\316\174\132\007\353\256\040
\234\027\060\222\151\223\162\363\232\133\161\233\376\152\337\172
\060\151\216\263\056\333\017\054\335
END
CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
# Trust for "TWCA Global Root CA G2"
# Issuer: CN=TWCA Global Root CA G2,OU=Root CA,O=TAIWAN-CA,C=TW
# Serial Number:40:01:34:8c:c2:00:00:00:00:00:00:00:01:97:58:f4
# Subject: CN=TWCA Global Root CA G2,OU=Root CA,O=TAIWAN-CA,C=TW
# Not Valid Before: Tue Nov 22 06:42:21 2022
# Not Valid After : Fri Nov 22 15:59:59 2047
# Fingerprint (SHA-256): 3A:00:72:D4:9F:FC:04:E9:96:C5:9A:EB:75:99:1D:3C:34:0F:36:15:D6:FD:4D:CE:90:AC:0B:3D:88:EA:D4:F4
# Fingerprint (SHA1): 73:FE:92:2F:83:63:91:FF:C8:C6:C4:DA:D6:20:2F:6B:07:2E:7F:1B
CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
CKA_TOKEN CK_BBOOL CK_TRUE
CKA_PRIVATE CK_BBOOL CK_FALSE
CKA_MODIFIABLE CK_BBOOL CK_FALSE
CKA_LABEL UTF8 "TWCA Global Root CA G2"
CKA_CERT_SHA1_HASH MULTILINE_OCTAL
\163\376\222\057\203\143\221\377\310\306\304\332\326\040\057\153
\007\056\177\033
END
CKA_CERT_MD5_HASH MULTILINE_OCTAL
\023\215\135\372\031\265\346\253\144\173\020\164\160\032\043\056
END
CKA_ISSUER MULTILINE_OCTAL
\060\124\061\013\060\011\006\003\125\004\006\023\002\124\127\061
\022\060\020\006\003\125\004\012\023\011\124\101\111\127\101\116
\055\103\101\061\020\060\016\006\003\125\004\013\023\007\122\157
\157\164\040\103\101\061\037\060\035\006\003\125\004\003\023\026
\124\127\103\101\040\107\154\157\142\141\154\040\122\157\157\164
\040\103\101\040\107\062
END
CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\020\100\001\064\214\302\000\000\000\000\000\000\000\001\227
\130\364
END
CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
#
# Certificate "SecureSign Root CA12"
#
# Issuer: CN=SecureSign Root CA12,O="Cybertrust Japan Co., Ltd.",C=JP
# Serial Number:66:f9:c7:c1:af:ec:c2:51:b4:ed:53:97:e6:e6:82:c3:2b:1c:90:16
# Subject: CN=SecureSign Root CA12,O="Cybertrust Japan Co., Ltd.",C=JP
# Not Valid Before: Wed Apr 08 05:36:46 2020
# Not Valid After : Sun Apr 08 05:36:46 2040
# Fingerprint (SHA-256): 3F:03:4B:B5:70:4D:44:B2:D0:85:45:A0:20:57:DE:93:EB:F3:90:5F:CE:72:1A:CB:C7:30:C0:6D:DA:EE:90:4E
# Fingerprint (SHA1): 7A:22:1E:3D:DE:1B:06:AC:9E:C8:47:70:16:8E:3C:E5:F7:6B:06:F4
CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
CKA_TOKEN CK_BBOOL CK_TRUE
CKA_PRIVATE CK_BBOOL CK_FALSE
CKA_MODIFIABLE CK_BBOOL CK_FALSE
CKA_LABEL UTF8 "SecureSign Root CA12"
CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
CKA_SUBJECT MULTILINE_OCTAL
\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061
\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164
\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040
\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123
\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103
\101\061\062
END
CKA_ID UTF8 "0"
CKA_ISSUER MULTILINE_OCTAL
\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061
\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164
\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040
\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123
\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103
\101\061\062
END
CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\024\146\371\307\301\257\354\302\121\264\355\123\227\346\346
\202\303\053\034\220\026
END
CKA_VALUE MULTILINE_OCTAL
\060\202\003\162\060\202\002\132\240\003\002\001\002\002\024\146
\371\307\301\257\354\302\121\264\355\123\227\346\346\202\303\053
\034\220\026\060\015\006\011\052\206\110\206\367\015\001\001\013
\005\000\060\121\061\013\060\011\006\003\125\004\006\023\002\112
\120\061\043\060\041\006\003\125\004\012\023\032\103\171\142\145
\162\164\162\165\163\164\040\112\141\160\141\156\040\103\157\056
\054\040\114\164\144\056\061\035\060\033\006\003\125\004\003\023
\024\123\145\143\165\162\145\123\151\147\156\040\122\157\157\164
\040\103\101\061\062\060\036\027\015\062\060\060\064\060\070\060
\065\063\066\064\066\132\027\015\064\060\060\064\060\070\060\065
\063\066\064\066\132\060\121\061\013\060\011\006\003\125\004\006
\023\002\112\120\061\043\060\041\006\003\125\004\012\023\032\103
\171\142\145\162\164\162\165\163\164\040\112\141\160\141\156\040
\103\157\056\054\040\114\164\144\056\061\035\060\033\006\003\125
\004\003\023\024\123\145\143\165\162\145\123\151\147\156\040\122
\157\157\164\040\103\101\061\062\060\202\001\042\060\015\006\011
\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017\000
\060\202\001\012\002\202\001\001\000\272\071\301\067\172\150\105
\053\024\264\353\344\023\353\127\165\043\115\217\044\055\026\350
\256\216\311\175\244\127\073\052\166\045\063\203\154\352\062\212
\224\233\116\074\226\344\375\121\277\231\311\223\176\277\371\255
\247\262\110\053\007\034\047\365\114\274\160\022\167\244\205\124
\265\375\220\172\344\243\344\121\130\003\315\020\171\171\356\153
\223\037\144\216\153\144\253\243\023\343\161\376\175\253\234\335
\047\123\067\263\252\030\302\131\046\354\133\037\322\346\145\174
\357\223\275\330\130\134\013\300\343\145\157\074\307\312\131\343
\376\156\137\254\203\276\375\135\045\116\052\051\073\326\013\253
\027\062\170\244\341\076\224\106\276\142\156\233\336\106\250\261
\026\347\205\156\364\010\100\105\021\240\236\124\104\204\367\330
\066\316\365\120\107\334\054\060\233\356\300\365\226\322\376\011
\206\307\006\131\256\117\256\216\021\230\173\363\013\122\252\142
\046\252\041\337\216\045\063\171\227\026\111\215\365\076\325\107
\237\067\061\111\063\162\005\115\014\266\125\214\361\127\217\212
\207\321\255\305\021\022\071\240\255\002\003\001\000\001\243\102
\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003
\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003
\002\001\006\060\035\006\003\125\035\016\004\026\004\024\127\064
\363\164\317\004\113\325\045\346\361\100\266\054\114\331\055\351
\240\255\060\015\006\011\052\206\110\206\367\015\001\001\013\005
\000\003\202\001\001\000\076\273\333\027\026\322\362\024\001\040
\054\070\203\113\255\276\312\205\172\232\266\233\153\246\341\374
\245\072\254\255\264\050\072\257\327\001\203\111\053\143\242\335
\232\144\016\230\134\157\335\216\273\212\124\042\055\112\023\363
\256\100\103\333\117\221\267\206\032\354\000\264\101\201\244\117
\372\152\213\210\263\166\010\162\052\111\100\303\323\303\205\211
\230\020\245\235\157\031\267\273\317\172\145\125\333\067\353\074
\212\162\062\227\036\232\051\076\255\215\346\243\033\155\365\165
\032\346\260\150\271\133\242\356\151\107\047\065\241\206\231\200
\363\063\113\341\153\244\046\303\357\164\131\154\172\242\144\266
\036\104\303\120\340\017\071\075\251\063\361\245\363\322\275\142
\204\254\216\034\251\315\132\275\067\073\156\012\042\264\364\025
\347\221\130\305\072\104\323\225\050\331\300\145\351\162\312\320
\017\275\037\263\025\331\251\343\244\107\011\236\340\313\067\373
\375\275\227\325\276\030\032\151\242\071\201\331\032\365\253\177
\310\343\342\147\013\235\364\014\352\124\337\322\262\257\261\042
\361\040\337\274\104\034
END
CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
# Trust for "SecureSign Root CA12"
# Issuer: CN=SecureSign Root CA12,O="Cybertrust Japan Co., Ltd.",C=JP
# Serial Number:66:f9:c7:c1:af:ec:c2:51:b4:ed:53:97:e6:e6:82:c3:2b:1c:90:16
# Subject: CN=SecureSign Root CA12,O="Cybertrust Japan Co., Ltd.",C=JP
# Not Valid Before: Wed Apr 08 05:36:46 2020
# Not Valid After : Sun Apr 08 05:36:46 2040
# Fingerprint (SHA-256): 3F:03:4B:B5:70:4D:44:B2:D0:85:45:A0:20:57:DE:93:EB:F3:90:5F:CE:72:1A:CB:C7:30:C0:6D:DA:EE:90:4E
# Fingerprint (SHA1): 7A:22:1E:3D:DE:1B:06:AC:9E:C8:47:70:16:8E:3C:E5:F7:6B:06:F4
CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
CKA_TOKEN CK_BBOOL CK_TRUE
CKA_PRIVATE CK_BBOOL CK_FALSE
CKA_MODIFIABLE CK_BBOOL CK_FALSE
CKA_LABEL UTF8 "SecureSign Root CA12"
CKA_CERT_SHA1_HASH MULTILINE_OCTAL
\172\042\036\075\336\033\006\254\236\310\107\160\026\216\074\345
\367\153\006\364
END
CKA_CERT_MD5_HASH MULTILINE_OCTAL
\306\211\312\144\102\233\142\010\111\013\036\177\351\007\075\350
END
CKA_ISSUER MULTILINE_OCTAL
\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061
\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164
\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040
\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123
\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103
\101\061\062
END
CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\024\146\371\307\301\257\354\302\121\264\355\123\227\346\346
\202\303\053\034\220\026
END
CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
#
# Certificate "SecureSign Root CA14"
#
# Issuer: CN=SecureSign Root CA14,O="Cybertrust Japan Co., Ltd.",C=JP
# Serial Number:64:db:5a:0c:20:4e:e8:d7:29:77:c8:50:27:a2:5a:27:dd:2d:f2:cb
# Subject: CN=SecureSign Root CA14,O="Cybertrust Japan Co., Ltd.",C=JP
# Not Valid Before: Wed Apr 08 07:06:19 2020
# Not Valid After : Sat Apr 08 07:06:19 2045
# Fingerprint (SHA-256): 4B:00:9C:10:34:49:4F:9A:B5:6B:BA:3B:A1:D6:27:31:FC:4D:20:D8:95:5A:DC:EC:10:A9:25:60:72:61:E3:38
# Fingerprint (SHA1): DD:50:C0:F7:79:B3:64:2E:74:A2:B8:9D:9F:D3:40:DD:BB:F0:F2:4F
CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
CKA_TOKEN CK_BBOOL CK_TRUE
CKA_PRIVATE CK_BBOOL CK_FALSE
CKA_MODIFIABLE CK_BBOOL CK_FALSE
CKA_LABEL UTF8 "SecureSign Root CA14"
CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
CKA_SUBJECT MULTILINE_OCTAL
\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061
\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164
\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040
\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123
\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103
\101\061\064
END
CKA_ID UTF8 "0"
CKA_ISSUER MULTILINE_OCTAL
\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061
\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164
\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040
\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123
\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103
\101\061\064
END
CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\024\144\333\132\014\040\116\350\327\051\167\310\120\047\242
\132\047\335\055\362\313
END
CKA_VALUE MULTILINE_OCTAL
\060\202\005\162\060\202\003\132\240\003\002\001\002\002\024\144
\333\132\014\040\116\350\327\051\167\310\120\047\242\132\047\335
\055\362\313\060\015\006\011\052\206\110\206\367\015\001\001\014
\005\000\060\121\061\013\060\011\006\003\125\004\006\023\002\112
\120\061\043\060\041\006\003\125\004\012\023\032\103\171\142\145
\162\164\162\165\163\164\040\112\141\160\141\156\040\103\157\056
\054\040\114\164\144\056\061\035\060\033\006\003\125\004\003\023
\024\123\145\143\165\162\145\123\151\147\156\040\122\157\157\164
\040\103\101\061\064\060\036\027\015\062\060\060\064\060\070\060
\067\060\066\061\071\132\027\015\064\065\060\064\060\070\060\067
\060\066\061\071\132\060\121\061\013\060\011\006\003\125\004\006
\023\002\112\120\061\043\060\041\006\003\125\004\012\023\032\103
\171\142\145\162\164\162\165\163\164\040\112\141\160\141\156\040
\103\157\056\054\040\114\164\144\056\061\035\060\033\006\003\125
\004\003\023\024\123\145\143\165\162\145\123\151\147\156\040\122
\157\157\164\040\103\101\061\064\060\202\002\042\060\015\006\011
\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000
\060\202\002\012\002\202\002\001\000\305\322\172\241\326\212\277
\026\061\320\230\321\072\224\374\132\270\156\042\301\142\367\247
\012\047\357\120\366\056\261\236\150\022\360\154\044\143\071\361
\360\337\020\306\336\267\122\040\325\122\133\102\231\236\363\240
\276\122\037\137\314\147\155\247\056\120\242\301\227\215\266\370
\225\365\260\272\334\235\340\276\313\337\367\070\362\107\365\246
\232\222\225\052\142\131\120\013\242\261\065\347\145\262\141\262
\352\222\161\151\344\051\360\117\201\201\004\074\262\245\133\324
\305\250\131\147\173\125\034\111\253\172\235\302\347\163\115\357
\315\011\302\304\127\022\333\001\016\043\171\011\007\073\242\350
\374\212\317\217\300\106\044\234\070\047\340\203\235\033\240\277
\170\025\020\353\206\116\012\132\375\337\332\054\202\176\356\312
\366\051\341\372\161\241\367\210\150\234\234\360\215\276\017\111
\221\330\352\072\371\375\320\150\161\333\351\265\053\116\202\222
\157\146\037\340\360\334\114\354\312\321\352\272\164\006\371\263
\204\220\224\321\137\216\163\031\020\135\002\345\160\245\300\020
\320\020\174\157\305\130\111\264\260\156\232\332\175\225\365\314
\332\002\257\270\054\175\171\217\276\103\361\371\050\050\215\011
\103\370\010\335\153\310\213\054\044\261\215\122\007\275\170\233
\313\312\150\262\244\335\014\114\171\140\306\231\321\223\361\060
\032\007\323\256\042\302\352\316\361\204\011\314\340\024\156\177
\077\176\322\202\205\254\334\251\026\116\205\240\140\313\366\234
\327\310\263\216\355\306\233\230\165\015\125\350\137\345\225\213
\002\244\256\103\051\050\021\244\346\022\060\001\113\165\153\036
\146\235\171\057\245\166\057\035\100\264\155\311\175\171\010\354
\321\152\266\135\052\262\245\146\275\153\205\364\164\126\303\365
\347\165\122\050\054\245\377\146\107\245\324\376\376\236\124\277
\145\176\001\326\060\217\245\066\234\242\120\034\356\070\200\001
\110\306\307\164\364\306\254\303\100\111\026\141\164\054\257\214
\157\065\355\173\030\000\133\066\074\234\120\015\312\222\063\020
\361\046\111\155\337\165\044\067\202\042\327\350\226\375\025\113
\002\226\076\007\162\225\176\253\075\114\056\327\312\360\337\340
\130\077\055\057\004\232\070\243\001\002\003\001\000\001\243\102
\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003
\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003
\002\001\006\060\035\006\003\125\035\016\004\026\004\024\006\223
\243\012\136\050\151\067\252\141\035\353\353\374\055\157\043\344
\363\240\060\015\006\011\052\206\110\206\367\015\001\001\014\005
\000\003\202\002\001\000\226\200\162\011\006\176\234\314\223\004
\026\273\240\072\215\222\116\267\021\032\012\161\161\020\315\004
\255\177\245\105\120\020\146\116\112\101\242\003\331\021\117\172
\067\271\113\342\306\217\062\146\165\045\373\353\316\077\003\051
\046\215\270\026\035\366\037\063\156\110\346\350\370\127\262\033
\171\337\073\207\012\342\144\272\000\312\154\357\176\320\043\353
\170\217\377\144\233\064\067\237\065\145\242\244\000\075\022\043
\226\130\135\312\143\207\306\243\007\210\115\347\151\166\212\123
\315\361\117\354\102\362\223\343\231\244\067\074\207\270\142\333
\360\354\037\067\077\067\137\103\314\121\235\265\360\227\302\267
\205\152\150\013\104\036\345\121\356\223\316\113\156\206\301\322
\014\044\131\066\032\237\054\221\217\343\030\333\224\225\012\355
\221\252\016\231\334\226\123\343\141\203\306\026\272\043\272\334
\335\176\032\306\173\102\266\331\132\005\334\232\137\325\337\270
\332\107\175\332\070\333\254\071\325\036\153\154\052\027\214\141
\315\261\155\162\001\303\303\040\000\142\150\026\061\325\166\252
\206\273\016\252\236\306\371\360\331\370\015\041\002\344\305\050
\026\131\021\271\331\151\163\052\222\170\270\222\127\233\010\362
\072\345\057\225\260\130\267\153\040\024\155\024\357\012\274\176
\330\125\330\210\332\057\372\031\245\373\213\340\177\071\365\162
\053\205\304\054\254\357\031\105\222\114\263\141\007\334\115\037
\156\322\201\023\134\232\363\022\147\203\317\233\077\213\237\235
\244\271\250\226\003\172\305\356\040\336\063\332\057\236\032\172
\164\036\341\356\314\132\072\004\335\263\032\004\250\024\143\254
\267\107\022\203\232\154\365\346\351\025\025\221\032\204\031\016
\224\104\347\022\216\045\133\200\147\031\334\143\223\020\013\145
\056\212\372\011\232\116\332\206\050\175\252\141\065\330\016\247
\050\032\273\122\340\170\370\154\272\154\260\156\271\207\136\351
\231\065\067\361\075\144\053\251\240\064\223\317\143\057\325\201
\337\256\143\047\245\036\116\215\334\051\170\131\370\371\241\040
\214\247\046\100\156\202\162\315\170\262\310\217\074\036\163\347
\301\037\277\317\316\245\052\233\333\104\144\062\240\273\177\134
\045\023\110\265\177\222
END
CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
# Trust for "SecureSign Root CA14"
# Issuer: CN=SecureSign Root CA14,O="Cybertrust Japan Co., Ltd.",C=JP
# Serial Number:64:db:5a:0c:20:4e:e8:d7:29:77:c8:50:27:a2:5a:27:dd:2d:f2:cb
# Subject: CN=SecureSign Root CA14,O="Cybertrust Japan Co., Ltd.",C=JP
# Not Valid Before: Wed Apr 08 07:06:19 2020
# Not Valid After : Sat Apr 08 07:06:19 2045
# Fingerprint (SHA-256): 4B:00:9C:10:34:49:4F:9A:B5:6B:BA:3B:A1:D6:27:31:FC:4D:20:D8:95:5A:DC:EC:10:A9:25:60:72:61:E3:38
# Fingerprint (SHA1): DD:50:C0:F7:79:B3:64:2E:74:A2:B8:9D:9F:D3:40:DD:BB:F0:F2:4F
CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
CKA_TOKEN CK_BBOOL CK_TRUE
CKA_PRIVATE CK_BBOOL CK_FALSE
CKA_MODIFIABLE CK_BBOOL CK_FALSE
CKA_LABEL UTF8 "SecureSign Root CA14"
CKA_CERT_SHA1_HASH MULTILINE_OCTAL
\335\120\300\367\171\263\144\056\164\242\270\235\237\323\100\335
\273\360\362\117
END
CKA_CERT_MD5_HASH MULTILINE_OCTAL
\161\015\162\372\222\031\145\136\211\004\254\026\063\360\274\325
END
CKA_ISSUER MULTILINE_OCTAL
\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061
\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164
\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040
\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123
\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103
\101\061\064
END
CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\024\144\333\132\014\040\116\350\327\051\167\310\120\047\242
\132\047\335\055\362\313
END
CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE
#
# Certificate "SecureSign Root CA15"
#
# Issuer: CN=SecureSign Root CA15,O="Cybertrust Japan Co., Ltd.",C=JP
# Serial Number:16:15:c7:c3:d8:49:a7:be:69:0c:8a:88:ed:f0:70:f9:dd:b7:3e:87
# Subject: CN=SecureSign Root CA15,O="Cybertrust Japan Co., Ltd.",C=JP
# Not Valid Before: Wed Apr 08 08:32:56 2020
# Not Valid After : Sat Apr 08 08:32:56 2045
# Fingerprint (SHA-256): E7:78:F0:F0:95:FE:84:37:29:CD:1A:00:82:17:9E:53:14:A9:C2:91:44:28:05:E1:FB:1D:8F:B6:B8:88:6C:3A
# Fingerprint (SHA1): CB:BA:83:C8:C1:5A:5D:F1:F9:73:6F:CA:D7:EF:28:13:06:4A:07:7D
CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE
CKA_TOKEN CK_BBOOL CK_TRUE
CKA_PRIVATE CK_BBOOL CK_FALSE
CKA_MODIFIABLE CK_BBOOL CK_FALSE
CKA_LABEL UTF8 "SecureSign Root CA15"
CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509
CKA_SUBJECT MULTILINE_OCTAL
\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061
\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164
\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040
\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123
\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103
\101\061\065
END
CKA_ID UTF8 "0"
CKA_ISSUER MULTILINE_OCTAL
\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061
\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164
\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040
\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123
\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103
\101\061\065
END
CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\024\026\025\307\303\330\111\247\276\151\014\212\210\355\360
\160\371\335\267\076\207
END
CKA_VALUE MULTILINE_OCTAL
\060\202\002\043\060\202\001\251\240\003\002\001\002\002\024\026
\025\307\303\330\111\247\276\151\014\212\210\355\360\160\371\335
\267\076\207\060\012\006\010\052\206\110\316\075\004\003\003\060
\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061\043
\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164\162
\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040\114
\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123\145
\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103\101
\061\065\060\036\027\015\062\060\060\064\060\070\060\070\063\062
\065\066\132\027\015\064\065\060\064\060\070\060\070\063\062\065
\066\132\060\121\061\013\060\011\006\003\125\004\006\023\002\112
\120\061\043\060\041\006\003\125\004\012\023\032\103\171\142\145
\162\164\162\165\163\164\040\112\141\160\141\156\040\103\157\056
\054\040\114\164\144\056\061\035\060\033\006\003\125\004\003\023
\024\123\145\143\165\162\145\123\151\147\156\040\122\157\157\164
\040\103\101\061\065\060\166\060\020\006\007\052\206\110\316\075
\002\001\006\005\053\201\004\000\042\003\142\000\004\013\120\164
\215\144\062\231\231\263\322\140\010\270\042\216\106\164\054\170
\300\053\104\055\155\137\035\311\256\113\122\040\203\075\270\024
\155\123\207\140\236\137\154\205\333\006\024\225\340\307\050\377
\235\137\344\252\361\263\213\155\355\117\057\113\311\112\224\221
\144\165\376\001\354\301\330\353\172\224\170\126\030\103\137\153
\201\313\366\274\332\264\014\266\051\223\010\151\217\243\102\060
\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001
\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003\002
\001\006\060\035\006\003\125\035\016\004\026\004\024\353\101\310
\256\374\325\236\121\110\365\275\213\364\207\040\223\101\053\323
\364\060\012\006\010\052\206\110\316\075\004\003\003\003\150\000
\060\145\002\061\000\331\056\211\176\136\116\244\021\007\275\131
\302\007\336\253\062\070\123\052\106\104\006\027\172\316\121\351
\340\377\146\055\011\116\340\117\364\005\321\205\366\065\140\334
\365\162\263\106\175\002\060\104\230\106\032\202\205\036\141\151
\211\113\007\113\146\265\236\252\272\240\036\101\331\001\164\072
\156\105\072\211\200\031\173\062\230\125\143\253\353\143\156\223
\155\253\033\011\140\061\116
END
CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE
CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE
CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE
# Trust for "SecureSign Root CA15"
# Issuer: CN=SecureSign Root CA15,O="Cybertrust Japan Co., Ltd.",C=JP
# Serial Number:16:15:c7:c3:d8:49:a7:be:69:0c:8a:88:ed:f0:70:f9:dd:b7:3e:87
# Subject: CN=SecureSign Root CA15,O="Cybertrust Japan Co., Ltd.",C=JP
# Not Valid Before: Wed Apr 08 08:32:56 2020
# Not Valid After : Sat Apr 08 08:32:56 2045
# Fingerprint (SHA-256): E7:78:F0:F0:95:FE:84:37:29:CD:1A:00:82:17:9E:53:14:A9:C2:91:44:28:05:E1:FB:1D:8F:B6:B8:88:6C:3A
# Fingerprint (SHA1): CB:BA:83:C8:C1:5A:5D:F1:F9:73:6F:CA:D7:EF:28:13:06:4A:07:7D
CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST
CKA_TOKEN CK_BBOOL CK_TRUE
CKA_PRIVATE CK_BBOOL CK_FALSE
CKA_MODIFIABLE CK_BBOOL CK_FALSE
CKA_LABEL UTF8 "SecureSign Root CA15"
CKA_CERT_SHA1_HASH MULTILINE_OCTAL
\313\272\203\310\301\132\135\361\371\163\157\312\327\357\050\023
\006\112\007\175
END
CKA_CERT_MD5_HASH MULTILINE_OCTAL
\023\060\374\304\142\246\251\336\265\301\150\257\265\322\061\107
END
CKA_ISSUER MULTILINE_OCTAL
\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061
\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164
\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040
\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123
\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103
\101\061\065
END
CKA_SERIAL_NUMBER MULTILINE_OCTAL
\002\024\026\025\307\303\330\111\247\276\151\014\212\210\355\360
\160\371\335\267\076\207
END
CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR
CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST
CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE

View File

@@ -3614,4 +3614,101 @@ static struct us_cert_string_t root_certs[] = {
"fKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFwhVmpHqTm6iMxoAACMQD94viz\n"
"rxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQpYXFuXqUPoeovQA=\n"
"-----END CERTIFICATE-----",.len=917},
/* TWCA CYBER Root CA */
{.str="-----BEGIN CERTIFICATE-----\n"
"MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYD\n"
"VQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQD\n"
"ExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQ\n"
"MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRsw\n"
"GQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK\n"
"AoICAQDG+Moe2Qkgfh1sTs6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33\n"
"Kc7wb3+szT3vsxxFavcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYd\n"
"HNWdZsc/34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i\n"
"JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjp\n"
"Ji+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY55\n"
"83WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP2oi3aQiotyMuRAlZN1vH4xfy\n"
"IutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZ\n"
"QXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff\n"
"+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0Ja\n"
"WHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMC\n"
"AQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd\n"
"BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIBAGSPesRi\n"
"DrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olNc79p\n"
"j3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x\n"
"X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o63\n"
"5yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1J\n"
"SdJlBTrq/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4\n"
"iuO/Qq+n1M0RFxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY\n"
"73NxW0Qz8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4\n"
"NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrr\n"
"uoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0Be\n"
"Jsas7a5wFsWqynKKTbDPAYsDP27X\n"
"-----END CERTIFICATE-----",.len=1980},
/* SecureSign Root CA12 */
{.str="-----BEGIN CERTIFICATE-----\n"
"MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTEL\n"
"MAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYD\n"
"VQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2\n"
"NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRk\n"
"LjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IB\n"
"DwAwggEKAoIBAQC6OcE3emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048\n"
"luT9Ub+ZyZN+v/mtp7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPj\n"
"cf59q5zdJ1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur\n"
"FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5P\n"
"ro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMB\n"
"AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0\n"
"zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOCAQEAPrvbFxbS8hQBICw4g0utvsqF\n"
"epq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGB\n"
"pE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBo\n"
"uVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7\n"
"bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/\n"
"yOPiZwud9AzqVN/Ssq+xIvEg37xEHA==\n"
"-----END CERTIFICATE-----",.len=1254},
/* SecureSign Root CA14 */
{.str="-----BEGIN CERTIFICATE-----\n"
"MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTEL\n"
"MAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYD\n"
"VQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2\n"
"MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRk\n"
"LjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4IC\n"
"DwAwggIKAoICAQDF0nqh1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG\n"
"3rdSINVSW0KZnvOgvlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6Kx\n"
"NedlsmGy6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo\n"
"/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn9\n"
"0Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbpra\n"
"fZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH\n"
"064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18izju3Gm5h1DVXoX+WViwKkrkMpKBGk\n"
"5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6e\n"
"VL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt\n"
"33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMB\n"
"Af8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk\n"
"86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0ErX+lRVAQ\n"
"Zk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoAymzv\n"
"ftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds\n"
"Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPj\n"
"YYPGFrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHV\n"
"dqqGuw6qnsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI\n"
"2i/6GaX7i+B/OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDe\n"
"M9ovnhp6dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl\n"
"Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6Ue\n"
"To3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S\n"
"-----END CERTIFICATE-----",.len=1943},
/* SecureSign Root CA15 */
{.str="-----BEGIN CERTIFICATE-----\n"
"MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkG\n"
"A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQD\n"
"ExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZa\n"
"MFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEd\n"
"MBsGA1UEAxMUU2VjdXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQL\n"
"UHSNZDKZmbPSYAi4Io5GdCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq\n"
"8bOLbe1PL0vJSpSRZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB\n"
"/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT\n"
"9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO\n"
"4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr\n"
"62Nuk22rGwlgMU4=\n"
"-----END CERTIFICATE-----",.len=800},
};

View File

@@ -368,7 +368,7 @@ struct us_poll_t *us_poll_resize(struct us_poll_t *p, struct us_loop_t *loop, un
return new_p;
}
void us_poll_start(struct us_poll_t *p, struct us_loop_t *loop, int events) {
int us_poll_start_rc(struct us_poll_t *p, struct us_loop_t *loop, int events) {
p->state.poll_type = us_internal_poll_type(p) | ((events & LIBUS_SOCKET_READABLE) ? POLL_TYPE_POLLING_IN : 0) | ((events & LIBUS_SOCKET_WRITABLE) ? POLL_TYPE_POLLING_OUT : 0);
#ifdef LIBUS_USE_EPOLL
@@ -379,11 +379,16 @@ void us_poll_start(struct us_poll_t *p, struct us_loop_t *loop, int events) {
do {
ret = epoll_ctl(loop->fd, EPOLL_CTL_ADD, p->state.fd, &event);
} while (IS_EINTR(ret));
return ret;
#else
kqueue_change(loop->fd, p->state.fd, 0, events, p);
return kqueue_change(loop->fd, p->state.fd, 0, events, p);
#endif
}
void us_poll_start(struct us_poll_t *p, struct us_loop_t *loop, int events) {
us_poll_start_rc(p, loop, events);
}
void us_poll_change(struct us_poll_t *p, struct us_loop_t *loop, int events) {
int old_events = us_poll_events(p);
if (old_events != events) {

View File

@@ -371,6 +371,8 @@ void us_poll_init(us_poll_r p, LIBUS_SOCKET_DESCRIPTOR fd, int poll_type);
/* Start, change and stop polling for events */
void us_poll_start(us_poll_r p, us_loop_r loop, int events) nonnull_fn_decl;
/* Returns 0 if successful */
int us_poll_start_rc(us_poll_r p, us_loop_r loop, int events) nonnull_fn_decl;
void us_poll_change(us_poll_r p, us_loop_r loop, int events) nonnull_fn_decl;
void us_poll_stop(us_poll_r p, struct us_loop_t *loop) nonnull_fn_decl;

View File

@@ -21,7 +21,6 @@
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stdio.h>
#include <errno.h>
#ifndef WIN32
@@ -310,7 +309,11 @@ struct us_socket_t *us_socket_from_fd(struct us_socket_context_t *ctx, int socke
#else
struct us_poll_t *p1 = us_create_poll(ctx->loop, 0, sizeof(struct us_socket_t) + socket_ext_size);
us_poll_init(p1, fd, POLL_TYPE_SOCKET);
us_poll_start(p1, ctx->loop, LIBUS_SOCKET_READABLE | LIBUS_SOCKET_WRITABLE);
int rc = us_poll_start_rc(p1, ctx->loop, LIBUS_SOCKET_READABLE | LIBUS_SOCKET_WRITABLE);
if (rc != 0) {
us_poll_free(p1, ctx->loop);
return 0;
}
struct us_socket_t *s = (struct us_socket_t *) p1;
s->context = ctx;

View File

@@ -0,0 +1 @@
DisableFormat: true

View File

@@ -1,3 +1,10 @@
node_modules
extension
example/.vscode
# Project files
/node_modules
/extension
/example/.vscode
/.vscode-test
# macOS files
.DS_Store

Binary file not shown.

View File

@@ -1,8 +0,0 @@
console.log("HELLO");
console.log("HELLO 2");
console.log("HELLO 3");
a();
function a() {
console.log("HELLO 4");
}

View File

@@ -0,0 +1,7 @@
type OS = "Windows";
Bun.serve({
fetch(req: Request) {
return new Response(`Hello, ${"Windows" as OS}!`);
},
});

View File

@@ -1,6 +1,6 @@
{
"name": "bun-vscode",
"version": "0.0.8",
"version": "0.0.15",
"author": "oven",
"repository": {
"type": "git",
@@ -8,11 +8,13 @@
},
"main": "dist/extension.js",
"devDependencies": {
"@types/bun": "^1.1.10",
"@types/vscode": "^1.60.0",
"@vscode/debugadapter": "^1.56.0",
"@vscode/debugadapter-testsupport": "^1.56.0",
"@vscode/test-cli": "^0.0.10",
"@vscode/test-electron": "^2.4.1",
"@vscode/vsce": "^2.20.1",
"bun-types": "^0.7.3",
"esbuild": "^0.19.2",
"typescript": "^5.0.0"
},
@@ -43,6 +45,7 @@
"build": "node scripts/build.mjs",
"pretest": "bun run build",
"test": "node scripts/test.mjs",
"dev": "vscode-test --config scripts/dev.mjs",
"prepublish": "npm version patch && bun run build",
"publish": "cd extension && bunx vsce publish"
},

View File

@@ -1,9 +1,9 @@
import { buildSync } from "esbuild";
import { spawnSync } from "node:child_process";
import { execSync } from "node:child_process";
import { cpSync, mkdirSync, rmSync } from "node:fs";
import { dirname } from "node:path";
const { pathname } = new URL("..", import.meta.url);
process.chdir(pathname);
process.chdir(dirname(import.meta.dirname));
buildSync({
entryPoints: ["src/extension.ts", "src/web-extension.ts"],
@@ -26,7 +26,7 @@ cpSync("LICENSE", "extension/LICENSE");
cpSync("package.json", "extension/package.json");
const cmd = process.isBun ? "bunx" : "npx";
spawnSync(cmd, ["vsce", "package"], {
execSync(`${cmd} vsce package --no-dependencies`, {
cwd: "extension",
stdio: "inherit",
});

View File

@@ -0,0 +1,29 @@
import { defineConfig } from "@vscode/test-cli";
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
import { dirname, join } from "node:path";
const workspacePath = dirname(import.meta.dirname);
const vscodePath = join(workspacePath, ".vscode-test");
const vscodeTestPath = join(vscodePath, "launch.test.js");
if (!existsSync(vscodeTestPath)) {
mkdirSync(vscodePath, { recursive: true });
writeFileSync(
vscodeTestPath,
`// Generated by ${import.meta.filename}
// A test that intentionally waits forever and does nothing,
// so you can debug and test the VSCode extension in a clean environment.
suite("VSCode extension", function () {
this.timeout(Number.MAX_SAFE_INTEGER);
test("wait forever", (done) => {});
});
`,
);
}
export default defineConfig({
workspaceFolder: join(workspacePath, "example"),
extensionDevelopmentPath: workspacePath,
skipExtensionDependencies: true,
files: vscodeTestPath,
});

View File

@@ -1,21 +1,21 @@
import { spawn } from "node:child_process";
import { exec } from "node:child_process";
import { readdirSync } from "node:fs";
import { dirname } from "node:path";
const { pathname } = new URL("..", import.meta.url);
process.chdir(pathname);
process.chdir(dirname(import.meta.dirname));
let path;
let extPath;
for (const filename of readdirSync("extension")) {
if (filename.endsWith(".vsix")) {
path = `extension/${filename}`;
extPath = `extension/${filename}`;
break;
}
}
if (!path) {
if (!extPath) {
throw new Error("No .vsix file found");
}
spawn("code", ["--new-window", `--install-extension=${path}`, `--extensionDevelopmentPath=${pathname}`, "example"], {
exec(`code --new-window --install-extension=${extPath} --extensionDevelopmentPath=${process.cwd()} example`, {
stdio: "inherit",
});

View File

@@ -1,8 +1,14 @@
import { DebugSession } from "@vscode/debugadapter";
import { tmpdir } from "node:os";
import * as vscode from "vscode";
import type { DAP } from "../../../bun-debug-adapter-protocol";
import { DebugAdapter, UnixSignal } from "../../../bun-debug-adapter-protocol";
import {
DAP,
DebugAdapter,
getAvailablePort,
getRandomId,
TCPSocketSignal,
UnixSignal,
} from "../../../bun-debug-adapter-protocol";
export const DEBUG_CONFIGURATION: vscode.DebugConfiguration = {
type: "bun",
@@ -81,7 +87,7 @@ function debugFileCommand(resource?: vscode.Uri) {
if (path) debugCommand(path);
}
function injectDebugTerminal(terminal: vscode.Terminal): void {
async function injectDebugTerminal(terminal: vscode.Terminal): Promise<void> {
if (!getConfig("debugTerminal.enabled")) return;
const { name, creationOptions } = terminal;
@@ -97,14 +103,16 @@ function injectDebugTerminal(terminal: vscode.Terminal): void {
const stopOnEntry = getConfig("debugTerminal.stopOnEntry") === true;
const query = stopOnEntry ? "break=1" : "wait=1";
const { adapter, signal } = new TerminalDebugSession();
const debugSession = new TerminalDebugSession();
await debugSession.initialize();
const { adapter, signal } = debugSession;
const debug = vscode.window.createTerminal({
...creationOptions,
name: "JavaScript Debug Terminal",
env: {
...env,
"BUN_INSPECT": `${adapter.url}?${query}`,
"BUN_INSPECT_NOTIFY": `${signal.url}`,
"BUN_INSPECT_NOTIFY": signal.url,
},
});
@@ -153,7 +161,9 @@ class DebugConfigurationProvider implements vscode.DebugConfigurationProvider {
}
class InlineDebugAdapterFactory implements vscode.DebugAdapterDescriptorFactory {
createDebugAdapterDescriptor(session: vscode.DebugSession): vscode.ProviderResult<vscode.DebugAdapterDescriptor> {
async createDebugAdapterDescriptor(
session: vscode.DebugSession,
): Promise<vscode.ProviderResult<vscode.DebugAdapterDescriptor>> {
const { configuration } = session;
const { request, url } = configuration;
@@ -166,18 +176,28 @@ class InlineDebugAdapterFactory implements vscode.DebugAdapterDescriptorFactory
}
const adapter = new FileDebugSession(session.id);
await adapter.initialize();
return new vscode.DebugAdapterInlineImplementation(adapter);
}
}
class FileDebugSession extends DebugSession {
readonly adapter: DebugAdapter;
adapter: DebugAdapter;
sessionId?: string;
constructor(sessionId?: string) {
super();
const uniqueId = sessionId ?? Math.random().toString(36).slice(2);
const url = `ws+unix://${tmpdir()}/${uniqueId}.sock`;
this.sessionId = sessionId;
}
async initialize() {
const uniqueId = this.sessionId ?? Math.random().toString(36).slice(2);
let url;
if (process.platform === "win32") {
url = `ws://127.0.0.1:${await getAvailablePort()}/${getRandomId()}`;
} else {
url = `ws+unix://${tmpdir()}/${uniqueId}.sock`;
}
this.adapter = new DebugAdapter(url);
this.adapter.on("Adapter.response", response => this.sendResponse(response));
this.adapter.on("Adapter.event", event => this.sendEvent(event));
@@ -204,11 +224,19 @@ class FileDebugSession extends DebugSession {
}
class TerminalDebugSession extends FileDebugSession {
readonly signal: UnixSignal;
signal: TCPSocketSignal | UnixSignal;
constructor() {
super();
this.signal = new UnixSignal();
}
async initialize() {
await super.initialize();
if (process.platform === "win32") {
this.signal = new TCPSocketSignal(await getAvailablePort());
} else {
this.signal = new UnixSignal();
}
this.signal.on("Signal.received", () => {
vscode.debug.startDebugging(undefined, {
...ATTACH_CONFIGURATION,
@@ -222,7 +250,7 @@ class TerminalDebugSession extends FileDebugSession {
name: "Bun Terminal",
env: {
"BUN_INSPECT": `${this.adapter.url}?wait=1`,
"BUN_INSPECT_NOTIFY": `${this.signal.url}`,
"BUN_INSPECT_NOTIFY": this.signal.url,
},
isTransient: true,
iconPath: new vscode.ThemeIcon("debug-console"),

View File

@@ -0,0 +1,58 @@
--- a/libarchive/archive_write_add_filter_gzip.c
+++ b/libarchive/archive_write_add_filter_gzip.c
@@ -58,6 +58,7 @@ archive_write_set_compression_gzip(struct archive *a)
struct private_data {
int compression_level;
int timestamp;
+ unsigned char os;
#ifdef HAVE_ZLIB_H
z_stream stream;
int64_t total_in;
@@ -106,6 +107,7 @@ archive_write_add_filter_gzip(struct archive *_a)
archive_set_error(&a->archive, ENOMEM, "Out of memory");
return (ARCHIVE_FATAL);
}
+ data->os = 3; /* default Unix */
f->data = data;
f->open = &archive_compressor_gzip_open;
f->options = &archive_compressor_gzip_options;
@@ -166,6 +168,30 @@ archive_compressor_gzip_options(struct archive_write_filter *f, const char *key,
return (ARCHIVE_OK);
}
+ if (strcmp(key, "os") == 0) {
+ if (value == NULL)
+ return (ARCHIVE_WARN);
+
+ if (strcmp(value, "FAT") == 0) data->os = 0;
+ else if (strcmp(value, "Amiga") == 0) data->os = 1;
+ else if (strcmp(value, "VMS") == 0 || strcmp(value, "OpenVMS") == 0) data->os = 2;
+ else if (strcmp(value, "Unix") == 0) data->os = 3;
+ else if (strcmp(value, "VM") == 0 || strcmp(value, "VM/CMS") == 0) data->os = 4;
+ else if (strcmp(value, "Atari TOS") == 0) data->os = 5;
+ else if (strcmp(value, "HPFS") == 0) data->os = 6;
+ else if (strcmp(value, "Macintosh") == 0) data->os = 7;
+ else if (strcmp(value, "Z-System") == 0) data->os = 8;
+ else if (strcmp(value, "CP/M") == 0) data->os = 9;
+ else if (strcmp(value, "TOPS-20") == 0) data->os = 10;
+ else if (strcmp(value, "NTFS") == 0) data->os = 11;
+ else if (strcmp(value, "QDOS") == 0) data->os = 12;
+ else if (strcmp(value, "Acorn RISCOS") == 0) data->os = 13;
+ else if (strcmp(value, "Unknown") == 0) data->os = 255;
+ else return (ARCHIVE_WARN);
+
+ return (ARCHIVE_OK);
+ }
+
/* Note: The "warn" return is just to inform the options
* supervisor that we didn't handle it. It will generate
* a suitable error if no one used this option. */
@@ -226,7 +252,7 @@ archive_compressor_gzip_open(struct archive_write_filter *f)
data->compressed[8] = 4;
else
data->compressed[8] = 0;
- data->compressed[9] = 3; /* OS=Unix */
+ data->compressed[9] = data->os;
data->stream.next_out += 10;
data->stream.avail_out -= 10;

View File

@@ -1,8 +1,8 @@
#!/usr/bin/env node
import { spawn as nodeSpawn } from "node:child_process";
import { existsSync, readFileSync, readdirSync, mkdirSync, cpSync, chmodSync } from "node:fs";
import { basename, join, relative, resolve } from "node:path";
import { existsSync, readFileSync, mkdirSync, cpSync, chmodSync } from "node:fs";
import { basename, join, resolve } from "node:path";
// https://cmake.org/cmake/help/latest/manual/cmake.1.html#generate-a-project-buildsystem
const generateFlags = [
@@ -118,26 +118,6 @@ async function build(args) {
.flatMap(([flag, value]) => [flag, value]);
await spawn("cmake", buildArgs, { env }, "compilation");
const buildFiles = ["ccache.log", "compile_commands.json"];
const buildPaths = [buildPath, ...readdirSync(buildPath).map(path => join(buildPath, path))];
const buildArtifacts = [];
for (const buildPath of buildPaths) {
for (const buildFile of buildFiles) {
const path = join(buildPath, buildFile);
if (existsSync(path)) {
buildArtifacts.push(path);
}
}
}
if (isBuildkite()) {
await Promise.all(
buildArtifacts.map(path =>
spawn("buildkite-agent", ["artifact", "upload", relative(buildPath, path)], { cwd: buildPath, env }),
),
);
}
printDuration("total", Date.now() - startTime);
}

View File

@@ -172,23 +172,16 @@ const string = bun.string;
pub const BunInfo = struct {
bun_version: string,
platform: Analytics.GenerateHeader.GeneratePlatform.Platform,
framework: string = "",
framework_version: string = "",
const Analytics = @import("./analytics/analytics_thread.zig");
const JSON = bun.JSON;
const JSAst = bun.JSAst;
pub fn generate(comptime Bundler: type, bundler: Bundler, allocator: std.mem.Allocator) !JSAst.Expr {
var info = BunInfo{
pub fn generate(comptime Bundler: type, _: Bundler, allocator: std.mem.Allocator) !JSAst.Expr {
const info = BunInfo{
.bun_version = Global.package_json_version,
.platform = Analytics.GenerateHeader.GeneratePlatform.forOS(),
};
if (bundler.options.framework) |framework| {
info.framework = framework.package;
info.framework_version = framework.version;
}
return try JSON.toAST(allocator, BunInfo, info);
}
};

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