aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.devcontainer/devcontainer.json2
-rw-r--r--.docker/build-base-images.sh4
-rw-r--r--.docker/build-base.sh10
-rw-r--r--.github/workflows/bun.yml309
-rw-r--r--.vscode/settings.json3
-rw-r--r--Dockerfile400
-rw-r--r--Dockerfile.base158
-rw-r--r--Dockerfile.devcontainer99
-rw-r--r--Makefile64
-rw-r--r--README.md29
-rw-r--r--build-id2
-rw-r--r--build.zig7
-rw-r--r--examples/react/README.md8
-rw-r--r--src/base64/bun-base64.c2
-rw-r--r--src/base64/fastavxbase64.c2
-rw-r--r--src/base64/fastavxbase64.h3
m---------src/bun.js/WebKit0
-rw-r--r--src/bun.js/node/syscall.zig8
-rw-r--r--src/bun.js/node/types.zig51
-rw-r--r--src/cli.zig2
-rw-r--r--src/cli/upgrade_command.zig172
-rw-r--r--src/env.zig2
-rw-r--r--src/http.zig6
-rw-r--r--src/http_client_async.zig2
-rw-r--r--src/install/install.zig56
-rw-r--r--src/runtime.footer.bun.js1
-rw-r--r--src/string_immutable.zig2
-rw-r--r--test/apps/bun-dev-index-html.sh2
-rw-r--r--test/apps/bun-dev.sh2
-rw-r--r--test/apps/bun-install-lockfile-status.sh2
-rw-r--r--test/apps/bun-install-utf8.sh2
-rw-r--r--test/apps/bun-install.sh2
l---------test/bun.js/fs-stream.link.js1
-rw-r--r--test/bun.js/fs.test.js61
-rw-r--r--test/bun.js/snapshots.debug.js10
-rw-r--r--test/bun.js/snapshots.js10
36 files changed, 1024 insertions, 472 deletions
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 1350bae4e..51e4ccff0 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -7,7 +7,7 @@
"context": "..",
// Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
- "dockerFile": "../Dockerfile",
+ "dockerFile": "../Dockerfile.devcontainer",
// Set *default* container specific settings.json values on container create.
"settings": {
diff --git a/.docker/build-base-images.sh b/.docker/build-base-images.sh
index 396017e81..55984471f 100644
--- a/.docker/build-base-images.sh
+++ b/.docker/build-base-images.sh
@@ -6,10 +6,10 @@ export DOCKER_BUILDKIT=1
docker login --username bunbunbunbun
-docker build -f Dockerfile.base -t bunbunbunbun/bun-test-base --target bun-test-base . --platform=linux/$BUILDARCH --build-arg BUILDARCH=$BUILDARCH
+# docker build -f Dockerfile.base -t bunbunbunbun/bun-test-base --target bun-test-base . --platform=linux/$BUILDARCH --build-arg BUILDARCH=$BUILDARCH
docker build -f Dockerfile.base -t bunbunbunbun/bun-base-with-zig-and-webkit --target bun-base-with-zig-and-webkit . --platform=linux/$BUILDARCH --build-arg BUILDARCH=$BUILDARCH
docker build -f Dockerfile.base -t bunbunbunbun/bun-base --target bun-base --platform=linux/$BUILDARCH . --build-arg BUILDARCH=$BUILDARCH
-docker push bunbunbunbun/bun-test-base:latest
+# docker push bunbunbunbun/bun-test-base:latest
docker push bunbunbunbun/bun-base-with-zig-and-webkit:latest
docker push bunbunbunbun/bun-base:latest
diff --git a/.docker/build-base.sh b/.docker/build-base.sh
index f22410371..3a9f097e8 100644
--- a/.docker/build-base.sh
+++ b/.docker/build-base.sh
@@ -4,10 +4,10 @@ set -euxo pipefail
export DOCKER_BUILDKIT=1
-docker buildx build \
- -t bunbunbunbun/bun-test-base:latest -f Dockerfile.base \
- --target bun-test-base \
- --platform=linux/$BUILDARCH --build-arg BUILDARCH=$BUILDARCH .
+# docker buildx build \
+# -t bunbunbunbun/bun-test-base:latest -f Dockerfile.base \
+# --target bun-test-base \
+# --platform=linux/$BUILDARCH --build-arg BUILDARCH=$BUILDARCH .
docker buildx build \
--target bun-base \
-f Dockerfile.base \
@@ -19,6 +19,6 @@ docker buildx build \
--target bun-base-with-zig-and-webkit \
--platform=linux/$BUILDARCH --build-arg BUILDARCH=$BUILDARCH .
-docker push bunbunbunbun/bun-test-base:latest
+# docker push bunbunbunbun/bun-test-base:latest
docker push bunbunbunbun/bun-base:latest
docker push bunbunbunbun/bun-base-with-zig-and-webkit:latest
diff --git a/.github/workflows/bun.yml b/.github/workflows/bun.yml
index 5f2c83e0b..43780ced6 100644
--- a/.github/workflows/bun.yml
+++ b/.github/workflows/bun.yml
@@ -2,19 +2,16 @@ name: bun
on:
push:
branches: [main, bun-actions]
- paths-ignore:
- - "examples/**"
- - "bench/**"
- - "README.*"
- - "LICENSE"
- - ".vscode"
- - ".devcontainer"
+ paths:
+ - "src"
+ - "test"
pull_request:
branches: [main]
- paths-ignore:
- - "examples/**"
- - "bench/**"
- - README.*
+ paths:
+ - "src"
+ - "test"
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
env:
REGISTRY: ghcr.io
@@ -22,147 +19,177 @@ env:
TEST_TAG: bun-test'
jobs:
- e2e:
- runs-on: self-hosted
- name: "Integration tests"
- if: github.repository_owner == 'oven-sh'
+ linux-x64:
+ name: Linux x64 (${{ matrix.cpu }})
+ runs-on: linux-amd64
+ timeout-minutes: 90
+ strategy:
+ matrix:
+ cpu: [native, sandybridge]
+
steps:
- - name: Checkout
- uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Checkout submodules
- run: git -c submodule."src/bun.js/WebKit".update=none submodule update --init --recursive --depth=1 --progress -j 8
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v1
- - name: Login to Dockerhub
- uses: docker/login-action@v1
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_PASSWORD }}
- - name: Pull Base Image
- run: bash .docker/pull.sh
- - name: Build tests
- uses: docker/build-push-action@v2
+ run: git -c submodule."src/bun.js/WebKit".update=none submodule update --init --recursive --depth=1 --progress -j $(nproc)
+ - uses: docker/setup-buildx-action@v2
+ id: buildx
+ with:
+ install: true
+ - name: Run
+ run: |
+ rm -rf ${{runner.temp}}/release
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v2
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+ - name: Build and push
+ uses: docker/build-push-action@v3
with:
context: .
- target: test_base
- tags: bun-test:latest
- load: true
- cache-from: type=gha
- cache-to: type=gha,mode=max
- builder: ${{ steps.buildx.outputs.name }}
- - name: Run test-with-hmr
- env:
- BUN_TEST_NAME: test-with-hmr
- GITHUB_WORKSPACE: $GITHUB_WORKSPACE
- RUNNER_TEMP: ${RUNNER_TEMP}
- run: bash .docker/runner.sh
- - name: Run test-no-hmr
- env:
- BUN_TEST_NAME: test-no-hmr
- GITHUB_WORKSPACE: $GITHUB_WORKSPACE
- RUNNER_TEMP: ${RUNNER_TEMP}
- run: bash .docker/runner.sh
- - name: Run test-bun-create-next
- env:
- RUNNER_TEMP: ${RUNNER_TEMP}
- BUN_TEST_NAME: test-create-next
- GITHUB_WORKSPACE: $GITHUB_WORKSPACE
- run: bash .docker/runner.sh
- - name: Run test-bun-create-react
- env:
- RUNNER_TEMP: ${RUNNER_TEMP}
- BUN_TEST_NAME: test-create-react
- GITHUB_WORKSPACE: $GITHUB_WORKSPACE
- run: bash .docker/runner.sh
- - name: Run test-bun-run
- env:
- RUNNER_TEMP: ${RUNNER_TEMP}
- BUN_TEST_NAME: test-bun-run
- GITHUB_WORKSPACE: $GITHUB_WORKSPACE
- run: bash .docker/runner.sh
- - name: Run test-bun-install
- env:
- RUNNER_TEMP: ${RUNNER_TEMP}
- BUN_TEST_NAME: test-bun-install
- GITHUB_WORKSPACE: $GITHUB_WORKSPACE
- run: bash .docker/runner.sh
- # This is commented out because zig test does not work on the CI
- # Which sucks
- # zig-unit-tests:
- # runs-on: self-hosted
- # name: "Unit tests (Zig)"
- # steps:
- # - name: Checkout
- # uses: actions/checkout@v2
- # - name: Checkout submodules
- # run: git -c submodule."src/bun.js/WebKit".update=none submodule update --init --recursive --depth=1 --progress -j 8
- # - name: Set up Docker Buildx
- # uses: docker/setup-buildx-action@v1
- # - name: Login to Dockerhub
- # uses: docker/login-action@v1
- # with:
- # username: ${{ secrets.DOCKERHUB_USERNAME }}
- # password: ${{ secrets.DOCKERHUB_PASSWORD }}
- # - name: Pull Base Image
- # run: bash .docker/pull.sh
- # - name: Build tests
- # uses: docker/build-push-action@v2
- # with:
- # context: .
- # target: build_unit
- # tags: bun-unit-tests:latest
- # load: true
- # cache-from: type=gha
- # cache-to: type=gha,mode=max
- # builder: ${{ steps.buildx.outputs.name }}
- # - name: Run tests
- # env:
- # GITHUB_WORKSPACE: $GITHUB_WORKSPACE
- # RUNNER_TEMP: ${RUNNER_TEMP}
- # run: bash .docker/unit-tests.sh
- release:
- runs-on: self-hosted
- needs: ["e2e"]
- if: github.ref == 'refs/heads/main'
+ push: false
+ tags: ghcr.io/oven-sh/bun:canary,ghcr.io/oven-sh/bun:${{github.sha}}
+ cache-from: type=registry,ref=ghcr.io/oven-sh/bun:buildcache-${{matrix.cpu}}-amd64
+ cache-to: type=registry,ref=ghcr.io/oven-sh/bun:buildcache-${{matrix.cpu}}-amd64,mode=max
+ build-args: |
+ ARCH=x86_64
+ BUILDARCH=amd64
+ CPU_TARGET=${{matrix.cpu}}
+ platforms: linux/amd64
+ target: artifact
+ outputs: type=local,dest=${{runner.temp}}/release
+ - uses: actions/upload-artifact@v3
+ if: ${{ matrix.cpu == 'native' }}
+ with:
+ name: bun-linux-x64
+ path: ${{runner.temp}}/release/bun
+ - uses: actions/upload-artifact@v3
+ if: ${{ matrix.cpu == 'sandybridge' }}
+ with:
+ name: bun-linux-x64-generic
+ path: ${{runner.temp}}/release/bun
+ - uses: actions/upload-artifact@v3
+ if: ${{ matrix.cpu == 'native' }}
+ with:
+ name: bun-dependencies-linux-x64
+ path: ${{runner.temp}}/release/bun-dependencies
+ - uses: actions/upload-artifact@v3
+ if: ${{ matrix.cpu == 'sandybridge' }}
+ with:
+ name: bun-dependencies-linux-x64-generic
+ path: ${{runner.temp}}/release/bun-dependencies
+ - uses: actions/upload-artifact@v3
+ if: ${{ matrix.cpu == 'native' }}
+ with:
+ name: bun-linux-x64-profile
+ path: ${{runner.temp}}/release/bun-profile
+ - uses: actions/upload-artifact@v3
+ if: ${{ matrix.cpu == 'sandybridge' }}
+ with:
+ name: bun-linux-x64-generic-profile
+ path: ${{runner.temp}}/release/bun-profile
+ - uses: actions/upload-artifact@v3
+ if: ${{ matrix.cpu == 'native' }}
+ with:
+ name: bun-obj-linux-x64
+ path: ${{runner.temp}}/release/bun-obj
+ - uses: actions/upload-artifact@v3
+ if: ${{ matrix.cpu == 'sandybridge' }}
+ with:
+ name: bun-obj-linux-x64-generic
+ path: ${{runner.temp}}/release/bun-obj
+ linux-aarch64:
+ name: Linux aarch64
+ runs-on: linux-arm64
+ timeout-minutes: 90
steps:
- - name: Checkout
- uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Checkout submodules
- run: git -c submodule."src/bun.js/WebKit".update=none submodule update --init --recursive --depth=1 --progress -j 8
+ run: git -c submodule."src/bun.js/WebKit".update=none submodule update --init --recursive --depth=1 --progress -j $(nproc)
+ - uses: docker/setup-buildx-action@v2
+ id: buildx
+ with:
+ install: true
+ - name: Run
+ run: |
+ rm -rf ${{runner.temp}}/release
- name: Login to GitHub Container Registry
- uses: docker/login-action@v1
+ uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- - name: Login to DockerHub
- uses: docker/login-action@v1
+ - name: Build and push
+ uses: docker/build-push-action@v3
+ with:
+ context: .
+ tags: ghcr.io/oven-sh/bun:canary,ghcr.io/oven-sh/bun:${{github.sha}}
+ push: false
+ cache-from: type=registry,ref=ghcr.io/oven-sh/bun:buildcache-aarch64
+ cache-to: type=registry,ref=ghcr.io/oven-sh/bun:buildcache-aarch64,mode=max
+ build-args: |
+ ARCH=aarch64
+ BUILDARCH=arm64
+ CPU_TARGET=native
+ platforms: linux/arm64
+ target: artifact
+ outputs: type=local,dest=${{runner.temp}}/release
+ - uses: actions/upload-artifact@v3
with:
- username: jarredsumner
- password: ${{ secrets.DOCKERHUB_ALT }}
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v1
+ name: bun-linux-aarch64
+ path: ${{runner.temp}}/release/bun
+ - uses: actions/upload-artifact@v3
with:
- install: true
- - name: Pull Base Image
- run: bash .docker/pull.sh
- - name: Build release image
- uses: docker/build-push-action@v2
+ name: bun-dependencies-linux-aarch64
+ path: ${{runner.temp}}/release/bun-dependencies
+ - uses: actions/upload-artifact@v3
with:
- context: .
- target: release
- tags: |
- ghcr.io/jarred-sumner/bun:${{github.sha}}
- ghcr.io/jarred-sumner/bun:edge
- jarredsumner/bun:${{github.sha}}
- jarredsumner/bun:edge
- platforms: |
- linux/amd64
- labels: |
- org.opencontainers.image.title=bun
- org.opencontainers.image.description=bun is a fast bundler, transpiler, JavaScript Runtime environment and package manager for web software. The image is an Ubuntu 20.04 image with bun preinstalled into /opt/bun.
- org.opencontainers.image.vendor=bun
- org.opencontainers.image.source=https://github.com/oven-sh/bun
- org.opencontainers.image.url=https://bun.sh
- builder: ${{ steps.buildx.outputs.name }}
- push: true
+ name: bun-linux-aarch64-profile
+ path: ${{runner.temp}}/release/bun-profile
+ - uses: actions/upload-artifact@v3
+ with:
+ name: bun-obj-linux-aarch64
+ path: ${{runner.temp}}/release/bun-obj
+
+ release:
+ name: release
+ runs-on: ubuntu-18.04
+ timeout-minutes: 90
+ if: github.event_name == 'push'
+ needs:
+ - linux-x64
+ - linux-aarch64
+ steps:
+ - uses: actions/download-artifact@v3
+ with:
+ path: ${{runner.temp}}/release
+ - name: Rename files
+ run: |
+ cd ${{runner.temp}}/release
+ mv bun-linux-x64-generic bun-linux-x64-baseline
+ mv bun-linux-x64-generic-profile bun-linux-x64-baseline-profile
+
+ chmod +x bun-linux-x64/*
+ chmod +x bun-linux-x64-baseline/*
+ chmod +x bun-linux-x64-profile/*
+ chmod +x bun-linux-x64-baseline-profile/*
+ chmod +x bun-linux-aarch64/*
+ chmod +x bun-linux-aarch64-profile/*
+
+ zip -r bun-linux-x64.zip bun-linux-x64
+ zip -r bun-linux-x64-baseline.zip bun-linux-x64-baseline
+ zip -r bun-linux-x64-profile.zip bun-linux-x64-profile
+ zip -r bun-linux-x64-baseline-profile.zip bun-linux-x64-baseline-profile
+ zip -r bun-linux-aarch64.zip bun-linux-aarch64
+ zip -r bun-linux-aarch64-profile.zip bun-linux-aarch64-profile
+
+ - name: Release
+ uses: softprops/action-gh-release@v1
+ with:
+ prerelease: true
+ generate_release_notes: true
+ tag_name: "canary"
+ name: Canary
+ files: |
+ ${{runner.temp}}/release/*.zip
diff --git a/.vscode/settings.json b/.vscode/settings.json
index d0d9a341d..78a542c17 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -8,6 +8,8 @@
"search.useIgnoreFiles": true,
"zig.buildOnSave": false,
"[zig]": {
+ "editor.tabSize": 4,
+ "editor.useTabStops": false,
"editor.defaultFormatter": "AugusteRame.zls-vscode",
"editor.formatOnSave": true
},
@@ -164,6 +166,5 @@
"__memory": "cpp",
"memory_resource": "cpp"
},
- "go.logging.level": "off",
"cmake.configureOnOpen": false
}
diff --git a/Dockerfile b/Dockerfile
index 311d54e55..57967e643 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,82 @@
-FROM bunbunbunbun/bun-base:latest as lolhtml
+FROM bitnami/minideb:bullseye as bun-base
+
+RUN install_packages ca-certificates curl wget lsb-release software-properties-common gnupg gnupg1 gnupg2
+
+RUN wget https://apt.llvm.org/llvm.sh && \
+ chmod +x llvm.sh && \
+ ./llvm.sh 13
+
+RUN install_packages \
+ cmake \
+ curl \
+ file \
+ git \
+ gnupg \
+ libc-dev \
+ libxml2 \
+ libxml2-dev \
+ make \
+ ninja-build \
+ perl \
+ python3 \
+ rsync \
+ ruby \
+ unzip \
+ bash tar gzip
+
+ENV CXX=clang++-13
+ENV CC=clang-13
+
+RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \
+ install_packages nodejs && \
+ npm install -g esbuild
+
+
+ARG DEBIAN_FRONTEND=noninteractive
+ARG GITHUB_WORKSPACE=/build
+
+# Directory extracts to "bun-webkit"
+ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
+ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
+ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
+ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG BUILDARCH=amd64
+ARG ZIG_PATH=${GITHUB_WORKSPACE}/zig
+
+ENV WEBKIT_OUT_DIR=${WEBKIT_DIR}
+ENV BUILDARCH=${BUILDARCH}
+ENV AR=/usr/bin/llvm-ar-13
+ENV ZIG "${ZIG_PATH}/zig"
+ENV PATH="$ZIG/bin:$PATH"
+ENV LD=lld-13
+
+RUN mkdir -p $BUN_DIR $BUN_DEPS_OUT_DIR
+
+FROM bun-base as bun-base-with-zig-and-webkit
+
+WORKDIR $GITHUB_WORKSPACE
+
+RUN curl -o zig-linux-$BUILDARCH.zip -L https://github.com/oven-sh/zig/releases/download/jul1/zig-linux-$BUILDARCH.zip && \
+ unzip -q zig-linux-$BUILDARCH.zip && \
+ rm zig-linux-$BUILDARCH.zip;
+
+RUN mkdir -p $WEBKIT_OUT_DIR && cd $WEBKIT_OUT_DIR && cd ../ && \
+ curl -o bun-webkit-linux-$BUILDARCH.tar.gz -L https://github.com/oven-sh/WebKit/releases/download/jul4-2/bun-webkit-linux-$BUILDARCH.tar.gz && \
+ gunzip bun-webkit-linux-$BUILDARCH.tar.gz && \
+ tar -xf bun-webkit-linux-$BUILDARCH.tar && \
+ ls && \
+ echo $(pwd) && \
+ rm bun-webkit-linux-$BUILDARCH.tar && \
+ cat $WEBKIT_OUT_DIR/include/cmakeconfig.h > /dev/null
+
+LABEL org.opencontainers.image.title="bun base image with zig & webkit ${BUILDARCH} (glibc)"
+LABEL org.opencontainers.image.source=https://github.com/jarred-sumner/bun
+
+
+FROM bun-base as lolhtml
+
+RUN install_packages build-essential && curl https://sh.rustup.rs -sSf | sh -s -- -y
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -13,10 +90,10 @@ ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
COPY Makefile ${BUN_DIR}/Makefile
COPY src/deps/lol-html ${BUN_DIR}/src/deps/lol-html
-RUN cd ${BUN_DIR} && \
+RUN export PATH=$PATH:$HOME/.cargo/bin && export CC=$(which clang-13) && cd ${BUN_DIR} && \
make lolhtml && rm -rf src/deps/lol-html Makefile
-FROM bunbunbunbun/bun-base:latest as mimalloc
+FROM bun-base as mimalloc
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -29,11 +106,13 @@ ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
COPY Makefile ${BUN_DIR}/Makefile
COPY src/deps/mimalloc ${BUN_DIR}/src/deps/mimalloc
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
RUN cd ${BUN_DIR} && \
make mimalloc && rm -rf src/deps/mimalloc Makefile
-FROM bunbunbunbun/bun-base:latest as zlib
+FROM bun-base as zlib
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -43,6 +122,8 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
COPY Makefile ${BUN_DIR}/Makefile
COPY src/deps/zlib ${BUN_DIR}/src/deps/zlib
@@ -52,7 +133,7 @@ WORKDIR $BUN_DIR
RUN cd $BUN_DIR && \
make zlib && rm -rf src/deps/zlib Makefile
-FROM bunbunbunbun/bun-base:latest as libarchive
+FROM bun-base as libarchive
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -62,16 +143,18 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
+
+RUN install_packages autoconf automake libtool pkg-config
COPY Makefile ${BUN_DIR}/Makefile
COPY src/deps/libarchive ${BUN_DIR}/src/deps/libarchive
WORKDIR $BUN_DIR
+RUN make libarchive && rm -rf src/deps/libarchive Makefile
-RUN cd $BUN_DIR && \
- make libarchive && rm -rf src/deps/libarchive Makefile
-
-FROM bunbunbunbun/bun-base:latest as tinycc
+FROM bun-base as tinycc
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -81,17 +164,12 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
-COPY Makefile ${BUN_DIR}/Makefile
-COPY src/deps/tinycc ${BUN_DIR}/src/deps/tinycc
+RUN install_packages libtcc-dev && cp /usr/lib/$(uname -m)-linux-gnu/libtcc.a ${BUN_DEPS_OUT_DIR}
-WORKDIR $BUN_DIR
-
-RUN cd $BUN_DIR && \
- make tinycc && rm -rf src/deps/tinycc Makefile
-
-
-FROM bunbunbunbun/bun-base:latest as libbacktrace
+FROM bun-base as libbacktrace
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -101,6 +179,8 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
COPY Makefile ${BUN_DIR}/Makefile
COPY src/deps/libbacktrace ${BUN_DIR}/src/deps/libbacktrace
@@ -110,7 +190,9 @@ WORKDIR $BUN_DIR
RUN cd $BUN_DIR && \
make libbacktrace && rm -rf src/deps/libbacktrace Makefile
-FROM bunbunbunbun/bun-base:latest as boringssl
+FROM bun-base as boringssl
+
+RUN install_packages golang
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -120,6 +202,8 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
COPY Makefile ${BUN_DIR}/Makefile
COPY src/deps/boringssl ${BUN_DIR}/src/deps/boringssl
@@ -128,7 +212,7 @@ WORKDIR $BUN_DIR
RUN make boringssl && rm -rf src/deps/boringssl Makefile
-FROM bunbunbunbun/bun-base:latest as base64
+FROM bun-base as base64
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -138,6 +222,8 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
COPY Makefile ${BUN_DIR}/Makefile
COPY src/base64 ${BUN_DIR}/src/base64
@@ -146,7 +232,7 @@ WORKDIR $BUN_DIR
RUN make base64 && rm -rf src/base64 Makefile
-FROM bunbunbunbun/bun-base:latest as uws
+FROM bun-base as uws
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -156,6 +242,8 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
COPY Makefile ${BUN_DIR}/Makefile
COPY src/deps/uws ${BUN_DIR}/src/deps/uws
@@ -169,7 +257,7 @@ WORKDIR $BUN_DIR
RUN cd $BUN_DIR && \
make uws && rm -rf src/deps/uws Makefile
-FROM bunbunbunbun/bun-base:latest as picohttp
+FROM bun-base as picohttp
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -179,6 +267,8 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
COPY Makefile ${BUN_DIR}/Makefile
COPY src/deps/picohttpparser ${BUN_DIR}/src/deps/picohttpparser
@@ -191,7 +281,7 @@ RUN cd $BUN_DIR && \
make picohttp
-FROM bunbunbunbun/bun-base-with-zig-and-webkit:latest as identifier_cache
+FROM bun-base-with-zig-and-webkit as identifier_cache
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -201,6 +291,8 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
WORKDIR $BUN_DIR
@@ -211,7 +303,7 @@ COPY src/js_lexer/identifier_cache.zig ${BUN_DIR}/src/js_lexer/identifier_cache.
RUN cd $BUN_DIR && \
make identifier-cache && rm -rf zig-cache Makefile
-FROM bunbunbunbun/bun-base-with-zig-and-webkit:latest as node_fallbacks
+FROM bun-base-with-zig-and-webkit as node_fallbacks
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -221,6 +313,8 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
WORKDIR $BUN_DIR
@@ -230,7 +324,7 @@ COPY src/node-fallbacks ${BUN_DIR}/src/node-fallbacks
RUN cd $BUN_DIR && \
make node-fallbacks && rm -rf src/node-fallbacks/node_modules Makefile
-FROM bunbunbunbun/bun-base-with-zig-and-webkit:latest as prepare_release
+FROM bun-base-with-zig-and-webkit as prepare_release
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -240,7 +334,8 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
-
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
WORKDIR $BUN_DIR
@@ -253,24 +348,9 @@ COPY ./package.json ${BUN_DIR}/package.json
COPY ./misctools ${BUN_DIR}/misctools
COPY Makefile ${BUN_DIR}/Makefile
-COPY --from=lolhtml ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
-COPY --from=mimalloc ${BUN_DEPS_OUT_DIR}/*.o ${BUN_DEPS_OUT_DIR}/
-COPY --from=libarchive ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
-COPY --from=picohttp ${BUN_DEPS_OUT_DIR}/*.o ${BUN_DEPS_OUT_DIR}/
-COPY --from=boringssl ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
-COPY --from=uws ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
-COPY --from=uws ${BUN_DEPS_OUT_DIR}/*.o ${BUN_DEPS_OUT_DIR}/
-COPY --from=libbacktrace ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
-COPY --from=zlib ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
-COPY --from=tinycc ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
-COPY --from=base64 ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
-COPY --from=identifier_cache ${BUN_DIR}/src/js_lexer/*.blob ${BUN_DIR}/src/js_lexer/
-COPY --from=node_fallbacks ${BUN_DIR}/src/node-fallbacks/out ${BUN_DIR}/src/node-fallbacks/out
-WORKDIR ${BUN_DIR}
-
-FROM prepare_release as build_release
+FROM prepare_release as compile_release_obj
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -280,22 +360,29 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
COPY Makefile ${BUN_DIR}/Makefile
WORKDIR $BUN_DIR
-RUN cd $BUN_DIR && mkdir -p src/bun.js/bindings-obj && rm -rf $HOME/.cache zig-cache && make \
- sqlite api \
- analytics \
- bun_error \
- fallback_decoder && rm -rf $HOME/.cache zig-cache && \
+ENV JSC_BASE_DIR=${WEBKIT_DIR}
+ENV LIB_ICU_PATH=${WEBKIT_DIR}/lib
+ARG ARCH=x86_64
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
+ARG TRIPLET=${ARCH}-linux-gnu
+
+COPY --from=identifier_cache ${BUN_DIR}/src/js_lexer/*.blob ${BUN_DIR}/src/js_lexer/
+COPY --from=node_fallbacks ${BUN_DIR}/src/node-fallbacks/out ${BUN_DIR}/src/node-fallbacks/out
+
+RUN cd $BUN_DIR && mkdir -p src/bun.js/bindings-obj && rm -rf $HOME/.cache zig-cache && make prerelease && \
mkdir -p $BUN_RELEASE_DIR && \
- make jsc-bindings-mac -j10 && \
- make release copy-to-bun-release-dir && \
- rm -rf $HOME/.cache zig-cache misctools package.json build-id completions build.zig $(BUN_DIR)/packages
+ $ZIG_PATH/zig build obj -Drelease-fast -Dtarget=${TRIPLET} -Dcpu=$(echo "${CPU_TARGET}" | tr '-' '_') && \
+ make bun-release-copy-obj
-FROM prepare_release as build_unit
+FROM scratch as build_release_obj
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -305,21 +392,13 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
-WORKDIR $BUN_DIR
-ENV PATH "$ZIG_PATH:$PATH"
-
-CMD make jsc-bindings-headers \
- api \
- analytics \
- bun_error \
- fallback_decoder \
- jsc-bindings-mac -j10 && \
- make \
- run-all-unit-tests
+COPY --from=compile_release_obj /tmp/*.o /
-FROM bunbunbunbun/bun-base-with-zig-and-webkit:latest as bun.devcontainer
+FROM prepare_release as compile_cpp
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -329,33 +408,32 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
-ENV WEBKIT_OUT_DIR ${WEBKIT_DIR}
-ENV PATH "$ZIG_PATH:$PATH"
-ENV JSC_BASE_DIR $WEBKIT_OUT_DIR
-ENV LIB_ICU_PATH ${GITHUB_WORKSPACE}/icu/source/lib
-ENV BUN_RELEASE_DIR ${BUN_RELEASE_DIR}
-ENV PATH "${GITHUB_WORKSPACE}/packages/bun-linux-x64:${GITHUB_WORKSPACE}/packages/bun-linux-aarch64:${GITHUB_WORKSPACE}/packages/debug-bun-linux-x64:${GITHUB_WORKSPACE}/packages/debug-bun-linux-aarch64:$PATH"
-ENV PATH "/home/ubuntu/zls/zig-out/bin:$PATH"
-
-ENV BUN_INSTALL /home/ubuntu/.bun
-ENV XDG_CONFIG_HOME /home/ubuntu/.config
-
-RUN apt-get -y update && update-alternatives --install /usr/bin/lldb lldb /usr/bin/lldb-13 90
-
-COPY .devcontainer/workspace.code-workspace $GITHUB_WORKSPACE/workspace.code-workspace
-COPY .devcontainer/zls.json $GITHUB_WORKSPACE/workspace.code-workspace
-COPY .devcontainer/limits.conf /etc/security/limits.conf
-COPY ".devcontainer/scripts/" /scripts/
-COPY ".devcontainer/scripts/getting-started.sh" $GITHUB_WORKSPACE/getting-started.sh
-RUN mkdir -p /home/ubuntu/.bun /home/ubuntu/.config $GITHUB_WORKSPACE/bun && \
- bash /scripts/common-debian.sh && \
- bash /scripts/github.sh && \
- bash /scripts/nice.sh && \
- bash /scripts/zig-env.sh
-COPY .devcontainer/zls.json /home/ubuntu/.config/zls.json
-
-FROM ubuntu:20.04 as release_with_debug_info
+COPY Makefile ${BUN_DIR}/Makefile
+
+WORKDIR $BUN_DIR
+
+ENV JSC_BASE_DIR=${WEBKIT_DIR}
+ENV LIB_ICU_PATH=${WEBKIT_DIR}/lib
+
+COPY --from=lolhtml ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=mimalloc ${BUN_DEPS_OUT_DIR}/*.o ${BUN_DEPS_OUT_DIR}/
+COPY --from=libarchive ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=picohttp ${BUN_DEPS_OUT_DIR}/*.o ${BUN_DEPS_OUT_DIR}/
+COPY --from=boringssl ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=uws ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=uws ${BUN_DEPS_OUT_DIR}/*.o ${BUN_DEPS_OUT_DIR}/
+COPY --from=libbacktrace ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=zlib ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=tinycc ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=base64 ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+
+RUN cd $BUN_DIR && mkdir -p src/bun.js/bindings-obj && rm -rf $HOME/.cache zig-cache && mkdir -p $BUN_RELEASE_DIR && \
+ make jsc-bindings-mac -j10 && mv src/bun.js/bindings-obj/* /tmp
+
+FROM prepare_release as sqlite
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -366,21 +444,20 @@ ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
-COPY .devcontainer/limits.conf /etc/security/limits.conf
+COPY Makefile ${BUN_DIR}/Makefile
-ENV BUN_INSTALL /opt/bun
-ENV PATH "/opt/bun/bin:$PATH"
-ARG BUILDARCH=amd64
-LABEL org.opencontainers.image.title="bun ${BUILDARCH} (glibc)"
-LABEL org.opencontainers.image.source=https://github.com/jarred-sumner/bun
-COPY --from=build_release ${BUN_RELEASE_DIR}/bun /opt/bun/bin/bun
-COPY --from=build_release ${BUN_RELEASE_DIR}/bun-profile /opt/bun/bin/bun-profile
+WORKDIR $BUN_DIR
+
+ENV JSC_BASE_DIR=${WEBKIT_DIR}
+ENV LIB_ICU_PATH=${WEBKIT_DIR}/lib
-WORKDIR /opt/bun
+RUN cd $BUN_DIR && make sqlite
-ENTRYPOINT [ "/opt/bun/bin/bun" ]
+FROM scratch as build_release_cpp
-FROM ubuntu:20.04 as release
+COPY --from=compile_cpp /tmp/*.o /
+
+FROM prepare_release as build_release
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
@@ -390,57 +467,116 @@ ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ARG CPU_TARGET=native
+ENV CPU_TARGET=${CPU_TARGET}
-COPY .devcontainer/limits.conf /etc/security/limits.conf
+COPY Makefile ${BUN_DIR}/Makefile
-ENV BUN_INSTALL /opt/bun
-ENV PATH "/opt/bun/bin:$PATH"
-ARG BUILDARCH=amd64
-LABEL org.opencontainers.image.title="bun ${BUILDARCH} (glibc)"
-LABEL org.opencontainers.image.source=https://github.com/jarred-sumner/bun
-COPY --from=build_release ${BUN_RELEASE_DIR}/bun /opt/bun/bin/bun
-WORKDIR /opt/bun
+WORKDIR $BUN_DIR
+
+ENV JSC_BASE_DIR=${WEBKIT_DIR}
+ENV LIB_ICU_PATH=${WEBKIT_DIR}/lib
+
+COPY --from=lolhtml ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=mimalloc ${BUN_DEPS_OUT_DIR}/*.o ${BUN_DEPS_OUT_DIR}/
+COPY --from=libarchive ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=picohttp ${BUN_DEPS_OUT_DIR}/*.o ${BUN_DEPS_OUT_DIR}/
+COPY --from=boringssl ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=uws ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=uws ${BUN_DEPS_OUT_DIR}/*.o ${BUN_DEPS_OUT_DIR}/
+COPY --from=libbacktrace ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=zlib ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=tinycc ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=base64 ${BUN_DEPS_OUT_DIR}/*.a ${BUN_DEPS_OUT_DIR}/
+COPY --from=sqlite ${BUN_DEPS_OUT_DIR}/*.o ${BUN_DEPS_OUT_DIR}/
+COPY --from=build_release_obj /*.o /tmp
+COPY --from=build_release_cpp /*.o ${BUN_DIR}/src/bun.js/bindings-obj/
+
+RUN cd $BUN_DIR && mkdir -p ${BUN_RELEASE_DIR} && make bun-relink copy-to-bun-release-dir && \
+ rm -rf $HOME/.cache zig-cache misctools package.json build-id completions build.zig $(BUN_DIR)/packages
-ENTRYPOINT [ "/opt/bun/bin/bun" ]
-FROM bunbunbunbun/bun-test-base as test_base
+FROM scratch as artifact
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
ARG ZIG_PATH=${GITHUB_WORKSPACE}/zig
-# Directory extracts to "bun-webkit"
ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
-ARG BUILDARCH=amd64
-RUN groupadd -r chromium && useradd -d ${BUN_DIR} -M -r -g chromium -G audio,video chromium \
- && mkdir -p /home/chromium/Downloads && chown -R chromium:chromium /home/chromium
+COPY --from=build_release ${BUN_RELEASE_DIR}/bun /bun
+COPY --from=build_release ${BUN_RELEASE_DIR}/bun-profile /bun-profile
+COPY --from=build_release ${BUN_DEPS_OUT_DIR}/* /bun-dependencies
+COPY --from=build_release_obj /*.o /bun-obj
+
+
+FROM prepare_release as build_unit
+
+ARG DEBIAN_FRONTEND=noninteractive
+ARG GITHUB_WORKSPACE=/build
+ARG ZIG_PATH=${GITHUB_WORKSPACE}/zig
+# Directory extracts to "bun-webkit"
+ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
+ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
+ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
+ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
-USER chromium
WORKDIR $BUN_DIR
-ENV NPM_CLIENT bun
-ENV PATH "${BUN_DIR}/packages/bun-linux-x64:${BUN_DIR}/packages/bun-linux-aarch64:$PATH"
-ENV CI 1
-ENV BROWSER_EXECUTABLE /usr/bin/chromium
+ENV PATH "$ZIG_PATH:$PATH"
+ENV LIB_ICU_PATH "${WEBKIT_DIR}/lib"
-COPY ./test ${BUN_DIR}/test
-COPY Makefile ${BUN_DIR}/Makefile
-COPY package.json ${BUN_DIR}/package.json
-COPY .docker/run-test.sh ${BUN_DIR}/run-test.sh
-COPY ./bun.lockb ${BUN_DIR}/bun.lockb
+CMD make jsc-bindings-headers \
+ api \
+ analytics \
+ bun_error \
+ fallback_decoder \
+ jsc-bindings-mac -j10 && \
+ make \
+ run-all-unit-tests
+
+
+
+# FROM bun-test-base as test_base
+
+# ARG DEBIAN_FRONTEND=noninteractive
+# ARG GITHUB_WORKSPACE=/build
+# ARG ZIG_PATH=${GITHUB_WORKSPACE}/zig
+# # Directory extracts to "bun-webkit"
+# ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
+# ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
+# ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
+# ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+
+# ARG BUILDARCH=amd64
+# RUN groupadd -r chromium && useradd -d ${BUN_DIR} -M -r -g chromium -G audio,video chromium \
+# && mkdir -p /home/chromium/Downloads && chown -R chromium:chromium /home/chromium
+
+# USER chromium
+# WORKDIR $BUN_DIR
+
+# ENV NPM_CLIENT bun
+# ENV PATH "${BUN_DIR}/packages/bun-linux-x64:${BUN_DIR}/packages/bun-linux-aarch64:$PATH"
+# ENV CI 1
+# ENV BROWSER_EXECUTABLE /usr/bin/chromium
+
+# COPY ./test ${BUN_DIR}/test
+# COPY Makefile ${BUN_DIR}/Makefile
+# COPY package.json ${BUN_DIR}/package.json
+# COPY .docker/run-test.sh ${BUN_DIR}/run-test.sh
+# COPY ./bun.lockb ${BUN_DIR}/bun.lockb
-# # We don't want to worry about architecture differences in this image
-COPY --from=release /opt/bun/bin/bun ${BUN_DIR}/packages/bun-linux-aarch64/bun
-COPY --from=release /opt/bun/bin/bun ${BUN_DIR}/packages/bun-linux-x64/bun
+# # # We don't want to worry about architecture differences in this image
+# COPY --from=release /opt/bun/bin/bun ${BUN_DIR}/packages/bun-linux-aarch64/bun
+# COPY --from=release /opt/bun/bin/bun ${BUN_DIR}/packages/bun-linux-x64/bun
-USER root
-RUN chgrp -R chromium ${BUN_DIR} && chmod g+rwx ${BUN_DIR} && chown -R chromium:chromium ${BUN_DIR}
-USER chromium
+# USER root
+# RUN chgrp -R chromium ${BUN_DIR} && chmod g+rwx ${BUN_DIR} && chown -R chromium:chromium ${BUN_DIR}
+# USER chromium
-CMD [ "bash", "run-test.sh" ]
+# CMD [ "bash", "run-test.sh" ]
-FROM release \ No newline at end of file
+# FROM release \ No newline at end of file
diff --git a/Dockerfile.base b/Dockerfile.base
index 38a34c6ef..0bbc6b7d6 100644
--- a/Dockerfile.base
+++ b/Dockerfile.base
@@ -1,147 +1,73 @@
-FROM ubuntu:18.04 as bun-base-with-args
+FROM bitnami/minideb:bullseye as bun-base
-FROM bun-base-with-args as bun-base
+RUN install_packages ca-certificates curl wget lsb-release software-properties-common gnupg gnupg1 gnupg2
-ARG DEBIAN_FRONTEND=noninteractive
-ARG GITHUB_WORKSPACE=/build
-ARG ZIG_PATH=${GITHUB_WORKSPACE}/zig
-# Directory extracts to "bun-webkit"
-ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
-ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
-ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
-ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
-
-WORKDIR ${GITHUB_WORKSPACE}
-
-RUN apt-get update && \
- apt-get install --no-install-recommends -y wget gnupg2 curl lsb-release wget software-properties-common && \
- add-apt-repository ppa:longsleep/golang-backports && \
- wget https://apt.llvm.org/llvm.sh --no-check-certificate && \
+RUN wget https://apt.llvm.org/llvm.sh && \
chmod +x llvm.sh && \
- ./llvm.sh 13 && \
- curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \
- apt-get update && \
- apt-get install --no-install-recommends -y \
- ca-certificates \
- curl \
- gnupg2 \
- software-properties-common \
+ ./llvm.sh 13
+
+RUN install_packages \
cmake \
- build-essential \
+ curl \
+ file \
git \
- libssl-dev \
+ gnupg \
+ libc-dev \
+ libxml2 \
+ libxml2-dev \
+ make \
+ ninja-build \
+ perl \
+ python3 \
+ rsync \
ruby \
- liblld-13-dev \
- libclang-13-dev \
- nodejs \
- gcc \
- g++ \
- clang-13 \
- clang-format-13 \
- libc++-13-dev \
- libc++abi-13-dev \
- lld-13 \
- libicu-dev \
- wget \
- rustc \
- cargo \
unzip \
- tar \
- golang-go ninja-build pkg-config automake autoconf libtool curl && \
- update-alternatives --install /usr/bin/cc cc /usr/bin/clang-13 90 && \
- update-alternatives --install /usr/bin/cpp cpp /usr/bin/clang++-13 90 && \
- update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-13 90 && \
- npm install -g esbuild
+ bash tar gzip
-ENV CC=clang-13
ENV CXX=clang++-13
+ENV CC=clang-13
+RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \
+ install_packages nodejs && \
+ npm install -g esbuild
-ARG BUILDARCH=amd64
-
-
-WORKDIR $GITHUB_WORKSPACE
-
-ENV WEBKIT_OUT_DIR ${WEBKIT_DIR}
-
-ENV JSC_BASE_DIR $WEBKIT_OUT_DIR
-ENV LIB_ICU_PATH ${GITHUB_WORKSPACE}/icu/source/lib
-ENV BUN_RELEASE_DIR ${BUN_RELEASE_DIR}
-ENV BUN_DEPS_OUT_DIR ${BUN_DEPS_OUT_DIR}
-
-RUN cd / && mkdir -p $BUN_RELEASE_DIR $BUN_DEPS_OUT_DIR ${BUN_DIR} ${BUN_DEPS_OUT_DIR}
-
-LABEL org.opencontainers.image.title="bun base image ${BUILDARCH} (glibc)"
-LABEL org.opencontainers.image.source=https://github.com/jarred-sumner/bun
-
-
-FROM bun-base as bun-base-with-zig-and-webkit
ARG DEBIAN_FRONTEND=noninteractive
ARG GITHUB_WORKSPACE=/build
-ARG ZIG_PATH=${GITHUB_WORKSPACE}/zig
+
# Directory extracts to "bun-webkit"
ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
ARG BUILDARCH=amd64
+ARG ZIG_PATH=${GITHUB_WORKSPACE}/zig
+
+ENV WEBKIT_OUT_DIR=${WEBKIT_DIR}
+ENV BUILDARCH=${BUILDARCH}
+ENV AR=/usr/bin/llvm-ar-13
+ENV ZIG "${ZIG_PATH}/zig"
+ENV PATH="$ZIG/bin:$PATH"
+ENV LD=lld-13
+
+RUN mkdir -p $BUN_DIR $BUN_DEPS_OUT_DIR
+
+FROM bun-base as bun-base-with-zig-and-webkit
WORKDIR $GITHUB_WORKSPACE
-RUN cd $GITHUB_WORKSPACE && \
- curl -o zig-linux-$BUILDARCH.zip -L https://github.com/Jarred-Sumner/zig/releases/download/jul1/zig-linux-$BUILDARCH.zip && \
- unzip -q zig-linux-$BUILDARCH.zip && \
+RUN curl -o zig-linux-$BUILDARCH.zip -L https://github.com/Jarred-Sumner/zig/releases/download/jul1/zig-linux-$BUILDARCH.zip && \
+ unzip zig-linux-$BUILDARCH.zip && \
rm zig-linux-$BUILDARCH.zip;
-RUN cd $GITHUB_WORKSPACE && \
- curl -o bun-webkit-linux-$BUILDARCH.tar.gz -L https://github.com/Jarred-Sumner/WebKit/releases/download/jul4/bun-webkit-linux-$BUILDARCH.tar.gz && \
- tar -xzf bun-webkit-linux-$BUILDARCH.tar.gz && \
+RUN mkdir -p $WEBKIT_OUT_DIR && cd $WEBKIT_OUT_DIR && cd ../ && \
+ curl -o bun-webkit-linux-$BUILDARCH.tar.gz -L https://github.com/oven-sh/WebKit/releases/download/jul4-2/bun-webkit-linux-$BUILDARCH.tar.gz && \
+ tar -xvzf bun-webkit-linux-$BUILDARCH.tar.gz && \
+ ls && \
+ echo $(pwd) && \
rm bun-webkit-linux-$BUILDARCH.tar.gz && \
cat $WEBKIT_OUT_DIR/include/cmakeconfig.h > /dev/null
-RUN cd $GITHUB_WORKSPACE && \
- curl -o icu4c-66_1-src.tgz -L https://github.com/unicode-org/icu/releases/download/release-66-1/icu4c-66_1-src.tgz && \
- tar -xzf icu4c-66_1-src.tgz && \
- rm icu4c-66_1-src.tgz && \
- cd icu/source && \
- ./configure --enable-static --disable-shared && \
- make -j$(nproc)
-
-ENV ZIG "${ZIG_PATH}/zig"
-
LABEL org.opencontainers.image.title="bun base image with zig & webkit ${BUILDARCH} (glibc)"
LABEL org.opencontainers.image.source=https://github.com/jarred-sumner/bun
-
-FROM debian:bullseye-slim as bun-test-base
-# Original creator:
-# LABEL maintainer "Jessie Frazelle <jess@linux.com>"
-
-# Install Chromium
-# Yes, including the Google API Keys sucks but even debian does the same: https://packages.debian.org/stretch/amd64/chromium/filelist
-RUN apt-get update && apt-get install -y \
- chromium \
- chromium-l10n \
- fonts-liberation \
- fonts-roboto \
- hicolor-icon-theme \
- libcanberra-gtk-module \
- libexif-dev \
- libgl1-mesa-dri \
- libgl1-mesa-glx \
- libpangox-1.0-0 \
- libv4l-0 \
- fonts-symbola \
- bash \
- make \
- psmisc \
- curl \
- --no-install-recommends \
- && rm -rf /var/lib/apt/lists/* \
- && mkdir -p /etc/chromium.d/ \
- && /bin/echo -e 'export GOOGLE_API_KEY="AIzaSyCkfPOPZXDKNn8hhgu3JrA62wIgC93d44k"\nexport GOOGLE_DEFAULT_CLIENT_ID="811574891467.apps.googleusercontent.com"\nexport GOOGLE_DEFAULT_CLIENT_SECRET="kdloedMFGdGla2P1zacGjAQh"' > /etc/chromium.d/googleapikeys && \
- curl -L https://deb.nodesource.com/setup_16.x | bash - && \
- apt-get update && \
- apt-get install -y nodejs npm
-
diff --git a/Dockerfile.devcontainer b/Dockerfile.devcontainer
new file mode 100644
index 000000000..50f39f112
--- /dev/null
+++ b/Dockerfile.devcontainer
@@ -0,0 +1,99 @@
+FROM ubuntu:20.04 as bun.devcontainer
+
+ARG DEBIAN_FRONTEND=noninteractive
+ARG GITHUB_WORKSPACE=/build
+ARG BUILDARCH=amd64
+
+ARG ZIG_PATH=${GITHUB_WORKSPACE}/zig
+ARG WEBKIT_DIR=${GITHUB_WORKSPACE}/bun-webkit
+ARG BUN_RELEASE_DIR=${GITHUB_WORKSPACE}/bun-release
+ARG BUN_DEPS_OUT_DIR=${GITHUB_WORKSPACE}/bun-deps
+ARG BUN_DIR=${GITHUB_WORKSPACE}/bun
+ENV WEBKIT_OUT_DIR ${WEBKIT_DIR}
+ENV PATH "$ZIG_PATH:$PATH"
+ENV JSC_BASE_DIR $WEBKIT_OUT_DIR
+ENV LIB_ICU_PATH ${GITHUB_WORKSPACE}/icu/source/lib
+ENV BUN_RELEASE_DIR ${BUN_RELEASE_DIR}
+ENV PATH "${GITHUB_WORKSPACE}/packages/bun-linux-x64:${GITHUB_WORKSPACE}/packages/bun-linux-aarch64:${GITHUB_WORKSPACE}/packages/debug-bun-linux-x64:${GITHUB_WORKSPACE}/packages/debug-bun-linux-aarch64:$PATH"
+ENV PATH "/home/ubuntu/zls/zig-out/bin:$PATH"
+ENV BUN_INSTALL /home/ubuntu/.bun
+ENV XDG_CONFIG_HOME /home/ubuntu/.config
+
+WORKDIR ${GITHUB_WORKSPACE}
+
+RUN apt-get update && \
+ apt-get install --no-install-recommends -y wget gnupg2 curl lsb-release wget software-properties-common && \
+ add-apt-repository ppa:longsleep/golang-backports && \
+ wget https://apt.llvm.org/llvm.sh --no-check-certificate && \
+ chmod +x llvm.sh && \
+ ./llvm.sh 13 && \
+ curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \
+ apt-get update && \
+ apt-get install --no-install-recommends -y \
+ ca-certificates \
+ curl \
+ gnupg2 \
+ software-properties-common \
+ cmake \
+ build-essential \
+ git \
+ libssl-dev \
+ ruby \
+ liblld-13-dev \
+ libclang-13-dev \
+ nodejs \
+ gcc \
+ g++ \
+ clang-13 \
+ clang-format-13 \
+ libc++-13-dev \
+ libc++abi-13-dev \
+ lld-13 \
+ libicu-dev \
+ wget \
+ rustc \
+ cargo \
+ unzip \
+ tar \
+ golang-go ninja-build pkg-config automake autoconf libtool curl && \
+ update-alternatives --install /usr/bin/cc cc /usr/bin/clang-13 90 && \
+ update-alternatives --install /usr/bin/cpp cpp /usr/bin/clang++-13 90 && \
+ update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-13 90 && \
+ npm install -g esbuild
+
+ENV CC=clang-13
+ENV CXX=clang++-13
+ENV ZIG "${ZIG_PATH}/zig"
+ARG BUILDARCH=amd64
+
+
+WORKDIR $GITHUB_WORKSPACE
+
+RUN cd / && mkdir -p $BUN_RELEASE_DIR $BUN_DEPS_OUT_DIR ${BUN_DIR} ${BUN_DEPS_OUT_DIR}
+
+WORKDIR $GITHUB_WORKSPACE
+
+RUN cd $GITHUB_WORKSPACE && \
+ curl -o zig-linux-$BUILDARCH.zip -L https://github.com/Jarred-Sumner/zig/releases/download/jul1/zig-linux-$BUILDARCH.zip && \
+ unzip -q zig-linux-$BUILDARCH.zip && \
+ rm zig-linux-$BUILDARCH.zip;
+
+RUN cd $GITHUB_WORKSPACE && \
+ curl -o bun-webkit-linux-$BUILDARCH.tar.gz -L https://github.com/Jarred-Sumner/WebKit/releases/download/jul4/bun-webkit-linux-$BUILDARCH.tar.gz && \
+ tar -xzf bun-webkit-linux-$BUILDARCH.tar.gz && \
+ rm bun-webkit-linux-$BUILDARCH.tar.gz && \
+ cat $WEBKIT_OUT_DIR/include/cmakeconfig.h > /dev/null
+
+RUN apt-get -y update && update-alternatives --install /usr/bin/lldb lldb /usr/bin/lldb-13 90
+
+COPY .devcontainer/workspace.code-workspace $GITHUB_WORKSPACE/workspace.code-workspace
+COPY .devcontainer/zls.json $GITHUB_WORKSPACE/workspace.code-workspace
+COPY .devcontainer/limits.conf /etc/security/limits.conf
+COPY ".devcontainer/scripts/" /scripts/
+COPY ".devcontainer/scripts/getting-started.sh" $GITHUB_WORKSPACE/getting-started.sh
+RUN mkdir -p /home/ubuntu/.bun /home/ubuntu/.config $GITHUB_WORKSPACE/bun && \
+ bash /scripts/common-debian.sh && \
+ bash /scripts/github.sh && \
+ bash /scripts/nice.sh && \
+ bash /scripts/zig-env.sh
+COPY .devcontainer/zls.json /home/ubuntu/.config/zls.json \ No newline at end of file
diff --git a/Makefile b/Makefile
index 4dfc91dc8..012026772 100644
--- a/Makefile
+++ b/Makefile
@@ -4,12 +4,16 @@ OS_NAME := $(shell uname -s | tr '[:upper:]' '[:lower:]')
ARCH_NAME_RAW := $(shell uname -m)
BUN_AUTO_UPDATER_REPO = Jarred-Sumner/bun-releases-for-updater
+# 'make' command will trigger the help target
+.DEFAULT_GOAL := help
+
# On Linux ARM64, uname -m reports aarch64
ifeq ($(ARCH_NAME_RAW),aarch64)
ARCH_NAME_RAW = arm64
endif
-MARCH_NATIVE = -mtune=native
+CPU_TARGET ?= native
+MARCH_NATIVE = -mtune=$(CPU_TARGET)
ARCH_NAME :=
DOCKER_BUILDARCH =
@@ -18,13 +22,13 @@ ifeq ($(ARCH_NAME_RAW),arm64)
DOCKER_BUILDARCH = arm64
BREW_PREFIX_PATH = /opt/homebrew
MIN_MACOS_VERSION ?= 11.0
- MARCH_NATIVE = -mtune=native
+ MARCH_NATIVE = -mtune=$(CPU_TARGET)
else
ARCH_NAME = x64
DOCKER_BUILDARCH = amd64
BREW_PREFIX_PATH = /usr/local
MIN_MACOS_VERSION ?= 10.14
- MARCH_NATIVE = -march=native -mtune=native
+ MARCH_NATIVE = -march=$(CPU_TARGET) -mtune=$(CPU_TARGET)
endif
AR=
@@ -118,7 +122,7 @@ endif
ifeq ($(OS_NAME),linux)
LIBICONV_PATH =
-AR=llvm-ar-13
+AR = $(shell which llvm-ar-13 || which llvm-ar || which ar)
endif
OPTIMIZATION_LEVEL=-O3 $(MARCH_NATIVE)
@@ -276,10 +280,11 @@ ICU_FLAGS ?=
# TODO: find a way to make this more resilient
# Ideally, we could just look up the linker search paths
-LIB_ICU_PATH ?= $(BUN_DEPS_DIR)
-
ifeq ($(OS_NAME),linux)
+LIB_ICU_PATH ?= $(JSC_LIB)
ICU_FLAGS += $(LIB_ICU_PATH)/libicuuc.a $(LIB_ICU_PATH)/libicudata.a $(LIB_ICU_PATH)/libicui18n.a
+else
+LIB_ICU_PATH ?= $(BUN_DEPS_DIR)
endif
ifeq ($(OS_NAME),darwin)
@@ -417,7 +422,7 @@ tinycc:
make -j10 && \
cp $(TINYCC_DIR)/*.a $(BUN_DEPS_OUT_DIR)
-generate-builtins:
+generate-builtins: ## to generate builtins
rm -f src/bun.js/bindings/*Builtin*.cpp src/bun.js/bindings/*Builtin*.h src/bun.js/bindings/*Builtin*.cpp
rm -rf src/bun.js/builtins/cpp
mkdir -p src/bun.js/builtins/cpp
@@ -444,7 +449,7 @@ release-types:
@npm --version >/dev/null 2>&1 || (echo -e "ERROR: npm is required."; exit 1)
cd packages/bun-types && npm publish
-format:
+format: ## to format the code
$(PRETTIER) --write test/bun.js/*.js
$(PRETTIER) --write test/bun.js/solid-dom-fixtures/**/*.js
@@ -541,7 +546,7 @@ init-submodules:
git submodule update --init --recursive --progress --depth=1
build-obj:
- $(ZIG) build obj -Drelease-fast
+ $(ZIG) build obj -Drelease-fast -Dcpu="$(CPU_TARGET)"
dev-build-obj-wasm:
$(ZIG) build bun-wasm -Dtarget=wasm32-freestanding --prominent-compile-errors
@@ -601,7 +606,8 @@ usockets:
rm -rf $(BUN_DEPS_DIR)/uws/uSockets/*.o $(BUN_DEPS_DIR)/uws/uSockets/**/*.o $(BUN_DEPS_DIR)/uws/uSockets/*.a $(BUN_DEPS_DIR)/uws/uSockets/*.bc
cd $(USOCKETS_DIR) && $(CC) -fno-builtin-malloc -fno-builtin-free -fno-builtin-realloc $(EMIT_LLVM_FOR_RELEASE) $(MACOS_MIN_FLAG) -fPIC $(CFLAGS) $(UWS_CC_FLAGS) -save-temps -I$(BUN_DEPS_DIR)/uws/uSockets/src $(UWS_LDFLAGS) -g $(DEFAULT_LINKER_FLAGS) $(PLATFORM_LINKER_FLAGS) $(OPTIMIZATION_LEVEL) -g -c $(wildcard $(USOCKETS_SRC_DIR)/*.c) $(wildcard $(USOCKETS_SRC_DIR)/**/*.c)
cd $(USOCKETS_DIR) && $(CXX) -fno-builtin-malloc -fno-builtin-free -fno-builtin-realloc $(EMIT_LLVM_FOR_RELEASE) $(MACOS_MIN_FLAG) -fPIC $(CXXFLAGS) $(UWS_CXX_FLAGS) -save-temps -I$(BUN_DEPS_DIR)/uws/uSockets/src $(UWS_LDFLAGS) -g $(DEFAULT_LINKER_FLAGS) $(PLATFORM_LINKER_FLAGS) $(OPTIMIZATION_LEVEL) -g -c $(wildcard $(USOCKETS_SRC_DIR)/*.cpp) $(wildcard $(USOCKETS_SRC_DIR)/**/*.cpp)
- cd $(USOCKETS_DIR) && $(AR) rcvs $(BUN_DEPS_OUT_DIR)/libusockets.a *.bc
+ cd $(USOCKETS_DIR) && $(AR) rcvs $(BUN_DEPS_OUT_DIR)/libusockets.a $(USOCKETS_DIR)/*.{o,bc}
+
uws: usockets
$(CXX) $(BITCODE_OR_SECTIONS) $(EMIT_LLVM_FOR_RELEASE) -fPIC -I$(BUN_DEPS_DIR)/uws/uSockets/src $(CLANG_FLAGS) $(CFLAGS) $(UWS_CXX_FLAGS) $(UWS_LDFLAGS) $(PLATFORM_LINKER_FLAGS) -c -I$(BUN_DEPS_DIR) $(BUN_DEPS_OUT_DIR)/libusockets.a $(BUN_DEPS_DIR)/libuwsockets.cpp -o $(BUN_DEPS_OUT_DIR)/libuwsockets.o
@@ -614,8 +620,6 @@ sign-macos-aarch64:
cls:
@echo "\n\n---\n\n"
-release: all-js jsc-bindings-mac build-obj cls bun-link-lld-release bun-link-lld-release-dsym release-bin-entitlements
-release-safe: all-js jsc-bindings-mac build-obj-safe cls bun-link-lld-release bun-link-lld-release-dsym release-bin-entitlements
jsc-check:
@ls $(JSC_BASE_DIR) >/dev/null 2>&1 || (echo "Failed to access WebKit build. Please compile the WebKit submodule using the Dockerfile at $(shell pwd)/src/javascript/WebKit/Dockerfile and then copy from /output in the Docker container to $(JSC_BASE_DIR). You can override the directory via JSC_BASE_DIR. \n\n DOCKER_BUILDKIT=1 docker build -t bun-webkit $(shell pwd)/src/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)
@@ -624,6 +628,15 @@ jsc-check:
all-js: runtime_js fallback_decoder bun_error node-fallbacks
+ensure-package-dir:
+ mkdir -p $(PACKAGE_DIR)
+
+prerelease: api analytics all-js ensure-package-dir
+release-only: jsc-bindings-mac build-obj cls bun-link-lld-release bun-link-lld-release-dsym release-bin-entitlements
+release-safe-only: all-js jsc-bindings-mac build-obj-safe cls bun-link-lld-release bun-link-lld-release-dsym release-bin-entitlements
+release: prerelease release-only
+release-safe: prerelease release-safe-only
+
fmt-cpp:
cd src/bun.js/bindings && clang-format *.cpp *.h -i
@@ -863,7 +876,7 @@ release-bin: release-bin-without-push release-bin-push
test/wiptest/run.o: test/wiptest/run.cpp
- $(CXX) -Wall -g -c -std=c++17 -o test/wiptest/run.o test/wiptest/run.cpp
+ $(CXX) -Wall -g -c -std=c++2a -lc -o test/wiptest/run.o test/wiptest/run.cpp
test/wiptest/run: test/wiptest/run.o
$(CXX) -Wall -g -o test/wiptest/run test/wiptest/run.o
@@ -907,7 +920,7 @@ test-dev-bun-snapshot:
test-bun-wiptest: test/wiptest/run
cd test/wiptest && BUN_BIN=$(DEBUG_BUN) ./run ./fixtures
-test-all: test-install test-bun-snapshot test-with-hmr test-no-hmr test-create-next test-create-react test-bun-run test-bun-install test-bun-dev test-bun-wiptest
+test-all: test-install test-bun-snapshot test-with-hmr test-no-hmr test-create-next test-create-react test-bun-run test-bun-install test-bun-dev
copy-test-node-modules:
rm -rf test/snippets/package-json-exports/node_modules || echo "";
@@ -1205,6 +1218,7 @@ bun-link-lld-release-no-jsc:
-o $(BUN_RELEASE_BIN) -Wl,-undefined,dynamic_lookup -Wl,-why_load
bun-relink-copy:
+ mkdir -p $(PACKAGE_DIR)
cp /tmp/bun-$(PACKAGE_JSON_VERSION).o $(BUN_RELEASE_BIN).o
@@ -1218,6 +1232,10 @@ bun-link-lld-release:
rm -rf $(BUN_RELEASE_BIN).dSYM
cp $(BUN_RELEASE_BIN) $(BUN_RELEASE_BIN)-profile
+bun-release-copy-obj:
+ cp $(BUN_RELEASE_BIN).o /tmp/bun-$(PACKAGE_JSON_VERSION).o
+ cp $(BUN_RELEASE_BIN).o /tmp/bun-current.o
+
bun-link-lld-release-no-lto:
$(CXX) $(BUN_LLD_FLAGS_FAST) $(SYMBOLS) \
$(BUN_RELEASE_BIN).o \
@@ -1229,23 +1247,22 @@ bun-link-lld-release-no-lto:
ifeq ($(OS_NAME),darwin)
-bun-link-lld-release-dsym:
+bun-link-lld-release-dsym: bun-release-copy-obj
$(DSYMUTIL) -o $(BUN_RELEASE_BIN).dSYM $(BUN_RELEASE_BIN)
- -$(STRIP) $(BUN_RELEASE_BIN) --wildcard -K _napi\*
- cp $(BUN_RELEASE_BIN).o /tmp/bun-$(PACKAGE_JSON_VERSION).o
+ -$(STRIP) $(BUN_RELEASE_BIN)
copy-to-bun-release-dir-dsym:
gzip --keep -c $(PACKAGE_DIR)/bun.dSYM > $(BUN_RELEASE_DIR)/bun.dSYM.gz
endif
ifeq ($(OS_NAME),linux)
-bun-link-lld-release-dsym:
+bun-link-lld-release-dsym: bun-release-copy-obj
mv $(BUN_RELEASE_BIN).o /tmp/bun-$(PACKAGE_JSON_VERSION).o
+ -$(STRIP) $(BUN_RELEASE_BIN) --wildcard -K _napi\*
copy-to-bun-release-dir-dsym:
endif
-
bun-relink: bun-relink-copy bun-link-lld-release bun-link-lld-release-dsym
bun-relink-fast: bun-relink-copy bun-link-lld-release-no-lto
@@ -1408,7 +1425,7 @@ endif
endif
-build-unit:
+build-unit: ## to build your unit tests
@rm -rf zig-out/bin/$(testname)
@mkdir -p zig-out/bin
zig test $(realpath $(testpath)) \
@@ -1425,7 +1442,7 @@ build-unit:
&& \
cp zig-out/bin/$(testname) $(testbinpath)
-run-all-unit-tests:
+run-all-unit-tests: ## to run your unit tests
@rm -rf zig-out/bin/__main_test
@mkdir -p zig-out/bin
zig test src/main.zig \
@@ -1444,11 +1461,12 @@ run-all-unit-tests:
run-unit:
@zig-out/bin/$(testname) $(ZIG)
-
+help: ## to print this help
+ @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z0-9_-]+:.*?## / {gsub("\\\\n",sprintf("\n%22c",""), $$2);printf "\033[36m%-20s\033[0m \t\t%s\n", $$1, $$2}' $(MAKEFILE_LIST)
test: build-unit run-unit
-integration-test-dev:
+integration-test-dev: ## to run integration tests
USE_EXISTING_PROCESS=true TEST_SERVER_URL=http://localhost:3000 node test/scripts/browser.js
copy-install:
diff --git a/README.md b/README.md
index 6707162fe..169c7db6a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
# bun
+
<p align="center">
<a href="https://bun.sh"><img src="https://bun.sh/logo@2x.png" alt="Logo"></a>
</p>
@@ -540,7 +541,7 @@ You can see [Bun's Roadmap](https://github.com/oven-sh/bun/issues/159), but here
| `@jsxPragma` comments | JS Transpiler |
| Sharing `.bun` files | bun |
| Dates & timestamps | TOML parser |
-| [Hash components for Fast Refresh](https://github.com/oven-sh/bun/issues/18) | JSX Transpiler |
+| [Hash components for Fast Refresh](https://github.com/oven-sh/bun/issues/18) | JSX Transpiler |
<small>
JS Transpiler == JavaScript Transpiler
@@ -929,24 +930,29 @@ To fix this issue:
3. Try again, and if that still doesn’t fix it, open an issue
### Unzip is required
+
Unzip is required to install bun on Linux. You can use one of the following commands to install `unzip`:
#### Debian / Ubuntu / Mint
+
```sh
sudo apt install unzip
```
#### RedHat / CentOS / Fedora
+
```sh
sudo dnf install unzip
```
#### Arch / Manjaro
+
```sh
sudo pacman -S unzip
```
#### OpenSUSE
+
```sh
sudo zypper install unzip
```
@@ -1571,6 +1577,26 @@ bun is distributed as a single binary file, so you can also do this manually:
- Unzip the folder
- Move the `bun` binary to `~/.bun/bin` (or anywhere)
+### Canary builds
+
+[Canary](https://github.com/oven-sh/bun/releases/tag/canary) builds are generated on every commit. At the time of writing, only Linux x64 &amp; Linux arm64 are generated.
+
+To install a [canary](https://github.com/oven-sh/bun/releases/tag/canary) build of bun, run:
+
+```bash
+bun upgrade --canary
+```
+
+This flag is not persistent (though that might change in the future). If you want to always run the canary build of bun, set the `BUN_CANARY` environment variable to `1` in your shell's startup script.
+
+This will download the release zip from https://github.com/oven-sh/bun/releases/tag/canary.
+
+To revert to the latest published version of bun, run:
+
+```bash
+bun upgrade
+```
+
### `bun completions`
This command installs completions for `zsh` and/or `fish`. It runs automatically on every `bun upgrade` and on install. It reads from `$SHELL` to determine which shell to install for. It tries several common shell completion directories for your shell and OS.
@@ -3243,7 +3269,6 @@ You’ll want to make sure `zig` is in `$PATH`. The specific version of Zig expe
If you're building on a macOS device, you'll need to have a valid Developer Certificate, or else the code signing step will fail. To check if you have one, open the `Keychain Access` app, go to the `login` profile and search for `Apple Development`. You should have at least one certificate with a name like `Apple Development: user@example.com (WDYABC123)`. If you don't have one, follow [this guide](https://ioscodesigning.com/generating-code-signing-files/#generate-a-code-signing-certificate-using-xcode) to get one.
-
In `bun`:
```bash
diff --git a/build-id b/build-id
index b8626c4cf..7ed6ff82d 100644
--- a/build-id
+++ b/build-id
@@ -1 +1 @@
-4
+5
diff --git a/build.zig b/build.zig
index a6a3bc96d..bffa8eefe 100644
--- a/build.zig
+++ b/build.zig
@@ -239,7 +239,6 @@ pub fn build(b: *std.build.Builder) !void {
} else if (target.isLinux()) {
target.setGnuLibCVersion(2, 27, 0);
}
-
std.mem.copy(
u8,
&triplet_buf,
@@ -311,6 +310,12 @@ pub fn build(b: *std.build.Builder) !void {
"bindgen",
false,
);
+ opts.addOption(
+ bool,
+ "baseline",
+ arch.isX86() and (obj.target.cpu_model == .baseline or
+ !std.Target.x86.featureSetHas(obj.target.getCpuFeatures(), .avx2)),
+ );
obj.addOptions("build_options", opts);
try addInternalPackages(
diff --git a/examples/react/README.md b/examples/react/README.md
index 0453c3c56..f88b8fe66 100644
--- a/examples/react/README.md
+++ b/examples/react/README.md
@@ -22,3 +22,11 @@ Open http://localhost:3000 with your browser to see the result.
You can start editing the page by modifying src/App.jsx. The page auto-updates as you edit the file.
+## Learn More
+
+To learn more about React.js, take a look at the following resources:
+
+- [React.js Documentation](https://reactjs.org/docs/getting-started.html) - learn about React.js features.
+- [Learn React.js](https://reactjs.org/tutorial/tutorial.html) - an interactive React.js tutorial.
+
+You can check out the [React.js GitHub repository](https://github.com/facebook/react) - your feedback and contributions are welcome!
diff --git a/src/base64/bun-base64.c b/src/base64/bun-base64.c
index e11f88da5..6cf11bbe7 100644
--- a/src/base64/bun-base64.c
+++ b/src/base64/bun-base64.c
@@ -22,7 +22,7 @@ size_t bun_base64_encode(char *dest, const char *src, size_t len) {
return chromium_base64_encode(dest, src, len);
}
-#elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
+#elif defined(__GNUC__) && (defined(__x86_64__) && defined(__AVX2__))
size_t bun_base64_decode(char *dest, const char *src, size_t len,
size_t *outlen) {
diff --git a/src/base64/fastavxbase64.c b/src/base64/fastavxbase64.c
index 47be824b4..305288fde 100644
--- a/src/base64/fastavxbase64.c
+++ b/src/base64/fastavxbase64.c
@@ -1,4 +1,4 @@
-#if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
+#if defined(__GNUC__) && defined(__x86_64__) && defined(__AVX2__)
#include "fastavxbase64.h"
#include <stdbool.h>
diff --git a/src/base64/fastavxbase64.h b/src/base64/fastavxbase64.h
index d1064a5d1..80f097ae8 100644
--- a/src/base64/fastavxbase64.h
+++ b/src/base64/fastavxbase64.h
@@ -1,4 +1,5 @@
-#if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
+
+#if defined(__GNUC__) && defined(__x86_64__) && defined(__AVX2__)
#ifndef EXPAVX_B64
#define EXPAVX_B64
diff --git a/src/bun.js/WebKit b/src/bun.js/WebKit
-Subproject 7e7774dabf1c2d94fe3604defb3c54a4c989c3b
+Subproject 6dd3cae7c03f061b30e09cce5da17b2e7b108ad
diff --git a/src/bun.js/node/syscall.zig b/src/bun.js/node/syscall.zig
index b931e9c0e..4378a4762 100644
--- a/src/bun.js/node/syscall.zig
+++ b/src/bun.js/node/syscall.zig
@@ -16,27 +16,29 @@ const C = @import("../../global.zig").C;
const linux = os.linux;
const Maybe = JSC.Maybe;
+// On Linux AARCh64, zig is missing stat & lstat syscalls
+const use_libc = (Environment.isLinux and Environment.isAarch64) or Environment.isMac;
pub const system = if (Environment.isLinux) linux else @import("io").darwin;
pub const S = struct {
pub usingnamespace if (Environment.isLinux) linux.S else std.os.S;
};
const sys = std.os.system;
-const statSym = if (Environment.isMac)
+const statSym = if (use_libc)
C.stat
else if (Environment.isLinux)
linux.stat
else
@compileError("STAT");
-const fstatSym = if (Environment.isMac)
+const fstatSym = if (use_libc)
C.fstat
else if (Environment.isLinux)
linux.fstat
else
@compileError("STAT");
-const lstat64 = if (Environment.isMac)
+const lstat64 = if (use_libc)
C.lstat
else if (Environment.isLinux)
linux.lstat
diff --git a/src/bun.js/node/types.zig b/src/bun.js/node/types.zig
index 2e704037e..18d437d76 100644
--- a/src/bun.js/node/types.zig
+++ b/src/bun.js/node/types.zig
@@ -797,7 +797,7 @@ pub const FileSystemFlags = enum(Mode) {
}
};
-/// Milliseconds precision
+/// Milliseconds precision
pub const Date = enum(u64) {
_,
@@ -818,12 +818,27 @@ fn StatsLike(comptime name: [:0]const u8, comptime T: type) type {
This,
.{ .name = name },
.{
- .isFile = .{
- .rfn = JSC.wrap(This, "isFile", false),
+ .isBlockDevice = .{
+ .rfn = JSC.wrap(This, "isBlockDevice", false),
+ },
+ .isCharacterDevice = .{
+ .rfn = JSC.wrap(This, "isCharacterDevice", false),
},
.isDirectory = .{
.rfn = JSC.wrap(This, "isDirectory", false),
},
+ .isFIFO = .{
+ .rfn = JSC.wrap(This, "isFIFO", false),
+ },
+ .isFile = .{
+ .rfn = JSC.wrap(This, "isFile", false),
+ },
+ .isSocket = .{
+ .rfn = JSC.wrap(This, "isSocket", false),
+ },
+ .isSymbolicLink = .{
+ .rfn = JSC.wrap(This, "isSymbolicLink", false),
+ },
.finalize = finalize,
},
.{
@@ -957,13 +972,39 @@ fn StatsLike(comptime name: [:0]const u8, comptime T: type) type {
};
}
- pub fn isFile(this: *Stats) JSC.JSValue {
- return JSC.JSValue.jsBoolean(os.S.ISREG(@intCast(Mode, this.mode)));
+ pub fn isBlockDevice(this: *Stats) JSC.JSValue {
+ return JSC.JSValue.jsBoolean(os.S.ISBLK(@intCast(Mode, this.mode)));
+ }
+
+ pub fn isCharacterDevice(this: *Stats) JSC.JSValue {
+ return JSC.JSValue.jsBoolean(os.S.ISCHR(@intCast(Mode, this.mode)));
}
+
pub fn isDirectory(this: *Stats) JSC.JSValue {
return JSC.JSValue.jsBoolean(os.S.ISDIR(@intCast(Mode, this.mode)));
}
+ pub fn isFIFO(this: *Stats) JSC.JSValue {
+ return JSC.JSValue.jsBoolean(os.S.ISFIFO(@intCast(Mode, this.mode)));
+ }
+
+ pub fn isFile(this: *Stats) JSC.JSValue {
+ return JSC.JSValue.jsBoolean(os.S.ISREG(@intCast(Mode, this.mode)));
+ }
+
+ pub fn isSocket(this: *Stats) JSC.JSValue {
+ return JSC.JSValue.jsBoolean(os.S.ISSOCK(@intCast(Mode, this.mode)));
+ }
+
+ // Node.js says this method is only valid on the result of lstat()
+ // so it's fine if we just include it on stat() because it would
+ // still just return false.
+ //
+ // See https://nodejs.org/api/fs.html#statsissymboliclink
+ pub fn isSymbolicLink(this: *Stats) JSC.JSValue {
+ return JSC.JSValue.jsBoolean(os.S.ISLNK(@intCast(Mode, this.mode)));
+ }
+
pub fn toJS(this: Stats, ctx: JSC.C.JSContextRef, _: JSC.C.ExceptionRef) JSC.C.JSValueRef {
var _this = bun.default_allocator.create(Stats) catch unreachable;
_this.* = this;
diff --git a/src/cli.zig b/src/cli.zig
index 7bdf75dbb..e849d258f 100644
--- a/src/cli.zig
+++ b/src/cli.zig
@@ -55,7 +55,7 @@ const UpgradeCommand = @import("./cli/upgrade_command.zig").UpgradeCommand;
const MacroMap = @import("./resolver/package_json.zig").MacroMap;
const Reporter = @import("./report.zig");
-var start_time: i128 = undefined;
+pub var start_time: i128 = undefined;
const Bunfig = @import("./bunfig.zig").Bunfig;
pub const Cli = struct {
diff --git a/src/cli/upgrade_command.zig b/src/cli/upgrade_command.zig
index a64985bbb..fd101d775 100644
--- a/src/cli/upgrade_command.zig
+++ b/src/cli/upgrade_command.zig
@@ -56,17 +56,35 @@ pub const Version = struct {
size: u32 = 0,
pub fn name(this: Version) ?string {
- if (this.tag.len > "bun-v".len and strings.eqlComptime(this.tag[0.."bun-v".len], "bun-v")) {
- return this.tag[("bun-v".len)..];
- } else {
- return null;
+ if (this.tag.len <= "bun-v".len or !strings.hasPrefixComptime(this.tag, "bun-v")) {
+ if (strings.eqlComptime(this.tag, "canary")) {
+ const Cli = @import("../cli.zig");
+
+ return std.fmt.allocPrint(
+ bun.default_allocator,
+ "bun-canary-timestamp-{any}",
+ .{
+ std.fmt.fmtSliceHexLower(
+ std.mem.asBytes(
+ &bun.hash(
+ std.mem.asBytes(&Cli.start_time),
+ ),
+ ),
+ ),
+ },
+ ) catch unreachable;
+ }
+ return this.tag;
}
+
+ return this.tag["bun-v".len..];
}
pub const platform_label = if (Environment.isMac) "darwin" else "linux";
pub const arch_label = if (Environment.isAarch64) "aarch64" else "x64";
pub const triplet = platform_label ++ "-" ++ arch_label;
- pub const folder_name = "bun-" ++ triplet;
+ const suffix = if (Environment.baseline) "-baseline" else "";
+ pub const folder_name = "bun-" ++ triplet ++ suffix;
pub const zip_filename = folder_name ++ ".zip";
const current_version: string = "bun-v" ++ Global.package_json_version;
@@ -79,7 +97,10 @@ pub const Version = struct {
pub const UpgradeCheckerThread = struct {
var update_checker_thread: std.Thread = undefined;
pub fn spawn(env_loader: *DotEnv.Loader) void {
- if (env_loader.map.get("BUN_DISABLE_UPGRADE_CHECK") != null or env_loader.map.get("CI") != null) return;
+ if (env_loader.map.get("BUN_DISABLE_UPGRADE_CHECK") != null or
+ env_loader.map.get("CI") != null or
+ strings.eqlComptime(env_loader.get("BUN_CANARY") orelse "0", "1"))
+ return;
update_checker_thread = std.Thread.spawn(.{}, run, .{env_loader}) catch return;
update_checker_thread.detach();
}
@@ -352,12 +373,14 @@ pub const UpgradeCommand = struct {
break :brk DotEnv.Loader.init(map, ctx.allocator);
};
-
env_loader.loadProcess();
var version: Version = undefined;
+ const use_canary = strings.eqlComptime(env_loader.map.get("BUN_CANARY") orelse "0", "1") or
+ // TODO: add separate args just for "bun upgrade"?
+ strings.containsAny(bun.span(std.os.argv), "--canary");
- {
+ if (!use_canary) {
var refresher = std.Progress{};
var progress = refresher.start("Fetching version tags", 0);
@@ -383,12 +406,19 @@ pub const UpgradeCommand = struct {
);
Global.exit(1);
}
- }
- {
Output.prettyErrorln("<r><b>bun <cyan>v{s}<r> is out<r>! You're on <blue>{s}<r>\n", .{ version.name().?, Global.package_json_version });
Output.flush();
+ } else {
+ version = Version{
+ .tag = "canary",
+ .zip_url = "https://github.com/oven-sh/bun/releases/download/canary/" ++ Version.zip_filename,
+ .size = 0,
+ .buf = MutableString.initEmpty(bun.default_allocator),
+ };
+ }
+ {
var refresher = std.Progress{};
var progress = refresher.start("Downloading", version.size);
refresher.refresh();
@@ -412,7 +442,22 @@ pub const UpgradeCommand = struct {
const response = try async_http.sendSync(true);
switch (response.status_code) {
- 404 => return error.HTTP404,
+ 404 => {
+ if (use_canary) {
+ Output.prettyErrorln(
+ \\<r><red>error:<r> Canary builds are not available for this platform yet
+ \\
+ \\ Release: <cyan>https://github.com/oven-sh/bun/releases/tag/canary<r>
+ \\ Filename: <b>{s}<r>
+ \\
+ , .{
+ Version.zip_filename,
+ });
+ Global.exit(1);
+ }
+
+ return error.HTTP404;
+ },
403 => return error.HTTPForbidden,
429 => return error.HTTPTooManyRequests,
499...599 => return error.GitHubIsDown,
@@ -502,7 +547,6 @@ pub const UpgradeCommand = struct {
Global.exit(1);
}
}
-
{
var verify_argv = [_]string{
exe_subpath,
@@ -526,17 +570,21 @@ pub const UpgradeCommand = struct {
Global.exit(1);
}
- if (!strings.eql(std.mem.trim(u8, result.stdout, " \n\r\t"), version_name)) {
- save_dir_.deleteTree(version_name) catch {};
-
- Output.prettyErrorln(
- "<r><red>error<r>: The downloaded version of bun (<red>{s}<r>) doesn't match the expected version (<b>{s}<r>)<r>. Cancelled upgrade",
- .{
- result.stdout[0..@minimum(result.stdout.len, 128)],
- version_name,
- },
- );
- Global.exit(1);
+ // It should run successfully
+ // but we don't care about the version number if we're doing a canary build
+ if (!use_canary) {
+ if (!strings.eql(std.mem.trim(u8, result.stdout, " \n\r\t"), version_name)) {
+ save_dir_.deleteTree(version_name) catch {};
+
+ Output.prettyErrorln(
+ "<r><red>error<r>: The downloaded version of bun (<red>{s}<r>) doesn't match the expected version (<b>{s}<r>)<r>. Cancelled upgrade",
+ .{
+ result.stdout[0..@minimum(result.stdout.len, 128)],
+ version_name,
+ },
+ );
+ Global.exit(1);
+ }
}
}
@@ -555,6 +603,47 @@ pub const UpgradeCommand = struct {
Global.exit(1);
};
+ if (use_canary) {
+
+ // Check if the versions are the same
+ const target_stat = target_dir.statFile(target_filename) catch |err| {
+ save_dir_.deleteTree(version_name) catch {};
+ Output.prettyErrorln("<r><red>error:<r> Failed to stat target bun {s}", .{@errorName(err)});
+ Global.exit(1);
+ };
+
+ const dest_stat = save_dir.statFile(exe_subpath) catch |err| {
+ save_dir_.deleteTree(version_name) catch {};
+ Output.prettyErrorln("<r><red>error:<r> Failed to stat source bun {s}", .{@errorName(err)});
+ Global.exit(1);
+ };
+
+ if (target_stat.size == dest_stat.size and target_stat.size > 0) {
+ var input_buf = try ctx.allocator.alloc(u8, target_stat.size);
+
+ const target_hash = std.hash.Wyhash.hash(0, target_dir.readFile(target_filename, input_buf) catch |err| {
+ save_dir_.deleteTree(version_name) catch {};
+ Output.prettyErrorln("<r><red>error:<r> Failed to read target bun {s}", .{@errorName(err)});
+ Global.exit(1);
+ });
+
+ const source_hash = std.hash.Wyhash.hash(0, save_dir.readFile(exe_subpath, input_buf) catch |err| {
+ save_dir_.deleteTree(version_name) catch {};
+ Output.prettyErrorln("<r><red>error:<r> Failed to read source bun {s}", .{@errorName(err)});
+ Global.exit(1);
+ });
+
+ if (target_hash == source_hash) {
+ save_dir_.deleteTree(version_name) catch {};
+ Output.prettyErrorln(
+ "<r><green>Congrats!<r> You're already on the latest canary build of bun",
+ .{},
+ );
+ Global.exit(0);
+ }
+ }
+ }
+
if (env_loader.map.get("BUN_DRY_RUN") == null) {
C.moveFileZ(save_dir.fd, exe_subpath, target_dir.fd, target_filename) catch |err| {
save_dir_.deleteTree(version_name) catch {};
@@ -583,7 +672,42 @@ pub const UpgradeCommand = struct {
Output.printStartEnd(ctx.start_time, std.time.nanoTimestamp());
- Output.prettyErrorln("<r> Upgraded.\n\n<b><green>Welcome to bun v{s}!<r>\n\n Report any bugs:\n https://github.com/oven-sh/bun/issues\n\n What's new:\n https://github.com/oven-sh/bun/releases/tag/{s}<r>", .{ version_name, version.tag });
+ if (use_canary) {
+ Output.prettyErrorln(
+ \\<r> Upgraded.
+ \\
+ \\<b><green>Welcome to bun's latest canary build!<r>
+ \\
+ \\Report any bugs:
+ \\
+ \\ https://github.com/oven-sh/bun/issues
+ \\
+ \\What's new:
+ \\
+ \\ <cyan>https://github.com/oven-sh/bun/releases/tag/{s}<r>
+ \\
+ ,
+ .{version.tag},
+ );
+ } else {
+ Output.prettyErrorln(
+ \\<r> Upgraded.
+ \\
+ \\<b><green>Welcome to bun v{s}!<r>
+ \\
+ \\Report any bugs:
+ \\
+ \\ https://github.com/oven-sh/bun/issues
+ \\
+ \\What's new:
+ \\
+ \\ <cyan>https://github.com/oven-sh/bun/releases/tag/{s}<r>
+ \\
+ ,
+ .{ version_name, version.tag },
+ );
+ }
+
Output.flush();
return;
}
diff --git a/src/env.zig b/src/env.zig
index 0e4cbc414..aa0a6de86 100644
--- a/src/env.zig
+++ b/src/env.zig
@@ -25,4 +25,4 @@ pub const isX86 = @import("builtin").target.cpu.arch.isX86();
pub const isX64 = @import("builtin").target.cpu.arch == .x86_64;
pub const allow_assert = isDebug or isTest;
pub const analytics_url = if (isDebug) "http://localhost:4000/events" else "http://i.bun.sh/events";
-pub const simd = isX86 or isAarch64;
+pub const baseline = @import("build_options").baseline;
diff --git a/src/http.zig b/src/http.zig
index 1515f976f..605bd1840 100644
--- a/src/http.zig
+++ b/src/http.zig
@@ -1881,9 +1881,9 @@ pub const RequestContext = struct {
var reloader = Api.Reloader.disable;
if (ctx.bundler.options.hot_module_reloading) {
reloader = Api.Reloader.live;
- // if (ctx.bundler.options.jsx.supports_fast_refresh) {
- // reloader = Api.Reloader.fast_refresh;
- // }
+ if (ctx.bundler.options.jsx.supports_fast_refresh and ctx.bundler.env.get("BUN_FORCE_HMR") != null) {
+ reloader = Api.Reloader.fast_refresh;
+ }
}
const welcome_message = Api.WebsocketMessageWelcome{
diff --git a/src/http_client_async.zig b/src/http_client_async.zig
index 2da75b652..7b376c986 100644
--- a/src/http_client_async.zig
+++ b/src/http_client_async.zig
@@ -56,6 +56,8 @@ pub fn onThreadStart(_: ?*anyopaque) ?*anyopaque {
\\ <cyan>wsl --update<r>
\\ <cyan>wsl --shutdown<r>
\\
+ \\ Please make sure you're using WSL version 2 (not WSL 1).
+ \\
\\If that doesn't work (and you're on a Windows machine), try this:
\\ 1. Open Windows Update
\\ 2. Download any updates to Windows Subsystem for Linux
diff --git a/src/install/install.zig b/src/install/install.zig
index 8ae032022..7373cf90d 100644
--- a/src/install/install.zig
+++ b/src/install/install.zig
@@ -199,7 +199,61 @@ const NetworkTask = struct {
scope: *const Npm.Registry.Scope,
loaded_manifest: ?Npm.PackageManifest,
) !void {
- this.url_buf = try std.fmt.allocPrint(allocator, "{s}://{s}/{s}/{s}", .{ scope.url.displayProtocol(), scope.url.displayHostname(), strings.trim(scope.url.path, "/"), name });
+ const pathname: string = if (!strings.eqlComptime(scope.url.pathname, "/"))
+ scope.url.pathname
+ else
+ @as(string, "");
+
+ if (pathname.len > 0) {
+ if (scope.url.getPort()) |port_number| {
+ this.url_buf = try std.fmt.allocPrint(
+ allocator,
+ "{s}://{s}:{d}/{s}/{s}",
+ .{
+ scope.url.displayProtocol(),
+ scope.url.displayHostname(),
+ port_number,
+ pathname,
+ name,
+ },
+ );
+ } else {
+ this.url_buf = try std.fmt.allocPrint(
+ allocator,
+ "{s}://{s}/{s}/{s}",
+ .{
+ scope.url.displayProtocol(),
+ scope.url.displayHostname(),
+ pathname,
+ name,
+ },
+ );
+ }
+ } else {
+ if (scope.url.getPort()) |port_number| {
+ this.url_buf = try std.fmt.allocPrint(
+ allocator,
+ "{s}://{s}:{d}/{s}",
+ .{
+ scope.url.displayProtocol(),
+ scope.url.displayHostname(),
+ port_number,
+ name,
+ },
+ );
+ } else {
+ this.url_buf = try std.fmt.allocPrint(
+ allocator,
+ "{s}://{s}/{s}",
+ .{
+ scope.url.displayProtocol(),
+ scope.url.displayHostname(),
+ name,
+ },
+ );
+ }
+ }
+
var last_modified: string = "";
var etag: string = "";
if (loaded_manifest) |manifest| {
diff --git a/src/runtime.footer.bun.js b/src/runtime.footer.bun.js
index 72a2703e9..a5466f53a 100644
--- a/src/runtime.footer.bun.js
+++ b/src/runtime.footer.bun.js
@@ -22,5 +22,6 @@ export var __require = (globalThis.require ||= function (moduleId) {
return BUN_RUNTIME.__require(moduleId);
});
+__require.d ||= BUN_RUNTIME.__require.d;
globalThis.__internalIsCommonJSNamespace ||=
BUN_RUNTIME.__internalIsCommonJSNamespace;
diff --git a/src/string_immutable.zig b/src/string_immutable.zig
index ec3a2ecbe..801eacd51 100644
--- a/src/string_immutable.zig
+++ b/src/string_immutable.zig
@@ -78,7 +78,7 @@ pub inline fn containsComptime(self: string, comptime str: string) bool {
pub const includes = contains;
pub inline fn containsAny(in: anytype, target: string) bool {
- for (in) |str| if (contains(str, target)) return true;
+ for (in) |str| if (contains(bun.span(str), target)) return true;
return false;
}
diff --git a/test/apps/bun-dev-index-html.sh b/test/apps/bun-dev-index-html.sh
index 14db88113..f22f8df51 100644
--- a/test/apps/bun-dev-index-html.sh
+++ b/test/apps/bun-dev-index-html.sh
@@ -4,7 +4,7 @@ set -euo pipefail
killall -9 $(basename $BUN_BIN) || echo ""
-dir=$(mktemp -d --suffix=bun-dev-check)
+dir=$(mktemp -d)
index_content="<html><body>index.html</body></html>"
bacon_content="<html><body>bacon.html</body></html>"
diff --git a/test/apps/bun-dev.sh b/test/apps/bun-dev.sh
index 76db4c71d..ea15c1d21 100644
--- a/test/apps/bun-dev.sh
+++ b/test/apps/bun-dev.sh
@@ -4,7 +4,7 @@ set -euo pipefail
killall -9 $(basename $BUN_BIN) || echo ""
-dir=$(mktemp -d --suffix=bun-dev-check)
+dir=$(mktemp -d)
index_content="<html><body>index.html</body></html>"
bacon_content="<html><body>bacon.html</body></html>"
diff --git a/test/apps/bun-install-lockfile-status.sh b/test/apps/bun-install-lockfile-status.sh
index 96b39a09e..fc39a6dd6 100644
--- a/test/apps/bun-install-lockfile-status.sh
+++ b/test/apps/bun-install-lockfile-status.sh
@@ -4,7 +4,7 @@ set -euo pipefail
killall -9 $(basename $BUN_BIN) || echo ""
-dir=$(mktemp -d --suffix=bun-lockfile)
+dir=$(mktemp -d)
cd $dir
diff --git a/test/apps/bun-install-utf8.sh b/test/apps/bun-install-utf8.sh
index 28e644708..14976bac7 100644
--- a/test/apps/bun-install-utf8.sh
+++ b/test/apps/bun-install-utf8.sh
@@ -4,7 +4,7 @@ set -euo pipefail
killall -9 $(basename $BUN_BIN) || echo ""
-dir=$(mktemp -d --suffix=bun-ADD)
+dir=$(mktemp -d)
cd $dir
diff --git a/test/apps/bun-install.sh b/test/apps/bun-install.sh
index 6ca07c20f..af13f6fc3 100644
--- a/test/apps/bun-install.sh
+++ b/test/apps/bun-install.sh
@@ -2,7 +2,7 @@
set -euo pipefail
-dir=$(mktemp -d --suffix=bun-install-test-1)
+dir=$(mktemp -d)
cd $dir
${NPM_CLIENT:-$(which bun)} add react react-dom @types/react @babel/parser esbuild
diff --git a/test/bun.js/fs-stream.link.js b/test/bun.js/fs-stream.link.js
new file mode 120000
index 000000000..0cadae0e5
--- /dev/null
+++ b/test/bun.js/fs-stream.link.js
@@ -0,0 +1 @@
+./test/bun.js/fs-stream.js \ No newline at end of file
diff --git a/test/bun.js/fs.test.js b/test/bun.js/fs.test.js
index 79ac60eaa..d3c6be901 100644
--- a/test/bun.js/fs.test.js
+++ b/test/bun.js/fs.test.js
@@ -11,6 +11,8 @@ import {
readSync,
writeFileSync,
writeSync,
+ statSync,
+ lstatSync,
} from "node:fs";
const Buffer = globalThis.Buffer || Uint8Array;
@@ -242,3 +244,62 @@ describe("writeFileSync", () => {
}
});
});
+
+describe("lstat", () => {
+ it("file metadata is correct", () => {
+ const fileStats = lstatSync(
+ new URL("./fs-stream.js", import.meta.url)
+ .toString()
+ .slice("file://".length - 1)
+ );
+ expect(fileStats.isSymbolicLink()).toBe(false);
+ expect(fileStats.isFile()).toBe(true);
+ expect(fileStats.isDirectory()).toBe(false);
+ });
+
+ it("folder metadata is correct", () => {
+ const fileStats = lstatSync(
+ new URL("../../test", import.meta.url)
+ .toString()
+ .slice("file://".length - 1)
+ );
+ expect(fileStats.isSymbolicLink()).toBe(false);
+ expect(fileStats.isFile()).toBe(false);
+ expect(fileStats.isDirectory()).toBe(true);
+ });
+
+ it("symlink metadata is correct", () => {
+ const linkStats = lstatSync(
+ new URL("./fs-stream.link.js", import.meta.url)
+ .toString()
+ .slice("file://".length - 1)
+ );
+ expect(linkStats.isSymbolicLink()).toBe(true);
+ expect(linkStats.isFile()).toBe(false);
+ expect(linkStats.isDirectory()).toBe(false);
+ });
+});
+
+describe("stat", () => {
+ it("file metadata is correct", () => {
+ const fileStats = statSync(
+ new URL("./fs-stream.js", import.meta.url)
+ .toString()
+ .slice("file://".length - 1)
+ );
+ expect(fileStats.isSymbolicLink()).toBe(false);
+ expect(fileStats.isFile()).toBe(true);
+ expect(fileStats.isDirectory()).toBe(false);
+ });
+
+ it("folder metadata is correct", () => {
+ const fileStats = statSync(
+ new URL("../../test", import.meta.url)
+ .toString()
+ .slice("file://".length - 1)
+ );
+ expect(fileStats.isSymbolicLink()).toBe(false);
+ expect(fileStats.isFile()).toBe(false);
+ expect(fileStats.isDirectory()).toBe(true);
+ });
+});
diff --git a/test/bun.js/snapshots.debug.js b/test/bun.js/snapshots.debug.js
new file mode 100644
index 000000000..d4c345677
--- /dev/null
+++ b/test/bun.js/snapshots.debug.js
@@ -0,0 +1,10 @@
+
+// test/bun.js/module-require.snapshot.js
+import {
+__require as require
+} from "bun:wrap";
+console.log(import.meta.require("/Users/jarred/Code/bun/node_modules/react/index.js"));
+
+// test/bun.js/require-referenceerror.snapshot.js
+
+// test/bun.js/tiny-typed-emitter.snapshot.js
diff --git a/test/bun.js/snapshots.js b/test/bun.js/snapshots.js
new file mode 100644
index 000000000..d4c345677
--- /dev/null
+++ b/test/bun.js/snapshots.js
@@ -0,0 +1,10 @@
+
+// test/bun.js/module-require.snapshot.js
+import {
+__require as require
+} from "bun:wrap";
+console.log(import.meta.require("/Users/jarred/Code/bun/node_modules/react/index.js"));
+
+// test/bun.js/require-referenceerror.snapshot.js
+
+// test/bun.js/tiny-typed-emitter.snapshot.js