diff options
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 @@ -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: @@ -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 & 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 @@ -1 +1 @@ -4 +5 @@ -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 |
