diff --git a/.buildkite/Dockerfile b/.buildkite/Dockerfile new file mode 100644 index 0000000000..2ace3c0f50 --- /dev/null +++ b/.buildkite/Dockerfile @@ -0,0 +1,170 @@ +ARG LLVM_VERSION="18" +ARG REPORTED_LLVM_VERSION="18.1.8" +ARG OLD_BUN_VERSION="1.1.38" +ARG DEFAULT_CFLAGS="-mno-omit-leaf-frame-pointer -fno-omit-frame-pointer -ffunction-sections -fdata-sections -faddrsig -fno-unwind-tables -fno-asynchronous-unwind-tables" +ARG DEFAULT_CXXFLAGS="-flto=full -fwhole-program-vtables -fforce-emit-vtables" +ARG BUILDKITE_AGENT_TAGS="queue=linux,os=linux,arch=${TARGETARCH}" + +FROM --platform=$BUILDPLATFORM ubuntu:20.04 as base-arm64 +FROM --platform=$BUILDPLATFORM ubuntu:18.04 as base-amd64 +FROM base-$TARGETARCH as base + +ARG LLVM_VERSION +ARG OLD_BUN_VERSION +ARG TARGETARCH +ARG DEFAULT_CXXFLAGS +ARG DEFAULT_CFLAGS +ARG REPORTED_LLVM_VERSION + +ENV DEBIAN_FRONTEND=noninteractive \ + CI=true \ + DOCKER=true + +RUN echo "Acquire::Queue-Mode \"host\";" > /etc/apt/apt.conf.d/99-apt-queue-mode.conf \ + && echo "Acquire::Timeout \"120\";" >> /etc/apt/apt.conf.d/99-apt-timeout.conf \ + && echo "Acquire::Retries \"3\";" >> /etc/apt/apt.conf.d/99-apt-retries.conf \ + && echo "APT::Install-Recommends \"false\";" >> /etc/apt/apt.conf.d/99-apt-install-recommends.conf \ + && echo "APT::Install-Suggests \"false\";" >> /etc/apt/apt.conf.d/99-apt-install-suggests.conf + +RUN apt-get update && apt-get install -y --no-install-recommends \ + wget curl git python3 python3-pip ninja-build \ + software-properties-common apt-transport-https \ + ca-certificates gnupg lsb-release unzip \ + libxml2-dev ruby ruby-dev bison gawk perl make golang \ + && add-apt-repository ppa:ubuntu-toolchain-r/test \ + && apt-get update \ + && apt-get install -y gcc-13 g++-13 libgcc-13-dev libstdc++-13-dev \ + libasan6 libubsan1 libatomic1 libtsan0 liblsan0 \ + libgfortran5 libc6-dev \ + && wget https://apt.llvm.org/llvm.sh \ + && chmod +x llvm.sh \ + && ./llvm.sh ${LLVM_VERSION} all \ + && rm llvm.sh + + +RUN --mount=type=tmpfs,target=/tmp \ + cmake_version="3.30.5" && \ + if [ "$TARGETARCH" = "arm64" ]; then \ + cmake_url="https://github.com/Kitware/CMake/releases/download/v${cmake_version}/cmake-${cmake_version}-linux-aarch64.sh"; \ + else \ + cmake_url="https://github.com/Kitware/CMake/releases/download/v${cmake_version}/cmake-${cmake_version}-linux-x86_64.sh"; \ + fi && \ + wget -O /tmp/cmake.sh "$cmake_url" && \ + sh /tmp/cmake.sh --skip-license --prefix=/usr + +RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 130 \ + --slave /usr/bin/g++ g++ /usr/bin/g++-13 \ + --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-13 \ + --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-13 \ + --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-13 + +RUN echo "ARCH_PATH=$([ "$TARGETARCH" = "arm64" ] && echo "aarch64-linux-gnu" || echo "x86_64-linux-gnu")" >> /etc/environment \ + && echo "BUN_ARCH=$([ "$TARGETARCH" = "arm64" ] && echo "aarch64" || echo "x64")" >> /etc/environment + +ENV LD_LIBRARY_PATH=/usr/lib/gcc/${ARCH_PATH}/13:/usr/lib/${ARCH_PATH} \ + LIBRARY_PATH=/usr/lib/gcc/${ARCH_PATH}/13:/usr/lib/${ARCH_PATH} \ + CPLUS_INCLUDE_PATH=/usr/include/c++/13:/usr/include/${ARCH_PATH}/c++/13 \ + C_INCLUDE_PATH=/usr/lib/gcc/${ARCH_PATH}/13/include \ + CFLAGS=${DEFAULT_CFLAGS} \ + CXXFLAGS="${DEFAULT_CFLAGS} ${DEFAULT_CXXFLAGS}" + +RUN if [ "$TARGETARCH" = "arm64" ]; then \ + export ARCH_PATH="aarch64-linux-gnu"; \ + else \ + export ARCH_PATH="x86_64-linux-gnu"; \ + fi \ + && mkdir -p /usr/lib/gcc/${ARCH_PATH}/13 \ + && ln -sf /usr/lib/${ARCH_PATH}/libstdc++.so.6 /usr/lib/gcc/${ARCH_PATH}/13/ \ + && echo "/usr/lib/gcc/${ARCH_PATH}/13" > /etc/ld.so.conf.d/gcc-13.conf \ + && echo "/usr/lib/${ARCH_PATH}" >> /etc/ld.so.conf.d/gcc-13.conf \ + && ldconfig + +RUN for f in /usr/lib/llvm-${LLVM_VERSION}/bin/*; do ln -sf "$f" /usr/bin; done \ + && ln -sf /usr/bin/clang-${LLVM_VERSION} /usr/bin/clang \ + && ln -sf /usr/bin/clang++-${LLVM_VERSION} /usr/bin/clang++ \ + && ln -sf /usr/bin/lld-${LLVM_VERSION} /usr/bin/lld \ + && ln -sf /usr/bin/lldb-${LLVM_VERSION} /usr/bin/lldb \ + && ln -sf /usr/bin/clangd-${LLVM_VERSION} /usr/bin/clangd \ + && ln -sf /usr/bin/llvm-ar-${LLVM_VERSION} /usr/bin/llvm-ar \ + && ln -sf /usr/bin/ld.lld /usr/bin/ld \ + && ln -sf /usr/bin/clang /usr/bin/cc \ + && ln -sf /usr/bin/clang++ /usr/bin/c++ + +ENV CC="clang" \ + CXX="clang++" \ + AR="llvm-ar-${LLVM_VERSION}" \ + RANLIB="llvm-ranlib-${LLVM_VERSION}" \ + LD="lld-${LLVM_VERSION}" + +RUN --mount=type=tmpfs,target=/tmp \ + bash -c '\ + set -euxo pipefail && \ + source /etc/environment && \ + echo "Downloading bun-v${OLD_BUN_VERSION}/bun-linux-$BUN_ARCH.zip from https://pub-5e11e972747a44bf9aaf9394f185a982.r2.dev/releases/bun-v${OLD_BUN_VERSION}/bun-linux-$BUN_ARCH.zip" && \ + curl -fsSL https://pub-5e11e972747a44bf9aaf9394f185a982.r2.dev/releases/bun-v${OLD_BUN_VERSION}/bun-linux-$BUN_ARCH.zip -o /tmp/bun.zip && \ + unzip /tmp/bun.zip -d /tmp/bun && \ + mv /tmp/bun/*/bun /usr/bin/bun && \ + chmod +x /usr/bin/bun' + +ENV LLVM_VERSION=${REPORTED_LLVM_VERSION} + +WORKDIR /workspace + + +FROM --platform=$BUILDPLATFORM base as buildkite +ARG BUILDKITE_AGENT_TAGS + + +# Install Rust nightly +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \ + && export PATH=$HOME/.cargo/bin:$PATH \ + && rustup install nightly \ + && rustup default nightly + + +RUN ARCH=$(if [ "$TARGETARCH" = "arm64" ]; then echo "arm64"; else echo "amd64"; fi) && \ + echo "Downloading buildkite" && \ + curl -fsSL "https://github.com/buildkite/agent/releases/download/v3.87.0/buildkite-agent-linux-${ARCH}-3.87.0.tar.gz" -o /tmp/buildkite-agent.tar.gz && \ + mkdir -p /tmp/buildkite-agent && \ + tar -xzf /tmp/buildkite-agent.tar.gz -C /tmp/buildkite-agent && \ + mv /tmp/buildkite-agent/buildkite-agent /usr/bin/buildkite-agent + +RUN mkdir -p /var/cache/buildkite-agent /var/log/buildkite-agent /var/run/buildkite-agent /etc/buildkite-agent /var/lib/buildkite-agent/cache/bun + +COPY ../*/agent.mjs /var/bun/scripts/ + +ENV BUN_INSTALL_CACHE=/var/lib/buildkite-agent/cache/bun +ENV BUILDKITE_AGENT_TAGS=${BUILDKITE_AGENT_TAGS} + + +WORKDIR /var/bun/scripts + +ENV PATH=/root/.cargo/bin:$PATH + + +CMD ["bun", "/var/bun/scripts/agent.mjs", "start"] + +FROM --platform=$BUILDPLATFORM base as bun-build-linux-local + +ARG LLVM_VERSION +WORKDIR /workspace/bun + +COPY . /workspace/bun + + +# Install Rust nightly +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \ + && export PATH=$HOME/.cargo/bin:$PATH \ + && rustup install nightly \ + && rustup default nightly + +ENV PATH=/root/.cargo/bin:$PATH + +ENV LLVM_VERSION=${REPORTED_LLVM_VERSION} + + +RUN --mount=type=tmpfs,target=/workspace/bun/build \ + ls -la \ + && bun run build:release \ + && mkdir -p /target \ + && cp -r /workspace/bun/build/release/bun /target/bun \ No newline at end of file diff --git a/.buildkite/Dockerfile-bootstrap.sh b/.buildkite/Dockerfile-bootstrap.sh new file mode 100644 index 0000000000..b8ccba7d17 --- /dev/null +++ b/.buildkite/Dockerfile-bootstrap.sh @@ -0,0 +1,122 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Check if running as root +if [ "$EUID" -ne 0 ]; then + echo "error: must run as root" + exit 1 +fi + +# Check OS compatibility +if ! command -v dnf &> /dev/null; then + echo "error: this script requires dnf (RHEL/Fedora/CentOS)" + exit 1 +fi + +# Ensure /tmp/agent.mjs, /tmp/Dockerfile are present +if [ ! -f /tmp/agent.mjs ] || [ ! -f /tmp/Dockerfile ]; then + # Print each missing file + if [ ! -f /tmp/agent.mjs ]; then + echo "error: /tmp/agent.mjs is missing" + fi + if [ ! -f /tmp/Dockerfile ]; then + echo "error: /tmp/Dockerfile is missing" + fi + exit 1 +fi + +# Install Docker +dnf update -y +dnf install -y docker + +systemctl enable docker +systemctl start docker || { + echo "error: failed to start Docker" + exit 1 +} + +# Create builder +docker buildx create --name builder --driver docker-container --bootstrap --use || { + echo "error: failed to create Docker buildx builder" + exit 1 +} + +# Set up Docker to start on boot +cat << 'EOF' > /etc/systemd/system/buildkite-agent.service +[Unit] +Description=Buildkite Docker Container +After=docker.service network-online.target +Requires=docker.service network-online.target + +[Service] +TimeoutStartSec=0 +Restart=always +RestartSec=5 +ExecStartPre=-/usr/bin/docker stop buildkite +ExecStartPre=-/usr/bin/docker rm buildkite +ExecStart=/usr/bin/docker run \ + --name buildkite \ + --restart=unless-stopped \ + --network host \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /tmp:/tmp \ + buildkite:latest + +[Install] +WantedBy=multi-user.target +EOF + +echo "Building Buildkite image" + +# Clean up any previous build artifacts +rm -rf /tmp/fakebun +mkdir -p /tmp/fakebun/scripts /tmp/fakebun/.buildkite + +# Copy required files +cp /tmp/agent.mjs /tmp/fakebun/scripts/ || { + echo "error: failed to copy agent.mjs" + exit 1 +} +cp /tmp/Dockerfile /tmp/fakebun/.buildkite/Dockerfile || { + echo "error: failed to copy Dockerfile" + exit 1 +} + +cd /tmp/fakebun || { + echo "error: failed to change directory" + exit 1 +} + +# Build the Buildkite image +docker buildx build \ + --platform $(uname -m | sed 's/aarch64/linux\/arm64/;s/x86_64/linux\/amd64/') \ + --tag buildkite:latest \ + --target buildkite \ + -f .buildkite/Dockerfile \ + --load \ + . || { + echo "error: Docker build failed" + exit 1 +} + +# Create container to ensure image is cached in AMI +docker container create \ + --name buildkite \ + --restart=unless-stopped \ + buildkite:latest || { + echo "error: failed to create buildkite container" + exit 1 +} + +# Reload systemd to pick up new service +systemctl daemon-reload + +# Enable the service, but don't start it yet +systemctl enable buildkite-agent || { + echo "error: failed to enable buildkite-agent service" + exit 1 +} + +echo "Bootstrap complete" +echo "To start the Buildkite agent, run: " +echo " systemctl start buildkite-agent" \ No newline at end of file diff --git a/.buildkite/bootstrap.yml b/.buildkite/bootstrap.yml index b0b84616b3..5a75106d5e 100644 --- a/.buildkite/bootstrap.yml +++ b/.buildkite/bootstrap.yml @@ -13,19 +13,4 @@ steps: agents: queue: "build-darwin" command: - - ".buildkite/scripts/prepare-build.sh" - - - if: "build.branch == 'main' && !build.pull_request.repository.fork" - label: ":github:" - agents: - queue: "test-darwin" - depends_on: - - "darwin-aarch64-build-bun" - - "darwin-x64-build-bun" - - "linux-aarch64-build-bun" - - "linux-x64-build-bun" - - "linux-x64-baseline-build-bun" - - "windows-x64-build-bun" - - "windows-x64-baseline-build-bun" - command: - - ".buildkite/scripts/upload-release.sh" + - "node .buildkite/ci.mjs" diff --git a/.buildkite/ci.md b/.buildkite/ci.md deleted file mode 100644 index 57dde54e69..0000000000 --- a/.buildkite/ci.md +++ /dev/null @@ -1,63 +0,0 @@ -## CI - -How does CI work? - -### Building - -Bun is built on macOS, Linux, and Windows. The process is split into the following steps, the first 3 of which are able to run in parallel: - -#### 1. `build-deps` - -Builds the static libaries in `src/deps` and outputs a directory: `build/bun-deps`. - -- on Windows, this runs the script: [`scripts/all-dependencies.ps1`](scripts/all-dependencies.ps1) -- on macOS and Linux, this runs the script: [`scripts/all-dependencies.sh`](scripts/all-dependencies.sh) - -#### 2. `build-zig` - -Builds the Zig object file: `build/bun-zig.o`. Since `zig build` supports cross-compiling, this step is run on macOS aarch64 since we have observed it to be the fastest. - -- on macOS and Linux, this runs the script: [`scripts/build-bun-zig.sh`](scripts/build-bun-zig.sh) - -#### 3. `build-cpp` - -Builds the C++ object file: `build/bun-cpp-objects.a`. - -- on Windows, this runs the script: [`scripts/build-bun-cpp.ps1`](scripts/build-bun-cpp.ps1) -- on macOS and Linux, this runs the script: [`scripts/build-bun-cpp.sh`](scripts/build-bun-cpp.sh) - -#### 4. `link` / `build-bun` - -After the `build-deps`, `build-zig`, and `build-cpp` steps have completed, this step links the Zig object file and C++ object file into a single binary: `bun--.zip`. - -- on Windows, this runs the script: [`scripts/buildkite-link-bun.ps1`](scripts/buildkite-link-bun.ps1) -- on macOS and Linux, this runs the script: [`scripts/buildkite-link-bun.sh`](scripts/buildkite-link-bun.sh) - -To speed up the build, thare are two options: - -- `--fast`: This disables the LTO (link-time optimization) step. -- without `--fast`: This runs the LTO step, which is the default. The binaries that are release to Github are always built with LTO. - -### Testing - -### FAQ - -> How do I add a new CI agent? - -> How do I add/modify system dependencies? - -> How do I SSH into a CI agent? - -### Known issues - -These are things that we know about, but haven't fixed or optimized yet. - -- There is no `scripts/build-bun-zig.ps1` for Windows. - -- The `build-deps` step does not cache in CI, so it re-builds each time (though it does use ccache). It attempts to check the `BUN_DEPS_CACHE_DIR` environment variable, but for some reason it doesn't work. - -- Windows and Linux machines sometimes take up to 1-2 minutes to start tests. This is because robobun is listening for when the job is scheduled to provision the VM. Instead, it can start provisioning during the link step, or keep a pool of idle VMs around (but it's unclear how more expensive this is). - -- There are a limited number of macOS VMs. This is because they are expensive and manually provisioned, mostly through MacStadium. If wait times are too long we can just provision more, or buy some. - -- To prevent idle machines, robobun periodically checks for idle machines and terminates them. Before doing this, it checks to see if the machine is connected as an agent to Buildkite. However, sometimes the machine picks up a job in-between this time, and the job is terminated. diff --git a/.buildkite/ci.mjs b/.buildkite/ci.mjs new file mode 100755 index 0000000000..b3b2f4ca4c --- /dev/null +++ b/.buildkite/ci.mjs @@ -0,0 +1,1183 @@ +#!/usr/bin/env node + +/** + * Build and test Bun on macOS, Linux, and Windows. + * @link https://buildkite.com/docs/pipelines/defining-steps + */ + +import { join } from "node:path"; +import { + getBootstrapVersion, + getBuildkiteEmoji, + getBuildMetadata, + getBuildNumber, + getCanaryRevision, + getCommitMessage, + getEmoji, + getEnv, + getLastSuccessfulBuild, + isBuildkite, + isBuildManual, + isFork, + isMainBranch, + isMergeQueue, + parseBoolean, + spawnSafe, + startGroup, + toYaml, + uploadArtifact, + writeFile, +} from "../scripts/utils.mjs"; + +/** + * @typedef {"linux" | "darwin" | "windows"} Os + * @typedef {"aarch64" | "x64"} Arch + * @typedef {"musl"} Abi + * @typedef {"debian" | "ubuntu" | "alpine" | "amazonlinux"} Distro + * @typedef {"latest" | "previous" | "oldest" | "eol"} Tier + * @typedef {"release" | "assert" | "debug"} Profile + */ + +/** + * @typedef Target + * @property {Os} os + * @property {Arch} arch + * @property {Abi} [abi] + * @property {boolean} [baseline] + * @property {Profile} [profile] + */ + +/** + * @param {Target} target + * @returns {string} + */ +function getTargetKey(target) { + const { os, arch, abi, baseline, profile } = target; + let key = `${os}-${arch}`; + if (abi) { + key += `-${abi}`; + } + if (baseline) { + key += "-baseline"; + } + if (profile && profile !== "release") { + key += `-${profile}`; + } + return key; +} + +/** + * @param {Target} target + * @returns {string} + */ +function getTargetLabel(target) { + const { os, arch, abi, baseline, profile } = target; + let label = `${getBuildkiteEmoji(os)} ${arch}`; + if (abi) { + label += `-${abi}`; + } + if (baseline) { + label += "-baseline"; + } + if (profile && profile !== "release") { + label += `-${profile}`; + } + return label; +} + +/** + * @typedef Platform + * @property {Os} os + * @property {Arch} arch + * @property {Abi} [abi] + * @property {boolean} [baseline] + * @property {Profile} [profile] + * @property {Distro} [distro] + * @property {string} release + * @property {Tier} [tier] + * @property {string[]} [features] + */ + +/** + * @type {Platform[]} + */ +const buildPlatforms = [ + { os: "darwin", arch: "aarch64", release: "14" }, + { os: "darwin", arch: "x64", release: "14" }, + { os: "linux", arch: "aarch64", distro: "amazonlinux", release: "2023", features: ["docker"] }, + { os: "linux", arch: "x64", distro: "amazonlinux", release: "2023", features: ["docker"] }, + { os: "linux", arch: "x64", baseline: true, distro: "amazonlinux", release: "2023", features: ["docker"] }, + { os: "linux", arch: "aarch64", abi: "musl", distro: "alpine", release: "3.20" }, + { os: "linux", arch: "x64", abi: "musl", distro: "alpine", release: "3.20" }, + { os: "linux", arch: "x64", abi: "musl", baseline: true, distro: "alpine", release: "3.20" }, + { os: "windows", arch: "x64", release: "2019" }, + { os: "windows", arch: "x64", baseline: true, release: "2019" }, +]; + +/** + * @type {Platform[]} + */ +const testPlatforms = [ + { os: "darwin", arch: "aarch64", release: "14", tier: "latest" }, + { os: "darwin", arch: "aarch64", release: "13", tier: "previous" }, + { os: "darwin", arch: "x64", release: "14", tier: "latest" }, + { os: "darwin", arch: "x64", release: "13", tier: "previous" }, + { os: "linux", arch: "aarch64", distro: "debian", release: "12", tier: "latest" }, + { os: "linux", arch: "x64", distro: "debian", release: "12", tier: "latest" }, + { os: "linux", arch: "x64", baseline: true, distro: "debian", release: "12", tier: "latest" }, + { os: "linux", arch: "aarch64", distro: "ubuntu", release: "24.04", tier: "latest" }, + { os: "linux", arch: "aarch64", distro: "ubuntu", release: "22.04", tier: "previous" }, + { os: "linux", arch: "aarch64", distro: "ubuntu", release: "20.04", tier: "oldest" }, + { os: "linux", arch: "x64", distro: "ubuntu", release: "24.04", tier: "latest" }, + { os: "linux", arch: "x64", distro: "ubuntu", release: "22.04", tier: "previous" }, + { os: "linux", arch: "x64", distro: "ubuntu", release: "20.04", tier: "oldest" }, + { os: "linux", arch: "x64", baseline: true, distro: "ubuntu", release: "24.04", tier: "latest" }, + { os: "linux", arch: "x64", baseline: true, distro: "ubuntu", release: "22.04", tier: "previous" }, + { os: "linux", arch: "x64", baseline: true, distro: "ubuntu", release: "20.04", tier: "oldest" }, + { os: "linux", arch: "aarch64", abi: "musl", distro: "alpine", release: "3.20", tier: "latest" }, + { os: "linux", arch: "x64", abi: "musl", distro: "alpine", release: "3.20", tier: "latest" }, + { os: "linux", arch: "x64", abi: "musl", baseline: true, distro: "alpine", release: "3.20", tier: "latest" }, + { os: "windows", arch: "x64", release: "2019", tier: "oldest" }, + { os: "windows", arch: "x64", release: "2019", baseline: true, tier: "oldest" }, +]; + +/** + * @param {Platform} platform + * @returns {string} + */ +function getPlatformKey(platform) { + const { distro, release } = platform; + const target = getTargetKey(platform); + const version = release.replace(/\./g, ""); + if (distro) { + return `${target}-${distro}-${version}`; + } + return `${target}-${version}`; +} + +/** + * @param {Platform} platform + * @returns {string} + */ +function getPlatformLabel(platform) { + const { os, arch, baseline, profile, distro, release } = platform; + let label = `${getBuildkiteEmoji(distro || os)} ${release} ${arch}`; + if (baseline) { + label += "-baseline"; + } + if (profile && profile !== "release") { + label += `-${profile}`; + } + return label; +} + +/** + * @param {Platform} platform + * @returns {string} + */ +function getImageKey(platform) { + const { os, arch, distro, release, features, abi } = platform; + const version = release.replace(/\./g, ""); + let key = `${os}-${arch}-${version}`; + if (distro) { + key += `-${distro}`; + } + if (features?.length) { + key += `-with-${features.join("-")}`; + } + + if (abi) { + key += `-${abi}`; + } + + return key; +} + +/** + * @param {Platform} platform + * @returns {string} + */ +function getImageLabel(platform) { + const { os, arch, distro, release } = platform; + return `${getBuildkiteEmoji(distro || os)} ${release} ${arch}`; +} + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @returns {string} + */ +function getImageName(platform, options) { + const { os } = platform; + const { buildImages, publishImages } = options; + + const name = getImageKey(platform); + + if (buildImages && !publishImages) { + return `${name}-build-${getBuildNumber()}`; + } + + return `${name}-v${getBootstrapVersion(os)}`; +} + +/** + * @param {number} [limit] + * @link https://buildkite.com/docs/pipelines/command-step#retry-attributes + */ +function getRetry(limit = 0) { + return { + manual: { + permit_on_passed: true, + }, + automatic: [ + { exit_status: 1, limit }, + { exit_status: -1, limit: 1 }, + { exit_status: 255, limit: 1 }, + { signal_reason: "cancel", limit: 1 }, + { signal_reason: "agent_stop", limit: 1 }, + ], + }; +} + +/** + * @returns {number} + * @link https://buildkite.com/docs/pipelines/managing-priorities + */ +function getPriority() { + if (isFork()) { + return -1; + } + if (isMainBranch()) { + return 2; + } + if (isMergeQueue()) { + return 1; + } + return 0; +} + +/** + * Agents + */ + +/** + * @typedef {Object} Ec2Options + * @property {string} instanceType + * @property {number} cpuCount + * @property {number} threadsPerCore + * @property {boolean} dryRun + */ + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @param {Ec2Options} ec2Options + * @returns {Agent} + */ +function getEc2Agent(platform, options, ec2Options) { + const { os, arch, abi, distro, release } = platform; + const { instanceType, cpuCount, threadsPerCore } = ec2Options; + return { + os, + arch, + abi, + distro, + release, + robobun: true, + robobun2: true, + "image-name": getImageName(platform, options), + "instance-type": instanceType, + "cpu-count": cpuCount, + "threads-per-core": threadsPerCore, + "preemptible": false, + }; +} + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @returns {string} + */ +function getCppAgent(platform, options) { + const { os, arch, distro } = platform; + + if (os === "darwin") { + return { + queue: `build-${os}`, + os, + arch, + }; + } + + return getEc2Agent(platform, options, { + instanceType: arch === "aarch64" ? "c8g.16xlarge" : "c7i.16xlarge", + cpuCount: 32, + threadsPerCore: 1, + }); +} + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @returns {Agent} + */ +function getZigAgent(platform, options) { + const { arch } = platform; + + return { + queue: "build-zig", + }; +} + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @returns {Agent} + */ +function getTestAgent(platform, options) { + const { os, arch } = platform; + + if (os === "darwin") { + return { + queue: `test-${os}`, + os, + arch, + }; + } + + // TODO: `dev-server-ssr-110.test.ts` and `next-build.test.ts` run out of memory at 8GB of memory, so use 16GB instead. + if (os === "windows") { + return getEc2Agent(platform, options, { + instanceType: "c7i.2xlarge", + cpuCount: 2, + threadsPerCore: 1, + }); + } + + if (arch === "aarch64") { + return getEc2Agent(platform, options, { + instanceType: "c8g.xlarge", + cpuCount: 2, + threadsPerCore: 1, + }); + } + + return getEc2Agent(platform, options, { + instanceType: "c7i.xlarge", + cpuCount: 2, + threadsPerCore: 1, + }); +} + +/** + * Steps + */ + +/** + * @param {Target} target + * @param {PipelineOptions} options + * @returns {Record} + */ +function getBuildEnv(target, options) { + const { profile, baseline, abi } = target; + const release = !profile || profile === "release"; + const { canary } = options; + const revision = typeof canary === "number" ? canary : 1; + + const isMusl = abi === "musl"; + + let CMAKE_BUILD_TYPE = release ? "Release" : profile === "debug" ? "Debug" : "RelWithDebInfo"; + if (isMusl && release) { + CMAKE_BUILD_TYPE = "MinSizeRel"; + } + + return { + CMAKE_BUILD_TYPE, + ENABLE_BASELINE: baseline ? "ON" : "OFF", + ENABLE_CANARY: revision > 0 ? "ON" : "OFF", + CANARY_REVISION: revision, + ENABLE_ASSERTIONS: release ? "OFF" : "ON", + ENABLE_LOGS: release ? "OFF" : "ON", + ABI: isMusl ? "musl" : undefined, + CMAKE_TLS_VERIFY: "0", + }; +} + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @returns {Step} + */ +function getBuildVendorStep(platform, options) { + return { + key: `${getTargetKey(platform)}-build-vendor`, + label: `${getTargetLabel(platform)} - build-vendor`, + agents: getCppAgent(platform, options), + retry: getRetry(), + cancel_on_build_failing: isMergeQueue(), + env: getBuildEnv(platform, options), + command: "bun run build:ci --target dependencies", + }; +} + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @returns {Step} + */ +function getBuildCppStep(platform, options) { + return { + key: `${getTargetKey(platform)}-build-cpp`, + label: `${getTargetLabel(platform)} - build-cpp`, + agents: getCppAgent(platform, options), + retry: getRetry(), + cancel_on_build_failing: isMergeQueue(), + env: { + BUN_CPP_ONLY: "ON", + ...getBuildEnv(platform, options), + }, + command: "bun run build:ci --target bun", + }; +} + +/** + * @param {Target} target + * @returns {string} + */ +function getBuildToolchain(target) { + const { os, arch, abi, baseline } = target; + let key = `${os}-${arch}`; + if (abi) { + key += `-${abi}`; + } + if (baseline) { + key += "-baseline"; + } + return key; +} + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @returns {Step} + */ +function getBuildZigStep(platform, options) { + const toolchain = getBuildToolchain(platform); + return { + key: `${getTargetKey(platform)}-build-zig`, + label: `${getTargetLabel(platform)} - build-zig`, + agents: getZigAgent(platform, options), + retry: getRetry(), + cancel_on_build_failing: isMergeQueue(), + env: getBuildEnv(platform, options), + command: `bun run build:ci --target bun-zig --toolchain ${toolchain}`, + timeout_in_minutes: 35, + }; +} + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @returns {Step} + */ +function getLinkBunStep(platform, options) { + return { + key: `${getTargetKey(platform)}-build-bun`, + label: `${getTargetLabel(platform)} - build-bun`, + depends_on: [ + `${getTargetKey(platform)}-build-vendor`, + `${getTargetKey(platform)}-build-cpp`, + `${getTargetKey(platform)}-build-zig`, + ], + agents: getCppAgent(platform, options), + retry: getRetry(), + cancel_on_build_failing: isMergeQueue(), + env: { + BUN_LINK_ONLY: "ON", + ...getBuildEnv(platform, options), + }, + command: "bun run build:ci --target bun", + }; +} + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @returns {Step} + */ +function getBuildBunStep(platform, options) { + return { + key: `${getTargetKey(platform)}-build-bun`, + label: `${getTargetLabel(platform)} - build-bun`, + agents: getCppAgent(platform, options), + retry: getRetry(), + cancel_on_build_failing: isMergeQueue(), + env: getBuildEnv(platform, options), + command: "bun run build:ci", + }; +} + +/** + * @typedef {Object} TestOptions + * @property {string} [buildId] + * @property {boolean} [unifiedTests] + * @property {string[]} [testFiles] + * @property {boolean} [dryRun] + */ + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @param {TestOptions} [testOptions] + * @returns {Step} + */ +function getTestBunStep(platform, options, testOptions = {}) { + const { os } = platform; + const { buildId, unifiedTests, testFiles } = testOptions; + + const args = [`--step=${getTargetKey(platform)}-build-bun`]; + if (buildId) { + args.push(`--build-id=${buildId}`); + } + if (testFiles) { + args.push(...testFiles.map(testFile => `--include=${testFile}`)); + } + + const depends = []; + if (!buildId) { + depends.push(`${getTargetKey(platform)}-build-bun`); + } + + return { + key: `${getPlatformKey(platform)}-test-bun`, + label: `${getPlatformLabel(platform)} - test-bun`, + depends_on: depends, + agents: getTestAgent(platform, options), + retry: getRetry(), + cancel_on_build_failing: isMergeQueue(), + parallelism: unifiedTests ? undefined : os === "darwin" ? 2 : 10, + command: + os === "windows" + ? `node .\\scripts\\runner.node.mjs ${args.join(" ")}` + : `./scripts/runner.node.mjs ${args.join(" ")}`, + }; +} + +/** + * @param {Platform} platform + * @param {PipelineOptions} options + * @returns {Step} + */ +function getBuildImageStep(platform, options) { + const { os, arch, distro, release, features } = platform; + const { publishImages } = options; + const action = publishImages ? "publish-image" : "create-image"; + + const command = [ + "node", + "./scripts/machine.mjs", + action, + `--os=${os}`, + `--arch=${arch}`, + distro && `--distro=${distro}`, + `--release=${release}`, + "--cloud=aws", + "--ci", + "--authorized-org=oven-sh", + ]; + for (const feature of features || []) { + command.push(`--feature=${feature}`); + } + + return { + key: `${getImageKey(platform)}-build-image`, + label: `${getImageLabel(platform)} - build-image`, + agents: { + queue: "build-image", + }, + env: { + DEBUG: "1", + }, + retry: getRetry(), + cancel_on_build_failing: isMergeQueue(), + command: command.filter(Boolean).join(" "), + timeout_in_minutes: 3 * 60, + }; +} + +/** + * @param {Platform[]} buildPlatforms + * @param {PipelineOptions} options + * @returns {Step} + */ +function getReleaseStep(buildPlatforms, options) { + const { canary } = options; + const revision = typeof canary === "number" ? canary : 1; + + return { + key: "release", + label: getBuildkiteEmoji("rocket"), + agents: { + queue: "test-darwin", + }, + depends_on: buildPlatforms.map(platform => `${getTargetKey(platform)}-build-bun`), + env: { + CANARY: revision, + }, + command: ".buildkite/scripts/upload-release.sh", + }; +} + +/** + * @returns {Step} + */ +function getBenchmarkStep() { + return { + key: "benchmark", + label: "📊", + agents: { + queue: "build-zig", + }, + command: "bun .buildkite/scripts/upload-benchmark.ts", + depends_on: [`linux-x64-build-bun`], + }; +} + +/** + * @typedef {Object} Pipeline + * @property {Step[]} [steps] + * @property {number} [priority] + */ + +/** + * @typedef {Record} Agent + */ + +/** + * @typedef {GroupStep | CommandStep | BlockStep} Step + */ + +/** + * @typedef {Object} GroupStep + * @property {string} key + * @property {string} group + * @property {Step[]} steps + * @property {string[]} [depends_on] + */ + +/** + * @typedef {Object} CommandStep + * @property {string} key + * @property {string} [label] + * @property {Record} [agents] + * @property {Record} [env] + * @property {string} command + * @property {string[]} [depends_on] + * @property {Record} [retry] + * @property {boolean} [cancel_on_build_failing] + * @property {boolean} [soft_fail] + * @property {number} [parallelism] + * @property {number} [concurrency] + * @property {string} [concurrency_group] + * @property {number} [priority] + * @property {number} [timeout_in_minutes] + * @link https://buildkite.com/docs/pipelines/command-step + */ + +/** + * @typedef {Object} BlockStep + * @property {string} key + * @property {string} block + * @property {string} [prompt] + * @property {"passed" | "failed" | "running"} [blocked_state] + * @property {(SelectInput | TextInput)[]} [fields] + */ + +/** + * @typedef {Object} TextInput + * @property {string} key + * @property {string} text + * @property {string} [default] + * @property {boolean} [required] + * @property {string} [hint] + */ + +/** + * @typedef {Object} SelectInput + * @property {string} key + * @property {string} select + * @property {string | string[]} [default] + * @property {boolean} [required] + * @property {boolean} [multiple] + * @property {string} [hint] + * @property {SelectOption[]} [options] + */ + +/** + * @typedef {Object} SelectOption + * @property {string} label + * @property {string} value + */ + +/** + * @typedef {Object} PipelineOptions + * @property {string | boolean} [skipEverything] + * @property {string | boolean} [skipBuilds] + * @property {string | boolean} [skipTests] + * @property {string | boolean} [forceBuilds] + * @property {string | boolean} [forceTests] + * @property {string | boolean} [buildImages] + * @property {string | boolean} [publishImages] + * @property {number} [canary] + * @property {Profile[]} [buildProfiles] + * @property {Platform[]} [buildPlatforms] + * @property {Platform[]} [testPlatforms] + * @property {string[]} [testFiles] + * @property {boolean} [unifiedBuilds] + * @property {boolean} [unifiedTests] + */ + +/** + * @param {Step} step + * @param {(string | undefined)[]} dependsOn + * @returns {Step} + */ +function getStepWithDependsOn(step, ...dependsOn) { + const { depends_on: existingDependsOn = [] } = step; + return { + ...step, + depends_on: [...existingDependsOn, ...dependsOn.filter(Boolean)], + }; +} + +/** + * @returns {BlockStep} + */ +function getOptionsStep() { + const booleanOptions = [ + { + label: `${getEmoji("true")} Yes`, + value: "true", + }, + { + label: `${getEmoji("false")} No`, + value: "false", + }, + ]; + + return { + key: "options", + block: getBuildkiteEmoji("clipboard"), + blocked_state: "running", + fields: [ + { + key: "canary", + select: "If building, is this a canary build?", + hint: "If you are building for a release, this should be false", + required: false, + default: "true", + options: booleanOptions, + }, + { + key: "skip-builds", + select: "Do you want to skip the build?", + hint: "If true, artifacts will be downloaded from the last successful build", + required: false, + default: "false", + options: booleanOptions, + }, + { + key: "skip-tests", + select: "Do you want to skip the tests?", + required: false, + default: "false", + options: booleanOptions, + }, + { + key: "force-builds", + select: "Do you want to force run the build?", + hint: "If true, the build will run even if no source files have changed", + required: false, + default: "false", + options: booleanOptions, + }, + { + key: "force-tests", + select: "Do you want to force run the tests?", + hint: "If true, the tests will run even if no test files have changed", + required: false, + default: "false", + options: booleanOptions, + }, + { + key: "build-profiles", + select: "If building, which profiles do you want to build?", + required: false, + multiple: true, + default: ["release"], + options: [ + { + label: `${getEmoji("release")} Release`, + value: "release", + }, + { + label: `${getEmoji("assert")} Release with Assertions`, + value: "assert", + }, + { + label: `${getEmoji("debug")} Debug`, + value: "debug", + }, + ], + }, + { + key: "build-platforms", + select: "If building, which platforms do you want to build?", + hint: "If this is left blank, all platforms are built", + required: false, + multiple: true, + default: [], + options: buildPlatforms.map(platform => { + const { os, arch, abi, baseline } = platform; + let label = `${getEmoji(os)} ${arch}`; + if (abi) { + label += `-${abi}`; + } + if (baseline) { + label += `-baseline`; + } + return { + label, + value: getTargetKey(platform), + }; + }), + }, + { + key: "test-platforms", + select: "If testing, which platforms do you want to test?", + hint: "If this is left blank, all platforms are tested", + required: false, + multiple: true, + default: [], + options: [...new Map(testPlatforms.map(platform => [getImageKey(platform), platform])).entries()].map( + ([key, platform]) => { + const { os, arch, abi, distro, release } = platform; + let label = `${getEmoji(os)} ${arch}`; + if (abi) { + label += `-${abi}`; + } + if (distro) { + label += ` ${distro}`; + } + if (release) { + label += ` ${release}`; + } + return { + label, + value: key, + }; + }, + ), + }, + { + key: "test-files", + text: "If testing, which files do you want to test?", + hint: "If specified, only run test paths that include the list of strings (e.g. 'test/js', 'test/cli/hot/watch.ts')", + required: false, + }, + { + key: "build-images", + select: "Do you want to re-build the base images?", + hint: "This can take 2-3 hours to complete, only do so if you've tested locally", + required: false, + default: "false", + options: booleanOptions, + }, + { + key: "publish-images", + select: "Do you want to re-build and publish the base images?", + hint: "This can take 2-3 hours to complete, only do so if you've tested locally", + required: false, + default: "false", + options: booleanOptions, + }, + { + key: "unified-builds", + select: "Do you want to build each platform in a single step?", + hint: "If true, builds will not be split into seperate steps (this will likely slow down the build)", + required: false, + default: "false", + options: booleanOptions, + }, + { + key: "unified-tests", + select: "Do you want to run tests in a single step?", + hint: "If true, tests will not be split into seperate steps (this will be very slow)", + required: false, + default: "false", + options: booleanOptions, + }, + ], + }; +} + +/** + * @returns {Step} + */ +function getOptionsApplyStep() { + const command = getEnv("BUILDKITE_COMMAND"); + return { + key: "options-apply", + label: getBuildkiteEmoji("gear"), + command: `${command} --apply`, + depends_on: ["options"], + agents: { + queue: getEnv("BUILDKITE_AGENT_META_DATA_QUEUE", false), + }, + }; +} + +/** + * @returns {Promise} + */ +async function getPipelineOptions() { + const isManual = isBuildManual(); + if (isManual && !process.argv.includes("--apply")) { + return; + } + + const canary = await getCanaryRevision(); + const buildPlatformsMap = new Map(buildPlatforms.map(platform => [getTargetKey(platform), platform])); + const testPlatformsMap = new Map(testPlatforms.map(platform => [getPlatformKey(platform), platform])); + + if (isManual) { + const { fields } = getOptionsStep(); + const keys = fields?.map(({ key }) => key) ?? []; + const values = await Promise.all(keys.map(getBuildMetadata)); + const options = Object.fromEntries(keys.map((key, index) => [key, values[index]])); + + /** + * @param {string} value + * @returns {string[] | undefined} + */ + const parseArray = value => + value + ?.split("\n") + ?.map(item => item.trim()) + ?.filter(Boolean); + + const buildPlatformKeys = parseArray(options["build-platforms"]); + const testPlatformKeys = parseArray(options["test-platforms"]); + return { + canary: parseBoolean(options["canary"]) ? canary : 0, + skipBuilds: parseBoolean(options["skip-builds"]), + forceBuilds: parseBoolean(options["force-builds"]), + skipTests: parseBoolean(options["skip-tests"]), + buildImages: parseBoolean(options["build-images"]), + publishImages: parseBoolean(options["publish-images"]), + testFiles: parseArray(options["test-files"]), + unifiedBuilds: parseBoolean(options["unified-builds"]), + unifiedTests: parseBoolean(options["unified-tests"]), + buildProfiles: parseArray(options["build-profiles"]), + buildPlatforms: buildPlatformKeys?.length + ? buildPlatformKeys.map(key => buildPlatformsMap.get(key)) + : Array.from(buildPlatformsMap.values()), + testPlatforms: testPlatformKeys?.length + ? testPlatformKeys.map(key => testPlatformsMap.get(key)) + : Array.from(testPlatformsMap.values()), + dryRun: parseBoolean(options["dry-run"]), + }; + } + + const commitMessage = getCommitMessage(); + + /** + * @param {RegExp} pattern + * @returns {string | boolean} + */ + const parseOption = pattern => { + const match = pattern.exec(commitMessage); + if (match) { + const [, value] = match; + return value; + } + return false; + }; + + const isCanary = + !parseBoolean(getEnv("RELEASE", false) || "false") && + !/\[(release|build release|release build)\]/i.test(commitMessage); + return { + canary: isCanary ? canary : 0, + skipEverything: parseOption(/\[(skip ci|no ci)\]/i), + skipBuilds: parseOption(/\[(skip builds?|no builds?|only tests?)\]/i), + forceBuilds: parseOption(/\[(force builds?)\]/i), + skipTests: parseOption(/\[(skip tests?|no tests?|only builds?)\]/i), + buildImages: parseOption(/\[(build images?)\]/i), + dryRun: parseOption(/\[(dry run)\]/i), + publishImages: parseOption(/\[(publish images?)\]/i), + buildPlatforms: Array.from(buildPlatformsMap.values()), + testPlatforms: Array.from(testPlatformsMap.values()), + buildProfiles: ["release"], + }; +} + +/** + * @param {PipelineOptions} [options] + * @returns {Promise} + */ +async function getPipeline(options = {}) { + const priority = getPriority(); + + if (isBuildManual() && !Object.keys(options).length) { + return { + priority, + steps: [getOptionsStep(), getOptionsApplyStep()], + }; + } + + const { skipEverything } = options; + if (skipEverything) { + return; + } + + const { buildProfiles = [], buildPlatforms = [], testPlatforms = [], buildImages, publishImages } = options; + const imagePlatforms = new Map( + buildImages || publishImages + ? [...buildPlatforms, ...testPlatforms] + .filter(({ os }) => os === "linux" || os === "windows") + .map(platform => [getImageKey(platform), platform]) + : [], + ); + + /** @type {Step[]} */ + const steps = []; + + if (imagePlatforms.size) { + steps.push({ + key: "build-images", + group: getBuildkiteEmoji("aws"), + steps: [...imagePlatforms.values()].map(platform => getBuildImageStep(platform, options)), + }); + } + + let { skipBuilds, forceBuilds, unifiedBuilds, dryRun } = options; + dryRun = dryRun || !!buildImages; + + /** @type {string | undefined} */ + let buildId; + if (skipBuilds && !forceBuilds) { + const lastBuild = await getLastSuccessfulBuild(); + if (lastBuild) { + const { id } = lastBuild; + buildId = id; + } else { + console.warn("No last successful build found, must force builds..."); + } + } + + if (!buildId) { + steps.push( + ...buildPlatforms + .flatMap(platform => buildProfiles.map(profile => ({ ...platform, profile }))) + .map(target => { + const imageKey = getImageKey(target); + + return getStepWithDependsOn( + { + key: getTargetKey(target), + group: getTargetLabel(target), + steps: unifiedBuilds + ? [getBuildBunStep(target, options)] + : [ + getBuildVendorStep(target, options), + getBuildCppStep(target, options), + getBuildZigStep(target, options), + getLinkBunStep(target, options), + ], + }, + imagePlatforms.has(imageKey) ? `${imageKey}-build-image` : undefined, + ); + }), + ); + } + + if (!isMainBranch()) { + const { skipTests, forceTests, unifiedTests, testFiles } = options; + if (!skipTests || forceTests) { + steps.push( + ...testPlatforms + .flatMap(platform => buildProfiles.map(profile => ({ ...platform, profile }))) + .map(target => ({ + key: getTargetKey(target), + group: getTargetLabel(target), + steps: [getTestBunStep(target, options, { unifiedTests, testFiles, buildId })], + })), + ); + } + } + + if (isMainBranch()) { + steps.push(getReleaseStep(buildPlatforms, options)); + } + + steps.push(getBenchmarkStep()); + + /** @type {Map} */ + const stepsByGroup = new Map(); + + for (let i = 0; i < steps.length; i++) { + const step = steps[i]; + if (!("group" in step)) { + continue; + } + + const { group, steps: groupSteps } = step; + if (stepsByGroup.has(group)) { + stepsByGroup.get(group).steps.push(...groupSteps); + } else { + stepsByGroup.set(group, step); + } + + steps[i] = undefined; + } + + return { + priority, + steps: [...steps.filter(step => typeof step !== "undefined"), ...Array.from(stepsByGroup.values())], + }; +} + +async function main() { + startGroup("Generating options..."); + const options = await getPipelineOptions(); + if (options) { + console.log("Generated options:", options); + } + + startGroup("Generating pipeline..."); + const pipeline = await getPipeline(options); + if (!pipeline) { + console.log("Generated pipeline is empty, skipping..."); + return; + } + + const content = toYaml(pipeline); + const contentPath = join(process.cwd(), ".buildkite", "ci.yml"); + writeFile(contentPath, content); + + console.log("Generated pipeline:"); + console.log(" - Path:", contentPath); + console.log(" - Size:", (content.length / 1024).toFixed(), "KB"); + + if (isBuildkite) { + startGroup("Uploading pipeline..."); + try { + await spawnSafe(["buildkite-agent", "pipeline", "upload", contentPath], { stdio: "inherit" }); + } finally { + await uploadArtifact(contentPath); + } + } +} + +await main(); diff --git a/.buildkite/ci.yml b/.buildkite/ci.yml deleted file mode 100644 index 742b19c8ec..0000000000 --- a/.buildkite/ci.yml +++ /dev/null @@ -1,782 +0,0 @@ -# Build and test Bun on macOS, Linux, and Windows. -# https://buildkite.com/docs/pipelines/defining-steps -# -# If a step has the `robobun: true` label, robobun will listen -# to webhooks from Buildkite and provision a VM to run the step. -# -# Changes to this file will be automatically uploaded on the next run -# for a particular commit. -# -# Future tests machines to be added: -# - macOS 12 -# - Windows Server 2016 & 2019 -# - Amazon Linux 2 & 2023 -# - CentOS / RHEL / Fedora / other Linux distros -# - Docker containers -# - Rasberry Pi? -steps: - # macOS aarch64 - - key: "darwin-aarch64" - group: ":darwin: aarch64" - steps: - - key: "darwin-aarch64-build-deps" - label: ":darwin: aarch64 - build-deps" - agents: - queue: "build-darwin" - os: "darwin" - arch: "aarch64" - command: - - "./.buildkite/scripts/build-deps.sh" - - - key: "darwin-aarch64-build-zig" - label: ":darwin: aarch64 - build-zig" - agents: - queue: "build-darwin" - os: "darwin" - arch: "aarch64" - command: - - "./.buildkite/scripts/build-zig.sh darwin aarch64" - - - key: "darwin-aarch64-build-cpp" - label: ":darwin: aarch64 - build-cpp" - agents: - queue: "build-darwin" - os: "darwin" - arch: "aarch64" - command: - - "./.buildkite/scripts/build-cpp.sh" - - - key: "darwin-aarch64-build-bun" - label: ":darwin: aarch64 - build-bun" - depends_on: - - "darwin-aarch64-build-deps" - - "darwin-aarch64-build-zig" - - "darwin-aarch64-build-cpp" - agents: - queue: "build-darwin" - os: "darwin" - arch: "aarch64" - command: - - "./.buildkite/scripts/build-bun.sh" - - - key: "darwin-aarch64-test-macos-14" - label: ":darwin: 14 aarch64 - test-bun" - if: "build.branch != 'main'" - parallelism: 3 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "darwin-aarch64-build-bun" - agents: - queue: "test-darwin" - os: "darwin" - arch: "aarch64" - release: "14" - command: - - "./scripts/runner.node.mjs --step darwin-aarch64-build-bun" - - - key: "darwin-aarch64-test-macos-13" - label: ":darwin: 13 aarch64 - test-bun" - if: "build.branch != 'main'" - parallelism: 3 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "darwin-aarch64-build-bun" - agents: - queue: "test-darwin" - os: "darwin" - arch: "aarch64" - release: "13" - command: - - "./scripts/runner.node.mjs --step darwin-aarch64-build-bun" - - # macOS x64 - - key: "darwin-x64" - group: ":darwin: x64" - steps: - - key: "darwin-x64-build-deps" - label: ":darwin: x64 - build-deps" - agents: - queue: "build-darwin" - os: "darwin" - arch: "x64" - command: - - "./.buildkite/scripts/build-deps.sh" - - - key: "darwin-x64-build-zig" - label: ":darwin: x64 - build-zig" - agents: - queue: "build-darwin" - os: "darwin" - arch: "aarch64" - command: - - "./.buildkite/scripts/build-zig.sh darwin x64" - - - key: "darwin-x64-build-cpp" - label: ":darwin: x64 - build-cpp" - agents: - queue: "build-darwin" - os: "darwin" - arch: "x64" - command: - - "./.buildkite/scripts/build-cpp.sh" - - - key: "darwin-x64-build-bun" - label: ":darwin: x64 - build-bun" - depends_on: - - "darwin-x64-build-deps" - - "darwin-x64-build-zig" - - "darwin-x64-build-cpp" - agents: - queue: "build-darwin" - os: "darwin" - arch: "x64" - command: - - "./.buildkite/scripts/build-bun.sh" - - - key: "darwin-x64-test-macos-14" - label: ":darwin: 14 x64 - test-bun" - if: "build.branch != 'main'" - parallelism: 2 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "darwin-x64-build-bun" - agents: - queue: "test-darwin" - os: "darwin" - arch: "x64" - release: "14" - command: - - "./scripts/runner.node.mjs --step darwin-x64-build-bun" - - - key: "darwin-x64-test-macos-13" - label: ":darwin: 13 x64 - test-bun" - if: "build.branch != 'main'" - parallelism: 2 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "darwin-x64-build-bun" - agents: - queue: "test-darwin" - os: "darwin" - arch: "x64" - release: "13" - command: - - "./scripts/runner.node.mjs --step darwin-x64-build-bun" - - # Linux aarch64 - - key: "linux-aarch64" - group: ":linux: aarch64" - steps: - - key: "linux-aarch64-build-deps" - label: ":linux: aarch64 - build-deps" - agents: - queue: "build-linux" - os: "linux" - arch: "aarch64" - command: - - "./.buildkite/scripts/build-deps.sh" - - - key: "linux-aarch64-build-zig" - label: ":linux: aarch64 - build-zig" - agents: - queue: "build-darwin" - os: "darwin" - arch: "aarch64" - command: - - "./.buildkite/scripts/build-zig.sh linux aarch64" - - - key: "linux-aarch64-build-cpp" - label: ":linux: aarch64 - build-cpp" - agents: - queue: "build-linux" - os: "linux" - arch: "aarch64" - command: - - "./.buildkite/scripts/build-cpp.sh" - - - key: "linux-aarch64-build-bun" - label: ":linux: aarch64 - build-bun" - depends_on: - - "linux-aarch64-build-deps" - - "linux-aarch64-build-zig" - - "linux-aarch64-build-cpp" - agents: - queue: "build-linux" - os: "linux" - arch: "aarch64" - command: - - "./.buildkite/scripts/build-bun.sh" - - - key: "linux-aarch64-test-debian-12" - label: ":debian: 12 aarch64 - test-bun" - if: "build.branch != 'main'" - parallelism: 5 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "linux-aarch64-build-bun" - agents: - robobun: "true" - os: "linux" - arch: "aarch64" - distro: "debian" - release: "12" - command: - - "./scripts/runner.node.mjs --step linux-aarch64-build-bun" - - - key: "linux-aarch64-test-ubuntu-2204" - label: ":ubuntu: 22.04 aarch64 - test-bun" - if: "build.branch != 'main'" - parallelism: 5 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "linux-aarch64-build-bun" - agents: - robobun: "true" - os: "linux" - arch: "aarch64" - distro: "ubuntu" - release: "22.04" - command: - - "./scripts/runner.node.mjs --step linux-aarch64-build-bun" - - - key: "linux-aarch64-test-ubuntu-2004" - label: ":ubuntu: 20.04 aarch64 - test-bun" - if: "build.branch != 'main'" - parallelism: 5 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "linux-aarch64-build-bun" - agents: - robobun: "true" - os: "linux" - arch: "aarch64" - distro: "ubuntu" - release: "20.04" - command: - - "./scripts/runner.node.mjs --step linux-aarch64-build-bun" - - # Linux x64 - - key: "linux-x64" - group: ":linux: x64" - steps: - - key: "linux-x64-build-deps" - label: ":linux: x64 - build-deps" - agents: - queue: "build-linux" - os: "linux" - arch: "x64" - command: - - "./.buildkite/scripts/build-deps.sh" - - - key: "linux-x64-build-zig" - label: ":linux: x64 - build-zig" - agents: - queue: "build-darwin" - os: "darwin" - arch: "aarch64" - command: - - "./.buildkite/scripts/build-zig.sh linux x64" - - - key: "linux-x64-build-cpp" - label: ":linux: x64 - build-cpp" - agents: - queue: "build-linux" - os: "linux" - arch: "x64" - command: - - "./.buildkite/scripts/build-cpp.sh" - - - key: "linux-x64-build-bun" - label: ":linux: x64 - build-bun" - depends_on: - - "linux-x64-build-deps" - - "linux-x64-build-zig" - - "linux-x64-build-cpp" - agents: - queue: "build-linux" - os: "linux" - arch: "x64" - command: - - "./.buildkite/scripts/build-bun.sh" - - - key: "linux-x64-test-debian-12" - label: ":debian: 12 x64 - test-bun" - if: "build.branch != 'main'" - parallelism: 5 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "linux-x64-build-bun" - agents: - robobun: "true" - os: "linux" - arch: "x64" - distro: "debian" - release: "12" - command: - - "./scripts/runner.node.mjs --step linux-x64-build-bun" - - - key: "linux-x64-test-ubuntu-2204" - label: ":ubuntu: 22.04 x64 - test-bun" - if: "build.branch != 'main'" - parallelism: 5 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "linux-x64-build-bun" - agents: - robobun: "true" - os: "linux" - arch: "x64" - distro: "ubuntu" - release: "22.04" - command: - - "./scripts/runner.node.mjs --step linux-x64-build-bun" - - - key: "linux-x64-test-ubuntu-2004" - label: ":ubuntu: 20.04 x64 - test-bun" - if: "build.branch != 'main'" - parallelism: 5 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "linux-x64-build-bun" - agents: - robobun: "true" - os: "linux" - arch: "x64" - distro: "ubuntu" - release: "20.04" - command: - - "./scripts/runner.node.mjs --step linux-x64-build-bun" - - # Linux x64-baseline - - key: "linux-x64-baseline" - group: ":linux: x64-baseline" - steps: - - key: "linux-x64-baseline-build-deps" - label: ":linux: x64-baseline - build-deps" - agents: - queue: "build-linux" - os: "linux" - arch: "x64" - command: - - "./.buildkite/scripts/build-deps.sh" - - - key: "linux-x64-baseline-build-zig" - label: ":linux: x64-baseline - build-zig" - agents: - queue: "build-darwin" - os: "darwin" - arch: "aarch64" - command: - - "./.buildkite/scripts/build-zig.sh linux x64" - - - key: "linux-x64-baseline-build-cpp" - label: ":linux: x64-baseline - build-cpp" - agents: - queue: "build-linux" - os: "linux" - arch: "x64" - command: - - "./.buildkite/scripts/build-cpp.sh" - - - key: "linux-x64-baseline-build-bun" - label: ":linux: x64-baseline - build-bun" - depends_on: - - "linux-x64-baseline-build-deps" - - "linux-x64-baseline-build-zig" - - "linux-x64-baseline-build-cpp" - agents: - queue: "build-linux" - os: "linux" - arch: "x64" - command: - - "./.buildkite/scripts/build-bun.sh" - - - key: "linux-x64-baseline-test-debian-12" - label: ":debian: 12 x64-baseline - test-bun" - if: "build.branch != 'main'" - parallelism: 5 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "linux-x64-baseline-build-bun" - agents: - robobun: "true" - os: "linux" - arch: "x64" - distro: "debian" - release: "12" - command: - - "./scripts/runner.node.mjs --step linux-x64-baseline-build-bun" - - - key: "linux-x64-baseline-test-ubuntu-2204" - label: ":ubuntu: 22.04 x64-baseline - test-bun" - if: "build.branch != 'main'" - parallelism: 5 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "linux-x64-baseline-build-bun" - agents: - robobun: "true" - os: "linux" - arch: "x64" - distro: "ubuntu" - release: "22.04" - command: - - "./scripts/runner.node.mjs --step linux-x64-baseline-build-bun" - - - key: "linux-x64-baseline-test-ubuntu-2004" - label: ":ubuntu: 20.04 x64-baseline - test-bun" - if: "build.branch != 'main'" - parallelism: 5 - soft_fail: - - exit_status: 2 - retry: - automatic: - - exit_status: 1 - limit: 1 - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "linux-x64-baseline-build-bun" - agents: - robobun: "true" - os: "linux" - arch: "x64" - distro: "ubuntu" - release: "20.04" - command: - - "./scripts/runner.node.mjs --step linux-x64-baseline-build-bun" - - # Windows x64 - - key: "windows-x64" - group: ":windows: x64" - steps: - - key: "windows-x64-build-deps" - label: ":windows: x64 - build-deps" - agents: - queue: "build-windows" - os: "windows" - arch: "x64" - artifact_paths: - - "build\\bun-deps\\*.lib" - env: - CCACHE_DISABLE: "1" - command: - - ".\\scripts\\all-dependencies.ps1" - - - key: "windows-x64-build-zig" - label: ":windows: x64 - build-zig" - agents: - queue: "build-darwin" - os: "darwin" # cross-compile on Linux or Darwin - arch: "aarch64" - command: - - "./.buildkite/scripts/build-zig.sh windows x64" - - - key: "windows-x64-build-cpp" - label: ":windows: x64 - build-cpp" - agents: - queue: "build-windows" - os: "windows" - arch: "x64" - artifact_paths: - # HACK: See scripts/build-bun-cpp.ps1 - # - "build\\bun-cpp-objects.a" - - "build\\bun-cpp-objects.a.*" - env: - CCACHE_DISABLE: "1" - command: - - ".\\scripts\\build-bun-cpp.ps1" - - - key: "windows-x64-build-bun" - label: ":windows: x64 - build-bun" - depends_on: - - "windows-x64-build-deps" - - "windows-x64-build-zig" - - "windows-x64-build-cpp" - agents: - queue: "build-windows" - os: "windows" - arch: "x64" - artifact_paths: - - "bun-windows-x64.zip" - - "bun-windows-x64-profile.zip" - - "features.json" - env: - CCACHE_DISABLE: "1" - command: - - ".\\scripts\\buildkite-link-bun.ps1" - - - key: "windows-x64-test-bun" - label: ":windows: x64 - test-bun" - if: "build.branch != 'main'" - parallelism: 10 - soft_fail: - - exit_status: 1 - retry: - automatic: - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "windows-x64-build-bun" - agents: - robobun: "true" - os: "windows" - arch: "x64" - command: - - "node .\\scripts\\runner.node.mjs --step windows-x64-build-bun" - - # Windows x64-baseline - - key: "windows-x64-baseline" - group: ":windows: x64-baseline" - steps: - - key: "windows-x64-baseline-build-deps" - label: ":windows: x64-baseline - build-deps" - agents: - queue: "build-windows" - os: "windows" - arch: "x64" - artifact_paths: - - "build\\bun-deps\\*.lib" - env: - CCACHE_DISABLE: "1" - USE_BASELINE_BUILD: "1" - command: - - ".\\scripts\\all-dependencies.ps1" - - - key: "windows-x64-baseline-build-zig" - label: ":windows: x64-baseline - build-zig" - agents: - queue: "build-darwin" - os: "darwin" # cross-compile on Linux or Darwin - arch: "aarch64" - command: - - "./.buildkite/scripts/build-zig.sh windows x64" - - - key: "windows-x64-baseline-build-cpp" - label: ":windows: x64-baseline - build-cpp" - agents: - queue: "build-windows" - os: "windows" - arch: "x64" - artifact_paths: - # HACK: See scripts/build-bun-cpp.ps1 - # - "build\\bun-cpp-objects.a" - - "build\\bun-cpp-objects.a.*" - env: - CCACHE_DISABLE: "1" - USE_BASELINE_BUILD: "1" - command: - - ".\\scripts\\build-bun-cpp.ps1" - - - key: "windows-x64-baseline-build-bun" - label: ":windows: x64-baseline - build-bun" - depends_on: - - "windows-x64-baseline-build-deps" - - "windows-x64-baseline-build-zig" - - "windows-x64-baseline-build-cpp" - agents: - queue: "build-windows" - os: "windows" - arch: "x64" - artifact_paths: - - "bun-windows-x64-baseline.zip" - - "bun-windows-x64-baseline-profile.zip" - - "features.json" - env: - CCACHE_DISABLE: "1" - USE_BASELINE_BUILD: "1" - command: - - ".\\scripts\\buildkite-link-bun.ps1 -Baseline $$True" - - - key: "windows-x64-baseline-test-bun" - label: ":windows: x64-baseline - test-bun" - if: "build.branch != 'main'" - parallelism: 10 - soft_fail: - - exit_status: 1 - retry: - automatic: - - exit_status: -1 - limit: 3 - - exit_status: 255 - limit: 3 - - signal_reason: agent_stop - limit: 3 - - signal: SIGTERM - limit: 3 - depends_on: - - "windows-x64-baseline-build-bun" - agents: - robobun: "true" - os: "windows" - arch: "x64" - command: - - "node .\\scripts\\runner.node.mjs --step windows-x64-baseline-build-bun" diff --git a/.buildkite/scripts/build-bun.sh b/.buildkite/scripts/build-bun.sh deleted file mode 100755 index 30cf6c083d..0000000000 --- a/.buildkite/scripts/build-bun.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash - -set -eo pipefail -source "$(dirname "$0")/env.sh" - -function run_command() { - set -x - "$@" - { set +x; } 2>/dev/null -} - -cwd="$(pwd)" - -mkdir -p build -source "$(dirname "$0")/download-artifact.sh" "build/bun-deps/**" --step "$BUILDKITE_GROUP_KEY-build-deps" -source "$(dirname "$0")/download-artifact.sh" "build/bun-zig.o" --step "$BUILDKITE_GROUP_KEY-build-zig" -source "$(dirname "$0")/download-artifact.sh" "build/bun-cpp-objects.a" --step "$BUILDKITE_GROUP_KEY-build-cpp" --split -cd build - -run_command cmake .. "${CMAKE_FLAGS[@]}" \ - -GNinja \ - -DBUN_LINK_ONLY="1" \ - -DNO_CONFIGURE_DEPENDS="1" \ - -DBUN_ZIG_OBJ_DIR="$cwd/build" \ - -DBUN_CPP_ARCHIVE="$cwd/build/bun-cpp-objects.a" \ - -DBUN_DEPS_OUT_DIR="$cwd/build/bun-deps" \ - -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" \ - -DCPU_TARGET="$CPU_TARGET" \ - -DUSE_LTO="$USE_LTO" \ - -DUSE_DEBUG_JSC="$USE_DEBUG_JSC" \ - -DCANARY="$CANARY" \ - -DGIT_SHA="$GIT_SHA" -run_command ninja -v -j "$CPUS" -run_command ls - -tag="bun-$BUILDKITE_GROUP_KEY" -if [ "$USE_LTO" == "OFF" ]; then - # Remove OS check when LTO is enabled on macOS again - if [[ "$tag" == *"darwin"* ]]; then - tag="$tag-nolto" - fi -fi - -for name in bun bun-profile; do - dir="$tag" - if [ "$name" == "bun-profile" ]; then - dir="$tag-profile" - fi - run_command chmod +x "$name" - run_command "./$name" --revision - run_command mkdir -p "$dir" - run_command mv "$name" "$dir/$name" - run_command zip -r "$dir.zip" "$dir" - source "$cwd/.buildkite/scripts/upload-artifact.sh" "$dir.zip" - # temporary disable this so CI can run - # this is failing because $name is now in $dir/$name and if changed to $dir/$name we get ENOENT reading "bun:internal-for-testing" - # if [ "$name" == "bun-profile" ]; then - # export BUN_FEATURE_FLAG_INTERNAL_FOR_TESTING="1" - # run_command "./$name" -e "require('fs').writeFileSync('./features.json', JSON.stringify(require('bun:internal-for-testing').crash_handler.getFeatureData()))" - # source "$cwd/.buildkite/scripts/upload-artifact.sh" "features.json" - # fi -done diff --git a/.buildkite/scripts/build-cpp.sh b/.buildkite/scripts/build-cpp.sh deleted file mode 100755 index f1a973580b..0000000000 --- a/.buildkite/scripts/build-cpp.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -set -eo pipefail -export FORCE_UPDATE_SUBMODULES=1 - -# env.sh calls update_submodules.sh -source "$(dirname "$0")/env.sh" - -{ set +x; } 2>/dev/null - -function run_command() { - set -x - "$@" - { set +x; } 2>/dev/null -} - -mkdir -p build -cd build -mkdir -p tmp_modules tmp_functions js codegen - -run_command cmake .. "${CMAKE_FLAGS[@]}" \ - -GNinja \ - -DBUN_CPP_ONLY="1" \ - -DNO_CONFIGURE_DEPENDS="1" \ - -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" \ - -DCPU_TARGET="$CPU_TARGET" \ - -DUSE_LTO="$USE_LTO" \ - -DUSE_DEBUG_JSC="$USE_DEBUG_JSC" \ - -DCANARY="$CANARY" \ - -DGIT_SHA="$GIT_SHA" - -chmod +x compile-cpp-only.sh -source compile-cpp-only.sh -v -j "$CPUS" -{ set +x; } 2>/dev/null - -cd .. -source "$(dirname "$0")/upload-artifact.sh" "build/bun-cpp-objects.a" --split diff --git a/.buildkite/scripts/build-deps.sh b/.buildkite/scripts/build-deps.sh deleted file mode 100755 index e736fb43ff..0000000000 --- a/.buildkite/scripts/build-deps.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -set -eo pipefail -source "$(dirname "$0")/env.sh" -source "$(realpath $(dirname "$0")/../../scripts/all-dependencies.sh)" - -artifacts=( - libcrypto.a libssl.a libdecrepit.a - libcares.a - libarchive.a - liblolhtml.a - libmimalloc.a libmimalloc.o - libtcc.a - libz.a - libzstd.a - libdeflate.a - liblshpack.a -) - -for artifact in "${artifacts[@]}"; do - source "$(dirname "$0")/upload-artifact.sh" "build/bun-deps/$artifact" -done diff --git a/.buildkite/scripts/build-old-js.sh b/.buildkite/scripts/build-old-js.sh deleted file mode 100755 index 92484aebe1..0000000000 --- a/.buildkite/scripts/build-old-js.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -set -eo pipefail -source "$(dirname "$0")/env.sh" - -function assert_bun() { - if ! command -v bun &>/dev/null; then - echo "error: bun is not installed" 1>&2 - exit 1 - fi -} - -function assert_make() { - if ! command -v make &>/dev/null; then - echo "error: make is not installed" 1>&2 - exit 1 - fi -} - -function run_command() { - set -x - "$@" - { set +x; } 2>/dev/null -} - -function build_node_fallbacks() { - local cwd="src/node-fallbacks" - run_command bun install --cwd "$cwd" --frozen-lockfile - run_command bun run --cwd "$cwd" build -} - -function build_old_js() { - run_command bun install --frozen-lockfile - run_command make runtime_js fallback_decoder bun_error -} - -assert_bun -assert_make -build_node_fallbacks -build_old_js diff --git a/.buildkite/scripts/build-zig.sh b/.buildkite/scripts/build-zig.sh deleted file mode 100755 index 2feb257bfc..0000000000 --- a/.buildkite/scripts/build-zig.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -export CMAKE_FLAGS="" -source "$(dirname "$0")/env.sh" - -if [[ -n "$CMAKE_FLAGS" ]]; then - echo "CMAKE_FLAGS should not be empty" - exit 1 -fi - -function assert_target() { - local arch="${2-$(uname -m)}" - case "$(echo "$arch" | tr '[:upper:]' '[:lower:]')" in - x64 | x86_64 | amd64) - export ZIG_ARCH="x86_64" - if [[ "$BUILDKITE_STEP_KEY" == *"baseline"* ]]; then - export ZIG_CPU_TARGET="nehalem" - else - export ZIG_CPU_TARGET="haswell" - fi - ;; - aarch64 | arm64) - export ZIG_ARCH="aarch64" - export ZIG_CPU_TARGET="native" - ;; - *) - echo "error: Unsupported architecture: $arch" 1>&2 - exit 1 - ;; - esac - local os="${1-$(uname -s)}" - case "$(echo "$os" | tr '[:upper:]' '[:lower:]')" in - linux) - export ZIG_OS="linux" - export ZIG_TARGET="$ZIG_ARCH-linux-gnu" - ;; - darwin) - export ZIG_OS="macos" - export ZIG_TARGET="$ZIG_ARCH-macos-none" - ;; - windows) - export ZIG_OS="windows" - export ZIG_TARGET="$ZIG_ARCH-windows-msvc" - ;; - *) - echo "error: Unsupported operating system: $os" 1>&2 - exit 1 - ;; - esac -} - -function run_command() { - set -x - "$@" - { set +x; } 2>/dev/null -} - -assert_target "$@" - -# Since the zig build depends on files from the zig submodule, -# make sure to update the submodule before building. -run_command git submodule update --init --recursive --progress --depth=1 --checkout src/deps/zig - -# TODO: Move these to be part of the CMake build -source "$(dirname "$0")/build-old-js.sh" - -cwd="$(pwd)" -mkdir -p build -cd build - -# in buildkite this script to compile for windows is run on a macos machine -# so the cmake windows detection for this logic is not ran -ZIG_OPTIMIZE="ReleaseFast" -if [[ "$ZIG_OS" == "windows" ]]; then - ZIG_OPTIMIZE="ReleaseSafe" -fi - -run_command cmake .. "${CMAKE_FLAGS[@]}" \ - -GNinja \ - -DNO_CONFIGURE_DEPENDS="1" \ - -DNO_CODEGEN="0" \ - -DWEBKIT_DIR="omit" \ - -DBUN_ZIG_OBJ_DIR="$cwd/build" \ - -DZIG_LIB_DIR="$cwd/src/deps/zig/lib" \ - -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" \ - -DARCH="$ZIG_ARCH" \ - -DCPU_TARGET="$ZIG_CPU_TARGET" \ - -DZIG_TARGET="$ZIG_TARGET" \ - -DUSE_LTO="$USE_LTO" \ - -DUSE_DEBUG_JSC="$USE_DEBUG_JSC" \ - -DCANARY="$CANARY" \ - -DZIG_OPTIMIZE="$ZIG_OPTIMIZE" \ - -DGIT_SHA="$GIT_SHA" - -export ONLY_ZIG="1" -run_command ninja "$cwd/build/bun-zig.o" -v -j "$CPUS" - -cd .. -source "$(dirname "$0")/upload-artifact.sh" "build/bun-zig.o" diff --git a/.buildkite/scripts/download-artifact.ps1 b/.buildkite/scripts/download-artifact.ps1 deleted file mode 100755 index 0504474077..0000000000 --- a/.buildkite/scripts/download-artifact.ps1 +++ /dev/null @@ -1,47 +0,0 @@ -param ( - [Parameter(Mandatory=$true)] - [string[]] $Paths, - [switch] $Split -) - -$ErrorActionPreference = "Stop" - -function Assert-Buildkite-Agent() { - if (-not (Get-Command "buildkite-agent" -ErrorAction SilentlyContinue)) { - Write-Error "Cannot find buildkite-agent, please install it: https://buildkite.com/docs/agent/v3/install" - exit 1 - } -} - -function Assert-Join-File() { - if (-not (Get-Command "Join-File" -ErrorAction SilentlyContinue)) { - Write-Error "Cannot find Join-File, please install it: https://www.powershellgallery.com/packages/FileSplitter/1.3" - exit 1 - } -} - -function Download-Buildkite-Artifact() { - param ( - [Parameter(Mandatory=$true)] - [string] $Path, - ) - if ($Split) { - & buildkite-agent artifact download "$Path.*" --debug --debug-http - Join-File -Path "$(Resolve-Path .)\$Path" -Verbose -DeletePartFiles - } else { - & buildkite-agent artifact download "$Path" --debug --debug-http - } - if (-not (Test-Path $Path)) { - Write-Error "Could not find artifact: $Path" - exit 1 - } -} - -Assert-Buildkite-Agent -if ($Split) { - Assert-Join-File -} - -foreach ($Path in $Paths) { - Download-Buildkite-Artifact $Path -} diff --git a/.buildkite/scripts/download-artifact.sh b/.buildkite/scripts/download-artifact.sh deleted file mode 100755 index 76b48535a0..0000000000 --- a/.buildkite/scripts/download-artifact.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -function assert_buildkite_agent() { - if ! command -v buildkite-agent &>/dev/null; then - echo "error: Cannot find buildkite-agent, please install it:" - echo "https://buildkite.com/docs/agent/v3/install" - exit 1 - fi -} - -function download_buildkite_artifact() { - # Check if at least one argument is provided - if [ $# -eq 0 ]; then - echo "error: No path provided for artifact download" - exit 1 - fi - - local path="$1" - shift - local split="0" - local args=() - - while [ $# -gt 0 ]; do - case "$1" in - --split) - split="1" - shift - ;; - *) - args+=("$1") - shift - ;; - esac - done - - if [ "$split" == "1" ]; then - run_command buildkite-agent artifact download "$path.*" . "${args[@]:-}" - run_command cat "$path".?? >"$path" - run_command rm -f "$path".?? - else - run_command buildkite-agent artifact download "$path" . "${args[@]:-}" - fi - - if [[ "$path" != *"*"* ]] && [ ! -f "$path" ]; then - echo "error: Could not find artifact: $path" - exit 1 - fi -} - -function run_command() { - set -x - "$@" - { set +x; } 2>/dev/null -} - -assert_buildkite_agent -download_buildkite_artifact "$@" diff --git a/.buildkite/scripts/env.sh b/.buildkite/scripts/env.sh deleted file mode 100755 index dfca30d6f2..0000000000 --- a/.buildkite/scripts/env.sh +++ /dev/null @@ -1,146 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -BUILDKITE_REPO=${BUILDKITE_REPO:-} -BUILDKITE_CLEAN_CHECKOUT=${BUILDKITE_CLEAN_CHECKOUT:-} -BUILDKITE_BRANCH=${BUILDKITE_BRANCH:-} -CCACHE_DIR=${CCACHE_DIR:-} -SCCACHE_DIR=${SCCACHE_DIR:-} -ZIG_LOCAL_CACHE_DIR=${ZIG_LOCAL_CACHE_DIR:-} -ZIG_GLOBAL_CACHE_DIR=${ZIG_GLOBAL_CACHE_DIR:-} -BUN_DEPS_CACHE_DIR=${BUN_DEPS_CACHE_DIR:-} -BUN_DEPS_CACHE_DIR=${BUN_DEPS_CACHE_DIR:-} -BUILDKITE_STEP_KEY=${BUILDKITE_STEP_KEY:-} - -ROOT_DIR="$(realpath "$(dirname "$0")/../../")" - -# Fail if we cannot find the root directory -if [ ! -d "$ROOT_DIR" ]; then - echo "error: Cannot find root directory: '$ROOT_DIR'" 1>&2 - exit 1 -fi - -function assert_os() { - local os="$(uname -s)" - case "$os" in - Linux) - echo "linux" - ;; - Darwin) - echo "darwin" - ;; - *) - echo "error: Unsupported operating system: $os" 1>&2 - exit 1 - ;; - esac -} - -function assert_arch() { - local arch="$(uname -m)" - case "$arch" in - aarch64 | arm64) - echo "aarch64" - ;; - x86_64 | amd64) - echo "x64" - ;; - *) - echo "error: Unknown architecture: $arch" 1>&2 - exit 1 - ;; - esac -} - -function assert_build() { - if [ -z "$BUILDKITE_REPO" ]; then - echo "error: Cannot find repository for this build" - exit 1 - fi - if [ -z "$BUILDKITE_COMMIT" ]; then - echo "error: Cannot find commit for this build" - exit 1 - fi - if [ -z "$BUILDKITE_STEP_KEY" ]; then - echo "error: Cannot find step key for this build" - exit 1 - fi - if [ -n "$BUILDKITE_GROUP_KEY" ] && [[ "$BUILDKITE_STEP_KEY" != "$BUILDKITE_GROUP_KEY"* ]]; then - echo "error: Build step '$BUILDKITE_STEP_KEY' does not start with group key '$BUILDKITE_GROUP_KEY'" - exit 1 - fi - # Skip os and arch checks for Zig, since it's cross-compiled on macOS - if [[ "$BUILDKITE_STEP_KEY" != *"zig"* ]]; then - local os="$(assert_os)" - if [[ "$BUILDKITE_STEP_KEY" != *"$os"* ]]; then - echo "error: Build step '$BUILDKITE_STEP_KEY' does not match operating system '$os'" - exit 1 - fi - local arch="$(assert_arch)" - if [[ "$BUILDKITE_STEP_KEY" != *"$arch"* ]]; then - echo "error: Build step '$BUILDKITE_STEP_KEY' does not match architecture '$arch'" - exit 1 - fi - fi -} - -function assert_buildkite_agent() { - if (! command -v buildkite-agent &>/dev/null); then - echo "error: Cannot find buildkite-agent, please install it:" - echo "https://buildkite.com/docs/agent/v3/install" - exit 1 - fi -} - -function export_environment() { - source "${ROOT_DIR}/scripts/env.sh" - source "${ROOT_DIR}/scripts/update-submodules.sh" - - { set +x; } 2>/dev/null - export GIT_SHA="$BUILDKITE_COMMIT" - if [ "$BUILDKITE_CLEAN_CHECKOUT" == "true" ] || [ "$BUILDKITE_BRANCH" == "main" ]; then - local tmpdir="$(mktemp -d 2>/dev/null || mktemp -d -t 'new')" - export CCACHE_DIR="$tmpdir/.cache/ccache" - export SCCACHE_DIR="$tmpdir/.cache/sccache" - export ZIG_LOCAL_CACHE_DIR="$tmpdir/.cache/zig-cache" - export ZIG_GLOBAL_CACHE_DIR="$tmpdir/.cache/zig-cache" - export BUN_DEPS_CACHE_DIR="$tmpdir/.cache/bun-deps" - export CCACHE_RECACHE="1" - else - export CCACHE_DIR="$HOME/.cache/ccache/$BUILDKITE_STEP_KEY" - export SCCACHE_DIR="$HOME/.cache/sccache/$BUILDKITE_STEP_KEY" - export ZIG_LOCAL_CACHE_DIR="$HOME/.cache/zig-cache/$BUILDKITE_STEP_KEY" - export ZIG_GLOBAL_CACHE_DIR="$HOME/.cache/zig-cache/$BUILDKITE_STEP_KEY" - export BUN_DEPS_CACHE_DIR="$HOME/.cache/bun-deps/$BUILDKITE_STEP_KEY" - fi - if [ "$(assert_os)" == "linux" ]; then - export USE_LTO="ON" - fi - if [ "$(assert_arch)" == "aarch64" ]; then - export CPU_TARGET="native" - elif [[ "$BUILDKITE_STEP_KEY" == *"baseline"* ]]; then - export CPU_TARGET="nehalem" - else - export CPU_TARGET="haswell" - fi - if $(buildkite-agent meta-data exists release &>/dev/null); then - export CMAKE_BUILD_TYPE="$(buildkite-agent meta-data get release)" - else - export CMAKE_BUILD_TYPE="Release" - fi - if $(buildkite-agent meta-data exists canary &>/dev/null); then - export CANARY="$(buildkite-agent meta-data get canary)" - else - export CANARY="1" - fi - if $(buildkite-agent meta-data exists assertions &>/dev/null); then - export USE_DEBUG_JSC="$(buildkite-agent meta-data get assertions)" - else - export USE_DEBUG_JSC="OFF" - fi -} - -assert_build -assert_buildkite_agent -export_environment diff --git a/.buildkite/scripts/prepare-build.sh b/.buildkite/scripts/prepare-build.sh deleted file mode 100755 index 1c245d9618..0000000000 --- a/.buildkite/scripts/prepare-build.sh +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash - -set -eo pipefail - -function assert_build() { - if [ -z "$BUILDKITE_REPO" ]; then - echo "error: Cannot find repository for this build" - exit 1 - fi - if [ -z "$BUILDKITE_COMMIT" ]; then - echo "error: Cannot find commit for this build" - exit 1 - fi -} - -function assert_buildkite_agent() { - if ! command -v buildkite-agent &> /dev/null; then - echo "error: Cannot find buildkite-agent, please install it:" - echo "https://buildkite.com/docs/agent/v3/install" - exit 1 - fi -} - -function assert_jq() { - assert_command "jq" "jq" "https://stedolan.github.io/jq/" -} - -function assert_curl() { - assert_command "curl" "curl" "https://curl.se/download.html" -} - -function assert_command() { - local command="$1" - local package="$2" - local help_url="$3" - if ! command -v "$command" &> /dev/null; then - echo "warning: $command is not installed, installing..." - if command -v brew &> /dev/null; then - HOMEBREW_NO_AUTO_UPDATE=1 brew install "$package" - else - echo "error: Cannot install $command, please install it" - if [ -n "$help_url" ]; then - echo "" - echo "hint: See $help_url for help" - fi - exit 1 - fi - fi -} - -function assert_release() { - if [ "$RELEASE" == "1" ]; then - run_command buildkite-agent meta-data set canary "0" - fi -} - -function assert_canary() { - local canary="$(buildkite-agent meta-data get canary 2>/dev/null)" - if [ -z "$canary" ]; then - local repo=$(echo "$BUILDKITE_REPO" | sed -E 's#https://github.com/([^/]+)/([^/]+).git#\1/\2#g') - local tag="$(curl -sL "https://api.github.com/repos/$repo/releases/latest" | jq -r ".tag_name")" - if [ "$tag" == "null" ]; then - canary="1" - else - local revision=$(curl -sL "https://api.github.com/repos/$repo/compare/$tag...$BUILDKITE_COMMIT" | jq -r ".ahead_by") - if [ "$revision" == "null" ]; then - canary="1" - else - canary="$revision" - fi - fi - run_command buildkite-agent meta-data set canary "$canary" - fi -} - -function upload_buildkite_pipeline() { - local path="$1" - if [ ! -f "$path" ]; then - echo "error: Cannot find pipeline: $path" - exit 1 - fi - run_command buildkite-agent pipeline upload "$path" -} - -function run_command() { - set -x - "$@" - { set +x; } 2>/dev/null -} - -assert_build -assert_buildkite_agent -assert_jq -assert_curl -assert_release -assert_canary -upload_buildkite_pipeline ".buildkite/ci.yml" diff --git a/.buildkite/scripts/upload-artifact.ps1 b/.buildkite/scripts/upload-artifact.ps1 deleted file mode 100755 index b7d79a410b..0000000000 --- a/.buildkite/scripts/upload-artifact.ps1 +++ /dev/null @@ -1,47 +0,0 @@ -param ( - [Parameter(Mandatory=$true)] - [string[]] $Paths, - [switch] $Split -) - -$ErrorActionPreference = "Stop" - -function Assert-Buildkite-Agent() { - if (-not (Get-Command "buildkite-agent" -ErrorAction SilentlyContinue)) { - Write-Error "Cannot find buildkite-agent, please install it: https://buildkite.com/docs/agent/v3/install" - exit 1 - } -} - -function Assert-Split-File() { - if (-not (Get-Command "Split-File" -ErrorAction SilentlyContinue)) { - Write-Error "Cannot find Split-File, please install it: https://www.powershellgallery.com/packages/FileSplitter/1.3" - exit 1 - } -} - -function Upload-Buildkite-Artifact() { - param ( - [Parameter(Mandatory=$true)] - [string] $Path, - ) - if (-not (Test-Path $Path)) { - Write-Error "Could not find artifact: $Path" - exit 1 - } - if ($Split) { - Remove-Item -Path "$Path.*" -Force - Split-File -Path (Resolve-Path $Path) -PartSizeBytes "50MB" -Verbose - $Path = "$Path.*" - } - & buildkite-agent artifact upload "$Path" --debug --debug-http -} - -Assert-Buildkite-Agent -if ($Split) { - Assert-Split-File -} - -foreach ($Path in $Paths) { - Upload-Buildkite-Artifact $Path -} diff --git a/.buildkite/scripts/upload-artifact.sh b/.buildkite/scripts/upload-artifact.sh deleted file mode 100755 index ec3628de64..0000000000 --- a/.buildkite/scripts/upload-artifact.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -function assert_buildkite_agent() { - if ! command -v buildkite-agent &>/dev/null; then - echo "error: Cannot find buildkite-agent, please install it:" - echo "https://buildkite.com/docs/agent/v3/install" - exit 1 - fi -} - -function assert_split() { - if ! command -v split &>/dev/null; then - echo "error: Cannot find split, please install it:" - echo "https://www.gnu.org/software/coreutils/split" - exit 1 - fi -} - -function upload_buildkite_artifact() { - if [ -z "${1:-}" ]; then - return - fi - - local path="$1" - shift - local split="0" - local args=() # Initialize args as an empty array - while true; do - if [ -z "${1:-}" ]; then - break - fi - case "$1" in - --split) - split="1" - shift - ;; - *) - args+=("$1") - shift - ;; - esac - done - if [ ! -f "$path" ]; then - echo "error: Could not find artifact: $path" - exit 1 - fi - if [ "$split" == "1" ]; then - run_command rm -f "$path."* - run_command split -b 50MB -d "$path" "$path." - if [ "${args[@]:-}" != "" ]; then - run_command buildkite-agent artifact upload "$path.*" "${args[@]}" - else - run_command buildkite-agent artifact upload "$path.*" - fi - elif [ "${args[@]:-}" != "" ]; then - run_command buildkite-agent artifact upload "$path" "${args[@]:-}" - else - run_command buildkite-agent artifact upload "$path" - fi -} - -function run_command() { - set -x - "$@" - { set +x; } 2>/dev/null -} - -assert_buildkite_agent -upload_buildkite_artifact "$@" diff --git a/.buildkite/scripts/upload-benchmark.ts b/.buildkite/scripts/upload-benchmark.ts new file mode 100644 index 0000000000..eb98acd464 --- /dev/null +++ b/.buildkite/scripts/upload-benchmark.ts @@ -0,0 +1,7 @@ +import { getCommit, getSecret } from "../../scripts/utils.mjs"; + +console.log("Submitting..."); +const response = await fetch(getSecret("BENCHMARK_URL") + "?tag=_&commit=" + getCommit() + "&artifact_url=_", { + method: "POST", +}); +console.log("Got status " + response.status); diff --git a/.buildkite/scripts/upload-release.sh b/.buildkite/scripts/upload-release.sh index 68b9af307c..e3198479cf 100755 --- a/.buildkite/scripts/upload-release.sh +++ b/.buildkite/scripts/upload-release.sh @@ -3,10 +3,6 @@ set -eo pipefail function assert_main() { - if [ "$RELEASE" == "1" ]; then - echo "info: Skipping canary release because this is a release build" - exit 0 - fi if [ -z "$BUILDKITE_REPO" ]; then echo "error: Cannot find repository for this build" exit 1 @@ -162,6 +158,38 @@ function upload_s3_file() { run_command aws --endpoint-url="$AWS_ENDPOINT" s3 cp "$file" "s3://$AWS_BUCKET/$folder/$file" } +function send_discord_announcement() { + local value=$(buildkite-agent secret get "BUN_ANNOUNCE_CANARY_WEBHOOK_URL") + if [ -z "$value" ]; then + echo "warn: BUN_ANNOUNCE_CANARY_WEBHOOK_URL not set, skipping Discord announcement" + return + fi + + local version="$1" + local commit="$BUILDKITE_COMMIT" + local short_sha="${commit:0:7}" + local commit_url="https://github.com/oven-sh/bun/commit/$commit" + + if [ "$version" == "canary" ]; then + local json_payload=$(cat </dev/null + fi +} + function create_release() { assert_main assert_buildkite_agent @@ -173,14 +201,18 @@ function create_release() { local artifacts=( bun-darwin-aarch64.zip bun-darwin-aarch64-profile.zip - bun-darwin-x64.zip - bun-darwin-x64-profile.zip bun-linux-aarch64.zip bun-linux-aarch64-profile.zip bun-linux-x64.zip bun-linux-x64-profile.zip bun-linux-x64-baseline.zip bun-linux-x64-baseline-profile.zip + bun-linux-aarch64-musl.zip + bun-linux-aarch64-musl-profile.zip + bun-linux-x64-musl.zip + bun-linux-x64-musl-profile.zip + bun-linux-x64-musl-baseline.zip + bun-linux-x64-musl-baseline-profile.zip bun-windows-x64.zip bun-windows-x64-profile.zip bun-windows-x64-baseline.zip @@ -206,11 +238,11 @@ function create_release() { update_github_release "$tag" create_sentry_release "$tag" + send_discord_announcement "$tag" } function assert_canary() { - local canary="$(buildkite-agent meta-data get canary 2>/dev/null)" - if [ -z "$canary" ] || [ "$canary" == "0" ]; then + if [ -z "$CANARY" ] || [ "$CANARY" == "0" ]; then echo "warn: Skipping release because this is not a canary build" exit 0 fi diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000000..56bea1f588 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,9 @@ +WarningsAsErrors: "*" +FormatStyle: webkit +Checks: > + -*, + clang-analyzer-*, + -clang-analyzer-optin.core.EnumCastOutOfRange + -clang-analyzer-webkit.UncountedLambdaCapturesChecker + -clang-analyzer-optin.core.EnumCastOutOfRange + -clang-analyzer-webkit.RefCntblBaseVirtualDtor diff --git a/.clangd b/.clangd index 35856fb414..b0ceeaa684 100644 --- a/.clangd +++ b/.clangd @@ -1,3 +1,8 @@ Index: Background: Skip # Disable slow background indexing of these files. +CompileFlags: + CompilationDatabase: build/debug + +Diagnostics: + UnusedIncludes: None diff --git a/.cursor/rules/building-bun.mdc b/.cursor/rules/building-bun.mdc new file mode 100644 index 0000000000..28f86a9f17 --- /dev/null +++ b/.cursor/rules/building-bun.mdc @@ -0,0 +1,27 @@ +--- +description: How to build Bun +globs: +--- +# How to build Bun + +## CMake + +Bun is built using CMake, which you can find in `CMakeLists.txt` and in the `cmake/` directory. + +* `CMakeLists.txt` +* `cmake/` + * `Globals.cmake` - macros and functions used by all the other files + * `Options.cmake` - build options for configuring the build (e.g. debug/release mode) + * `CompilerFlags.cmake` - compiler and linker flags used by all the targets + * `tools/` - setup scripts for various build tools (e.g. llvm, zig, webkit, rust, etc.) + * `targets/` - targets for bun and its dependencies (e.g. brotli, boringssl, libuv, etc.) + +## How to + +There are `package.json` scripts that make it easy to build Bun without calling CMake directly, for example: + +```sh +bun run build # builds a debug build: `build/debug/bun-debug` +bun run build:release # builds a release build: `build/release/bun` +bun run build:assert # builds a release build with debug assertions: `build/assert/bun` +``` diff --git a/.cursor/rules/dev-server-tests.mdc b/.cursor/rules/dev-server-tests.mdc new file mode 100644 index 0000000000..dfdaf41cd5 --- /dev/null +++ b/.cursor/rules/dev-server-tests.mdc @@ -0,0 +1,139 @@ +--- +description: Writing HMR/Dev Server tests +globs: test/bake/* +--- + +# Writing HMR/Dev Server tests + +Dev server tests validate that hot-reloading is robust, correct, and reliable. Remember to write thorough, yet concise tests. + +## File Structure + +- `test/bake/bake-harness.ts` - shared utilities and test harness + - primary test functions `devTest` / `prodTest` / `devAndProductionTest` + - class `Dev` (controls subprocess for dev server) + - class `Client` (controls a happy-dom subprocess for having the page open) + - more helpers +- `test/bake/client-fixture.mjs` - subprocess for what `Client` controls. it loads a page and uses IPC to query parts of the page, run javascript, and much more. +- `test/bake/dev/*.test.ts` - these call `devTest` to test dev server and hot reloading +- `test/bake/dev-and-prod.ts` - these use `devAndProductionTest` to run the same test on dev and production mode. these tests cannot really test hot reloading for obvious reasons. + +## Categories + +bundle.test.ts - Bundle tests are tests concerning bundling bugs that only occur in DevServer. +css.test.ts - CSS tests concern bundling bugs with CSS files +plugins.test.ts - Plugin tests concern plugins in development mode. +ecosystem.test.ts - These tests involve ensuring certain libraries are correct. It is preferred to test more concrete bugs than testing entire packages. +esm.test.ts - ESM tests are about various esm features in development mode. +html.test.ts - HTML tests are tests relating to HTML files themselves. +react-spa.test.ts - Tests relating to React, our react-refresh transform, and basic server component transforms. +sourcemap.test.ts - Tests verifying source-maps are correct. + +## `devTest` Basics + +A test takes in two primary inputs: `files` and `async test(dev) {` + +```ts +import { devTest, emptyHtmlFile } from "../bake-harness"; + +devTest("html file is watched", { + files: { + "index.html": emptyHtmlFile({ + scripts: ["/script.ts"], + body: "

Hello

", + }), + "script.ts": ` + console.log("hello"); + `, + }, + async test(dev) { + await dev.fetch("/").expect.toInclude("

Hello

"); + await dev.fetch("/").expect.toInclude("

Hello

"); + await dev.patch("index.html", { + find: "Hello", + replace: "World", + }); + await dev.fetch("/").expect.toInclude("

World

"); + + // Works + await using c = await dev.client("/"); + await c.expectMessage("hello"); + + // Editing HTML reloads + await c.expectReload(async () => { + await dev.patch("index.html", { + find: "World", + replace: "Hello", + }); + await dev.fetch("/").expect.toInclude("

Hello

"); + }); + await c.expectMessage("hello"); + + await c.expectReload(async () => { + await dev.patch("index.html", { + find: "Hello", + replace: "Bar", + }); + await dev.fetch("/").expect.toInclude("

Bar

"); + }); + await c.expectMessage("hello"); + + await c.expectReload(async () => { + await dev.patch("script.ts", { + find: "hello", + replace: "world", + }); + }); + await c.expectMessage("world"); + }, +}); +``` + +`files` holds the initial state, and the callback runs with the server running. `dev.fetch()` runs HTTP requests, while `dev.client()` opens a browser instance to the code. + +Functions `dev.write` and `dev.patch` and `dev.delete` mutate the filesystem. Do not use `node:fs` APIs, as the dev server ones are hooked to wait for hot-reload, and all connected clients to recieve changes. + +When a change performs a hard-reload, that must be explicitly annotated with `expectReload`. This tells `client-fixture.mjs` that the test is meant to reload the page once; All other hard reloads automatically fail the test. + +Client's have `console.log` instrumented, so that any unasserted logs fail the test. This makes it more obvious when an extra reload or re-evaluation. Messages are awaited via `c.expectMessage("log")` or with multiple arguments if there are multiple logs. + +## Testing for bundling errors + +By default, a client opening a page to an error will fail the test. This makes testing errors explicit. + +```ts +devTest("import then create", { + files: { + "index.html": ` + + + + + + + + `, + "script.ts": ` + import data from "./data"; + console.log(data); + `, + }, + async test(dev) { + const c = await dev.client("/", { + errors: ['script.ts:1:18: error: Could not resolve: "./data"'], + }); + await c.expectReload(async () => { + await dev.write("data.ts", "export default 'data';"); + }); + await c.expectMessage("data"); + }, +}); +``` + +Many functions take an options value to allow specifying it will produce errors. For example, this delete is going to cause a resolution failure. + +```ts +await dev.delete("other.ts", { + errors: ['index.ts:1:16: error: Could not resolve: "./other"'], +}); +``` diff --git a/.cursor/rules/javascriptcore-class.mdc b/.cursor/rules/javascriptcore-class.mdc new file mode 100644 index 0000000000..de5a088f7b --- /dev/null +++ b/.cursor/rules/javascriptcore-class.mdc @@ -0,0 +1,408 @@ +--- +description: JavaScript class implemented in C++ +globs: *.cpp +--- + +# Implementing JavaScript classes in C++ + +If there is a publicly accessible Constructor and Prototype, then there are 3 classes: + +- IF there are C++ class members we need a destructor, so `class Foo : public JSC::DestructibleObject`, if no C++ class fields (only JS properties) then we don't need a class at all usually. We can instead use JSC::constructEmptyObject(vm, structure) and `putDirectOffset` like in [NodeFSBinding.cpp](mdc:src/bun.js/bindings/NodeFSBinding.cpp). +- class FooPrototype : public JSC::JSNonFinalObject +- class FooConstructor : public JSC::InternalFunction + +If there is no publicly accessible Constructor, just the Prototype and the class is necessary. In some cases, we can avoid the prototype entirely (but that's rare). + +If there are C++ fields on the Foo class, the Foo class will need an iso subspace added to [DOMClientIsoSubspaces.h](mdc:src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h) and [DOMIsoSubspaces.h](mdc:src/bun.js/bindings/webcore/DOMIsoSubspaces.h). Prototype and Constructor do not need subspaces. + +Usually you'll need to #include "root.h" at the top of C++ files or you'll get lint errors. + +Generally, defining the subspace looks like this: +```c++ + +class Foo : public JSC::DestructibleObject { + +// ... + + template + static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm) + { + if constexpr (mode == JSC::SubspaceAccess::Concurrently) + return nullptr; + return WebCore::subspaceForImpl( + vm, + [](auto& spaces) { return spaces.m_clientSubspaceFor${MyClassT}.get(); }, + [](auto& spaces, auto&& space) { spaces.m_clientSubspaceFor${MyClassT} = std::forward(space); }, + [](auto& spaces) { return spaces.m_subspaceFo${MyClassT}.get(); }, + [](auto& spaces, auto&& space) { spaces.m_subspaceFor${MyClassT} = std::forward(space); }); + } + + +``` + +It's better to put it in the .cpp file instead of the .h file, when possible. + +## Defining properties + +Define properties on the prototype. Use a const HashTableValues like this: +```C++ +static JSC_DECLARE_HOST_FUNCTION(jsX509CertificateProtoFuncCheckEmail); +static JSC_DECLARE_HOST_FUNCTION(jsX509CertificateProtoFuncCheckHost); +static JSC_DECLARE_HOST_FUNCTION(jsX509CertificateProtoFuncCheckIP); +static JSC_DECLARE_HOST_FUNCTION(jsX509CertificateProtoFuncCheckIssued); +static JSC_DECLARE_HOST_FUNCTION(jsX509CertificateProtoFuncCheckPrivateKey); +static JSC_DECLARE_HOST_FUNCTION(jsX509CertificateProtoFuncToJSON); +static JSC_DECLARE_HOST_FUNCTION(jsX509CertificateProtoFuncToLegacyObject); +static JSC_DECLARE_HOST_FUNCTION(jsX509CertificateProtoFuncToString); +static JSC_DECLARE_HOST_FUNCTION(jsX509CertificateProtoFuncVerify); + +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_ca); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_fingerprint); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_fingerprint256); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_fingerprint512); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_subject); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_subjectAltName); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_infoAccess); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_keyUsage); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_issuer); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_issuerCertificate); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_publicKey); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_raw); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_serialNumber); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_validFrom); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_validTo); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_validFromDate); +static JSC_DECLARE_CUSTOM_GETTER(jsX509CertificateGetter_validToDate); + +static const HashTableValue JSX509CertificatePrototypeTableValues[] = { + { "ca"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_ca, 0 } }, + { "checkEmail"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, jsX509CertificateProtoFuncCheckEmail, 2 } }, + { "checkHost"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, jsX509CertificateProtoFuncCheckHost, 2 } }, + { "checkIP"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, jsX509CertificateProtoFuncCheckIP, 1 } }, + { "checkIssued"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, jsX509CertificateProtoFuncCheckIssued, 1 } }, + { "checkPrivateKey"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, jsX509CertificateProtoFuncCheckPrivateKey, 1 } }, + { "fingerprint"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_fingerprint, 0 } }, + { "fingerprint256"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_fingerprint256, 0 } }, + { "fingerprint512"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_fingerprint512, 0 } }, + { "infoAccess"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_infoAccess, 0 } }, + { "issuer"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_issuer, 0 } }, + { "issuerCertificate"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_issuerCertificate, 0 } }, + { "keyUsage"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_keyUsage, 0 } }, + { "publicKey"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_publicKey, 0 } }, + { "raw"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_raw, 0 } }, + { "serialNumber"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_serialNumber, 0 } }, + { "subject"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_subject, 0 } }, + { "subjectAltName"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_subjectAltName, 0 } }, + { "toJSON"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, jsX509CertificateProtoFuncToJSON, 0 } }, + { "toLegacyObject"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, jsX509CertificateProtoFuncToLegacyObject, 0 } }, + { "toString"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, jsX509CertificateProtoFuncToString, 0 } }, + { "validFrom"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_validFrom, 0 } }, + { "validFromDate"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessorOrValue), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_validFromDate, 0 } }, + { "validTo"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessor), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_validTo, 0 } }, + { "validToDate"_s, static_cast(PropertyAttribute::ReadOnly | PropertyAttribute::CustomAccessorOrValue), NoIntrinsic, { HashTableValue::GetterSetterType, jsX509CertificateGetter_validToDate, 0 } }, + { "verify"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, jsX509CertificateProtoFuncVerify, 1 } }, +}; +``` + +### Creating a prototype class + +Follow a pattern like this: + +```c++ +class JSX509CertificatePrototype final : public JSC::JSNonFinalObject { +public: + using Base = JSC::JSNonFinalObject; + static constexpr unsigned StructureFlags = Base::StructureFlags; + + static JSX509CertificatePrototype* create(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure) + { + JSX509CertificatePrototype* prototype = new (NotNull, allocateCell(vm)) JSX509CertificatePrototype(vm, structure); + prototype->finishCreation(vm); + return prototype; + } + + template + static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm) + { + return &vm.plainObjectSpace(); + } + + DECLARE_INFO; + + static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype) + { + auto* structure = JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info()); + structure->setMayBePrototype(true); + return structure; + } + +private: + JSX509CertificatePrototype(JSC::VM& vm, JSC::Structure* structure) + : Base(vm, structure) + { + } + + void finishCreation(JSC::VM& vm); +}; + +const ClassInfo JSX509CertificatePrototype::s_info = { "X509Certificate"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSX509CertificatePrototype) }; + +void JSX509CertificatePrototype::finishCreation(VM& vm) +{ + Base::finishCreation(vm); + reifyStaticProperties(vm, JSX509Certificate::info(), JSX509CertificatePrototypeTableValues, *this); + JSC_TO_STRING_TAG_WITHOUT_TRANSITION(); +} + +} // namespace Bun +``` + +### Getter definition: +```C++ + +JSC_DEFINE_CUSTOM_GETTER(jsX509CertificateGetter_ca, (JSGlobalObject * globalObject, EncodedJSValue thisValue, PropertyName)) +{ + VM& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + + JSX509Certificate* thisObject = jsDynamicCast(JSValue::decode(thisValue)); + if (UNLIKELY(!thisObject)) { + Bun::throwThisTypeError(*globalObject, scope, "JSX509Certificate"_s, "ca"_s); + return {}; + } + + return JSValue::encode(jsBoolean(thisObject->view().isCA())); +} +``` + +### Setter definition + +```C++ +JSC_DEFINE_CUSTOM_SETTER(jsImportMetaObjectSetter_require, (JSGlobalObject * jsGlobalObject, JSC::EncodedJSValue thisValue, JSC::EncodedJSValue encodedValue, PropertyName propertyName)) +{ + ImportMetaObject* thisObject = jsDynamicCast(JSValue::decode(thisValue)); + if (UNLIKELY(!thisObject)) + return false; + + JSValue value = JSValue::decode(encodedValue); + if (!value.isCell()) { + // TODO: + return true; + } + + thisObject->requireProperty.set(thisObject->vm(), thisObject, value.asCell()); + return true; +} +``` + +### Function definition + +```C++ +JSC_DEFINE_HOST_FUNCTION(jsX509CertificateProtoFuncToJSON, (JSGlobalObject * globalObject, CallFrame* callFrame)) +{ + VM& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + auto *thisObject = jsDynamicCast(callFrame->thisValue()); + if (UNLIKELY(!thisObject)) { + Bun::throwThisTypeError(*globalObject, scope, "MyClass"_s, "myFunctionName"_s); + return {}; + } + + return JSValue::encode(functionThatReturnsJSValue(vm, globalObject, thisObject)); +} +``` + + +### Constructor definition + +```C++ + +JSC_DECLARE_HOST_FUNCTION(callStats); +JSC_DECLARE_HOST_FUNCTION(constructStats); + +class JSStatsConstructor final : public JSC::InternalFunction { +public: + using Base = JSC::InternalFunction; + static constexpr unsigned StructureFlags = Base::StructureFlags; + + static JSStatsConstructor* create(JSC::VM& vm, JSC::Structure* structure, JSC::JSObject* prototype) + { + JSStatsConstructor* constructor = new (NotNull, JSC::allocateCell(vm)) JSStatsConstructor(vm, structure); + constructor->finishCreation(vm, prototype); + return constructor; + } + + DECLARE_INFO; + + template + static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm) + { + return &vm.internalFunctionSpace(); + } + + static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype) + { + return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::InternalFunctionType, StructureFlags), info()); + } + +private: + JSStatsConstructor(JSC::VM& vm, JSC::Structure* structure) + : Base(vm, structure, callStats, constructStats) + { + } + + void finishCreation(JSC::VM& vm, JSC::JSObject* prototype) + { + Base::finishCreation(vm, 0, "Stats"_s); + putDirectWithoutTransition(vm, vm.propertyNames->prototype, prototype, JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly); + } +}; +``` + + +### Structure caching + +If there's a class, prototype, and constructor: + +1. Add the `JSC::LazyClassStructure` to [ZigGlobalObject.h](mdc:src/bun.js/bindings/ZigGlobalObject.h) +2. Initialize the class structure in [ZigGlobalObject.cpp](mdc:src/bun.js/bindings/ZigGlobalObject.cpp) in `void GlobalObject::finishCreation(VM& vm)` +3. Visit the class structure in visitChildren in [ZigGlobalObject.cpp](mdc:src/bun.js/bindings/ZigGlobalObject.cpp) in `void GlobalObject::visitChildrenImpl` + +```c++#ZigGlobalObject.cpp +void GlobalObject::finishCreation(VM& vm) { +// ... + m_JSStatsBigIntClassStructure.initLater( + [](LazyClassStructure::Initializer& init) { + // Call the function to initialize our class structure. + Bun::initJSBigIntStatsClassStructure(init); + }); +``` + +Then, implement the function that creates the structure: +```c++ +void setupX509CertificateClassStructure(LazyClassStructure::Initializer& init) +{ + auto* prototypeStructure = JSX509CertificatePrototype::createStructure(init.vm, init.global, init.global->objectPrototype()); + auto* prototype = JSX509CertificatePrototype::create(init.vm, init.global, prototypeStructure); + + auto* constructorStructure = JSX509CertificateConstructor::createStructure(init.vm, init.global, init.global->functionPrototype()); + + auto* constructor = JSX509CertificateConstructor::create(init.vm, init.global, constructorStructure, prototype); + + auto* structure = JSX509Certificate::createStructure(init.vm, init.global, prototype); + init.setPrototype(prototype); + init.setStructure(structure); + init.setConstructor(constructor); +} +``` + +If there's only a class, use `JSC::LazyProperty` instead of `JSC::LazyClassStructure`: + +1. Add the `JSC::LazyProperty` to @ZigGlobalObject.h +2. Initialize the class structure in @ZigGlobalObject.cpp in `void GlobalObject::finishCreation(VM& vm)` +3. Visit the lazy property in visitChildren in @ZigGlobalObject.cpp in `void GlobalObject::visitChildrenImpl` +void GlobalObject::finishCreation(VM& vm) { +// ... + this.m_myLazyProperty.initLater([](const JSC::LazyProperty::Initializer& init) { + init.set(Bun::initMyStructure(init.vm, reinterpret_cast(init.owner))); + }); +``` + +Then, implement the function that creates the structure: +```c++ +Structure* setupX509CertificateStructure(JSC::VM &vm, Zig::GlobalObject* globalObject) +{ + // If there is a prototype: + auto* prototypeStructure = JSX509CertificatePrototype::createStructure(init.vm, init.global, init.global->objectPrototype()); + auto* prototype = JSX509CertificatePrototype::create(init.vm, init.global, prototypeStructure); + + // If there is no prototype or it only has + + auto* structure = JSX509Certificate::createStructure(init.vm, init.global, prototype); + init.setPrototype(prototype); + init.setStructure(structure); + init.setConstructor(constructor); +} +``` + + +Then, use the structure by calling `globalObject.m_myStructureName.get(globalObject)` + +```C++ +JSC_DEFINE_HOST_FUNCTION(x509CertificateConstructorConstruct, (JSGlobalObject * globalObject, CallFrame* callFrame)) +{ + VM& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + + if (!callFrame->argumentCount()) { + Bun::throwError(globalObject, scope, ErrorCode::ERR_MISSING_ARGS, "X509Certificate constructor requires at least one argument"_s); + return {}; + } + + JSValue arg = callFrame->uncheckedArgument(0); + if (!arg.isCell()) { + Bun::throwError(globalObject, scope, ErrorCode::ERR_INVALID_ARG_TYPE, "X509Certificate constructor argument must be a Buffer, TypedArray, or string"_s); + return {}; + } + + auto* zigGlobalObject = defaultGlobalObject(globalObject); + Structure* structure = zigGlobalObject->m_JSX509CertificateClassStructure.get(zigGlobalObject); + JSValue newTarget = callFrame->newTarget(); + if (UNLIKELY(zigGlobalObject->m_JSX509CertificateClassStructure.constructor(zigGlobalObject) != newTarget)) { + auto scope = DECLARE_THROW_SCOPE(vm); + if (!newTarget) { + throwTypeError(globalObject, scope, "Class constructor X509Certificate cannot be invoked without 'new'"_s); + return {}; + } + + auto* functionGlobalObject = defaultGlobalObject(getFunctionRealm(globalObject, newTarget.getObject())); + RETURN_IF_EXCEPTION(scope, {}); + structure = InternalFunction::createSubclassStructure( + globalObject, newTarget.getObject(), functionGlobalObject->NodeVMScriptStructure()); + scope.release(); + } + + return JSValue::encode(createX509Certificate(vm, globalObject, structure, arg)); +} +``` + +### Expose to Zig + +To expose the constructor to zig: + +```c++ +extern "C" JSC::EncodedJSValue Bun__JSBigIntStatsObjectConstructor(Zig::GlobalObject* globalobject) +{ + return JSValue::encode(globalobject->m_JSStatsBigIntClassStructure.constructor(globalobject)); +} +``` + +Zig: +```zig +extern "c" fn Bun__JSBigIntStatsObjectConstructor(*JSC.JSGlobalObject) JSC.JSValue; +pub const getBigIntStatsConstructor = Bun__JSBigIntStatsObjectConstructor; +``` + +To create an object (instance) of a JS class defined in C++ from Zig, follow the __toJS convention like this: +```c++ +// X509* is whatever we need to create the object +extern "C" EncodedJSValue Bun__X509__toJS(Zig::GlobalObject* globalObject, X509* cert) +{ + // ... implementation details + auto* structure = globalObject->m_JSX509CertificateClassStructure.get(globalObject); + return JSValue::encode(JSX509Certificate::create(globalObject->vm(), structure, globalObject, WTFMove(cert))); +} +``` + +And from Zig: +```zig +const X509 = opaque { + // ... class + + extern fn Bun__X509__toJS(*JSC.JSGlobalObject, *X509) JSC.JSValue; + + pub fn toJS(this: *X509, globalObject: *JSC.JSGlobalObject) JSC.JSValue { + return Bun__X509__toJS(globalObject, this); + } +}; +``` diff --git a/.cursor/rules/writing-tests.mdc b/.cursor/rules/writing-tests.mdc new file mode 100644 index 0000000000..4905019005 --- /dev/null +++ b/.cursor/rules/writing-tests.mdc @@ -0,0 +1,91 @@ +--- +description: Writing tests for Bun +globs: +--- +# Writing tests for Bun + +## Where tests are found + +You'll find all of Bun's tests in the `test/` directory. + +* `test/` + * `cli/` - CLI command tests, like `bun install` or `bun init` + * `js/` - JavaScript & TypeScript tests + * `bun/` - `Bun` APIs tests, seperated by category, for example: `glob/` for `Bun.Glob` tests + * `node/` - Node.js module tests, seperated by module, for example: `assert/` for `node:assert` tests + * `test/` - Vendored Node.js tests, taken from the Node.js repository (does not conform to Bun's test style) + * `web/` - Web API tests, seperated by category, for example: `fetch/` for `Request` and `Response` tests + * `third_party/` - npm package tests, to validate that basic usage works in Bun + * `napi/` - N-API tests + * `v8/` - V8 C++ API tests + * `bundler/` - Bundler, transpiler, CSS, and `bun build` tests + * `regression/issue/[number]` - Regression tests, always make one when fixing a particular issue + +## How tests are written + +Bun's tests are written as JavaScript and TypeScript files with the Jest-style APIs, like `test`, `describe`, and `expect`. They are tested using Bun's own test runner, `bun test`. + +```js +import { describe, test, expect } from "bun:test"; +import assert, { AssertionError } from "assert"; + +describe("assert(expr)", () => { + test.each([true, 1, "foo"])(`assert(%p) does not throw`, expr => { + expect(() => assert(expr)).not.toThrow(); + }); + + test.each([false, 0, "", null, undefined])(`assert(%p) throws`, expr => { + expect(() => assert(expr)).toThrow(AssertionError); + }); +}); +``` + +## Testing conventions + +* See `test/harness.ts` for common test utilities and helpers +* Be rigorous and test for edge-cases and unexpected inputs +* Use data-driven tests, e.g. `test.each`, to reduce boilerplate when possible +* When you need to test Bun as a CLI, use the following pattern: + +```js +import { test, expect } from "bun:test"; +import { spawn } from "bun"; +import { bunExe, bunEnv } from "harness"; + +test("bun --version", async () => { + const { exited, stdout: stdoutStream, stderr: stderrStream } = spawn({ + cmd: [bunExe(), "--version"], + env: bunEnv, + stdout: "pipe", + stderr: "pipe", + }); + const [ exitCode, stdout, stderr ] = await Promise.all([ + exited, + new Response(stdoutStream).text(), + new Response(stderrStream).text(), + ]); + expect({ exitCode, stdout, stderr }).toMatchObject({ + exitCode: 0, + stdout: expect.stringContaining(Bun.version), + stderr: "", + }); +}); +``` + +## Before writing a test + +* If you are fixing a bug, write the test first and make sure it fails (as expected) with the canary version of Bun +* If you are fixing a Node.js compatibility bug, create a throw-away snippet of code and test that it works as you expect in Node.js, then that it fails (as expected) with the canary version of Bun +* When the expected behaviour is ambigious, defer to matching what happens in Node.js +* Always attempt to find related tests in an existing test file before creating a new test file + + + + + + + + + + + diff --git a/.cursorignore b/.cursorignore new file mode 100644 index 0000000000..e56b21e52f --- /dev/null +++ b/.cursorignore @@ -0,0 +1,7 @@ +# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv) +bench +vendor +*-fixture.{js,ts} +zig-cache +packages/bun-uws/fuzzing +build \ No newline at end of file diff --git a/.docker/chrome.json b/.docker/chrome.json deleted file mode 100644 index 6bd45b6e04..0000000000 --- a/.docker/chrome.json +++ /dev/null @@ -1,1539 +0,0 @@ -{ - "defaultAction": "SCMP_ACT_ERRNO", - "syscalls": [ - { - "name": "accept", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "accept4", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "access", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "alarm", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "arch_prctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "bind", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "brk", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "capget", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "capset", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "chdir", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "chmod", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "chown", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "chown32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "chroot", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "clock_getres", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "clock_gettime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "clock_nanosleep", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "clone", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "close", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "connect", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "creat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "dup", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "dup2", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "dup3", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_create", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_create1", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_ctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_ctl_old", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_pwait", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_wait", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "epoll_wait_old", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "eventfd", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "eventfd2", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "execve", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "execveat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "exit", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "exit_group", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "faccessat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fadvise64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fadvise64_64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fallocate", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fanotify_init", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fanotify_mark", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchdir", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchmod", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchmodat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchown", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchown32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fchownat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fcntl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fcntl64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fdatasync", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fgetxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "flistxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "flock", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fork", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fremovexattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fsetxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fstat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fstat64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fstatat64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fstatfs", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fstatfs64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "fsync", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ftruncate", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ftruncate64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "futex", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "futimesat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getcpu", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getcwd", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getdents", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getdents64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getegid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getegid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "geteuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "geteuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getgid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getgroups", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getgroups32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getitimer", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getpeername", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getpgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getpgrp", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getpid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getppid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getpriority", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getrandom", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getresgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getresgid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getresuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getresuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getrlimit", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "get_robust_list", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getrusage", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getsid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getsockname", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getsockopt", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "get_thread_area", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "gettid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "gettimeofday", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "getxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "inotify_add_watch", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "inotify_init", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "inotify_init1", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "inotify_rm_watch", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "io_cancel", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ioctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "io_destroy", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "io_getevents", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ioprio_get", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ioprio_set", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "io_setup", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "io_submit", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "kill", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lchown", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lchown32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lgetxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "link", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "linkat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "listen", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "listxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "llistxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "_llseek", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lremovexattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lseek", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lsetxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lstat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "lstat64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "madvise", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "memfd_create", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mincore", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mkdir", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mkdirat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mknod", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mknodat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mlock", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mlockall", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mmap", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mmap2", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mprotect", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_getsetattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_notify", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_open", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_timedreceive", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_timedsend", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mq_unlink", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "mremap", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "msgctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "msgget", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "msgrcv", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "msgsnd", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "msync", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "munlock", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "munlockall", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "munmap", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "name_to_handle_at", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "nanosleep", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "newfstatat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "_newselect", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "open", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "open_by_handle_at", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "openat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pause", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pipe", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pipe2", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "poll", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ppoll", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "prctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pread64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "preadv", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "prlimit64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pselect6", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pwrite64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "pwritev", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "read", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "readahead", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "readlink", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "readlinkat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "readv", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "recvfrom", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "recvmmsg", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "recvmsg", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "remap_file_pages", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "removexattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rename", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "renameat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "renameat2", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rmdir", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigaction", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigpending", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigprocmask", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigqueueinfo", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigreturn", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigsuspend", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_sigtimedwait", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "rt_tgsigqueueinfo", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_getaffinity", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_getattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_getparam", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_get_priority_max", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_get_priority_min", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_getscheduler", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_rr_get_interval", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_setaffinity", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_setattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_setparam", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_setscheduler", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sched_yield", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "seccomp", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "select", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "semctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "semget", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "semop", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "semtimedop", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sendfile", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sendfile64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sendmmsg", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sendmsg", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sendto", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setdomainname", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setfsgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setfsgid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setfsuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setfsuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setgid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setgroups", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setgroups32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sethostname", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setitimer", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setns", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setpgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setpriority", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setregid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setregid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setresgid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setresgid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setresuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setresuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setreuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setreuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setrlimit", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "set_robust_list", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setsid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setsockopt", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "set_thread_area", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "set_tid_address", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setuid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setuid32", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "setxattr", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "shmat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "shmctl", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "shmdt", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "shmget", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "shutdown", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sigaltstack", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "signalfd", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "signalfd4", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "socket", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "socketpair", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "splice", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "stat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "stat64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "statfs", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "statfs64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "symlink", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "symlinkat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sync", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sync_file_range", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "syncfs", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "sysinfo", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "syslog", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "tee", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "tgkill", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "time", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timer_create", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timer_delete", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timerfd_create", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timerfd_gettime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timerfd_settime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timer_getoverrun", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timer_gettime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "timer_settime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "times", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "tkill", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "truncate", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "truncate64", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "ugetrlimit", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "umask", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "uname", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "unlink", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "unlinkat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "unshare", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "utime", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "utimensat", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "utimes", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "vfork", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "vhangup", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "vmsplice", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "wait4", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "waitid", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "write", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { - "name": "writev", - "action": "SCMP_ACT_ALLOW", - "args": null - }, - { "name": "io_uring_setup", "action": "SCMP_ACT_ALLOW", "args": null }, - { "name": "io_uring_enter", "action": "SCMP_ACT_ALLOW", "args": null }, - { "name": "io_uring_register", "action": "SCMP_ACT_ALLOW", "args": null }, - { "name": "copy_file_range", "action": "SCMP_ACT_ALLOW", "args": null } - ] -} diff --git a/.docker/chromium.pref b/.docker/chromium.pref deleted file mode 100644 index fc8e464bd1..0000000000 --- a/.docker/chromium.pref +++ /dev/null @@ -1,14 +0,0 @@ -# Note: 2 blank lines are required between entries - Package: * - Pin: release a=eoan - Pin-Priority: 500 - - Package: * - Pin: origin "ftp.debian.org" - Pin-Priority: 300 - - # Pattern includes 'chromium', 'chromium-browser' and similarly - # named dependencies: - Package: chromium* - Pin: origin "ftp.debian.org" - Pin-Priority: 700 \ No newline at end of file diff --git a/.docker/copy-bun-binary.sh b/.docker/copy-bun-binary.sh deleted file mode 100644 index 5fce2ac5b8..0000000000 --- a/.docker/copy-bun-binary.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -set -euxo pipefail - -name=$(openssl rand -hex 12) -id=$(docker create --name=bun-binary-$name $CONTAINER_TAG) -docker container cp bun-binary-$name:$BUN_RELEASE_DIR bun-binary -echo -e "bun-binary-$name" diff --git a/.docker/debian.list b/.docker/debian.list deleted file mode 100644 index 4954b36f30..0000000000 --- a/.docker/debian.list +++ /dev/null @@ -1,3 +0,0 @@ - deb http://deb.debian.org/debian buster main - deb http://deb.debian.org/debian buster-updates main - deb http://deb.debian.org/debian-security buster/updates main \ No newline at end of file diff --git a/.docker/dockerfile-common.sh b/.docker/dockerfile-common.sh deleted file mode 100644 index c9c1a4efa3..0000000000 --- a/.docker/dockerfile-common.sh +++ /dev/null @@ -1,34 +0,0 @@ -export DOCKER_BUILDKIT=1 - -export BUILDKIT_ARCH=$(uname -m) -export ARCH=${BUILDKIT_ARCH} - -if [ "$BUILDKIT_ARCH" == "amd64" ]; then - export BUILDKIT_ARCH="amd64" - export ARCH=x64 -fi - -if [ "$BUILDKIT_ARCH" == "x86_64" ]; then - export BUILDKIT_ARCH="amd64" - export ARCH=x64 -fi - -if [ "$BUILDKIT_ARCH" == "arm64" ]; then - export BUILDKIT_ARCH="arm64" - export ARCH=aarch64 -fi - -if [ "$BUILDKIT_ARCH" == "aarch64" ]; then - export BUILDKIT_ARCH="arm64" - export ARCH=aarch64 -fi - -if [ "$BUILDKIT_ARCH" == "armv7l" ]; then - echo "Unsupported platform: $BUILDKIT_ARCH" - exit 1 -fi - -export BUILD_ID=$(cat build-id) -export CONTAINER_NAME=bun-linux-$ARCH -export DEBUG_CONTAINER_NAME=debug-bun-linux-$ARCH -export TEMP=/tmp/bun-0.0.$BUILD_ID diff --git a/.docker/pull.sh b/.docker/pull.sh deleted file mode 100644 index 96c6922514..0000000000 --- a/.docker/pull.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -euxo pipefail - -docker pull bunbunbunbun/bun-test-base:latest --platform=linux/amd64 -docker pull bunbunbunbun/bun-base:latest --platform=linux/amd64 -docker pull bunbunbunbun/bun-base-with-zig-and-webkit:latest --platform=linux/amd64 - -docker tag bunbunbunbun/bun-test-base:latest bun-base:latest -docker tag bunbunbunbun/bun-base:latest bun-base:latest -docker tag bunbunbunbun/bun-base-with-zig-and-webkit:latest bun-base-with-zig-and-webkit:latest diff --git a/.docker/run-dockerfile.sh b/.docker/run-dockerfile.sh deleted file mode 100644 index df22cd2b61..0000000000 --- a/.docker/run-dockerfile.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -source "dockerfile-common.sh" - -export $CONTAINER_NAME=$CONTAINER_NAME-local - -rm -rf $TEMP -mkdir -p $TEMP - -docker build . --target release --progress=plain -t $CONTAINER_NAME:latest --build-arg BUILDKIT_INLINE_CACHE=1 --platform=linux/$BUILDKIT_ARCH --cache-from $CONTAINER_NAME:latest - -if (($?)); then - echo "Failed to build container" - exit 1 -fi - -id=$(docker create $CONTAINER_NAME:latest) -docker cp $id:/home/ubuntu/bun-release $TEMP/$CONTAINER_NAME -if (($?)); then - echo "Failed to cp container" - exit 1 -fi - -cd $TEMP -mkdir -p $TEMP/$CONTAINER_NAME $TEMP/$DEBUG_CONTAINER_NAME -mv $CONTAINER_NAME/bun-profile $DEBUG_CONTAINER_NAME/bun -zip -r $CONTAINER_NAME.zip $CONTAINER_NAME -zip -r $DEBUG_CONTAINER_NAME.zip $DEBUG_CONTAINER_NAME -docker rm -v $id -abs=$(realpath $TEMP/$CONTAINER_NAME.zip) -debug_abs=$(realpath $TEMP/$DEBUG_CONTAINER_NAME.zip) - -case $(uname -s) in -"Linux") target="linux" ;; -*) target="other" ;; -esac - -if [ "$target" = "linux" ]; then - if command -v bun --version >/dev/null; then - cp $TEMP/$CONTAINER_NAME/bun $(which bun) - cp $TEMP/$DEBUG_CONTAINER_NAME/bun $(which bun-profile) - fi -fi - -echo "Saved to:" -echo $debug_abs -echo $abs diff --git a/.docker/run-test.sh b/.docker/run-test.sh deleted file mode 100755 index c088adf5ae..0000000000 --- a/.docker/run-test.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -euxo pipefail - -bun install -bun install --cwd ./test/snippets -bun install --cwd ./test/scripts - -make $BUN_TEST_NAME diff --git a/.docker/runner.sh b/.docker/runner.sh deleted file mode 100644 index 837ff85663..0000000000 --- a/.docker/runner.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -set -euxo pipefail - -docker container run --security-opt seccomp=.docker/chrome.json --env GITHUB_WORKSPACE=$GITHUB_WORKSPACE --env BUN_TEST_NAME=$BUN_TEST_NAME --ulimit memlock=-1:-1 --init --rm bun-test:latest diff --git a/.docker/unit-tests.sh b/.docker/unit-tests.sh deleted file mode 100644 index 2917a5ef0d..0000000000 --- a/.docker/unit-tests.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -set -euxo pipefail - -docker container run --security-opt seccomp=.docker/chrome.json --env GITHUB_WORKSPACE=$GITHUB_WORKSPACE --ulimit memlock=-1:-1 --init --rm bun-unit-tests:latest diff --git a/.dockerignore b/.dockerignore index 239d9da881..d767837682 100644 --- a/.dockerignore +++ b/.dockerignore @@ -11,5 +11,11 @@ packages/**/bun-profile src/bun.js/WebKit src/bun.js/WebKit/LayoutTests zig-build -zig-cache -zig-out \ No newline at end of file +.zig-cache +zig-out +build +vendor +node_modules +*.trace + +packages/bun-uws/fuzzing \ No newline at end of file diff --git a/.gitattributes b/.gitattributes index 589c9da751..bc089ec2f3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7,6 +7,7 @@ *.cpp text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.cc text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.yml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 +*.toml text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.zig text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.rs text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.h text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 @@ -14,6 +15,7 @@ *.lock text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.map text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.md text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 +*.mdc text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.mjs text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 *.mts text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 @@ -43,8 +45,10 @@ test/**/* linguist-documentation bench/**/* linguist-documentation examples/**/* linguist-documentation -src/deps/*.c linguist-vendored -src/deps/brotli/** linguist-vendored +vendor/*.c linguist-vendored +vendor/brotli/** linguist-vendored test/js/node/test/fixtures linguist-vendored test/js/node/test/common linguist-vendored + +test/js/bun/css/files linguist-vendored diff --git a/.github/ISSUE_TEMPLATE/3-typescript-bug-report.yml b/.github/ISSUE_TEMPLATE/3-typescript-bug-report.yml index 7b745a4aef..3913e25272 100644 --- a/.github/ISSUE_TEMPLATE/3-typescript-bug-report.yml +++ b/.github/ISSUE_TEMPLATE/3-typescript-bug-report.yml @@ -1,6 +1,6 @@ name: 🇹 TypeScript Type Bug Report description: Report an issue with TypeScript types -labels: [bug, typescript] +labels: [bug, types] body: - type: markdown attributes: diff --git a/.github/ISSUE_TEMPLATE/7-install-crash-report.yml b/.github/ISSUE_TEMPLATE/7-install-crash-report.yml index 9239188ca0..e88397b393 100644 --- a/.github/ISSUE_TEMPLATE/7-install-crash-report.yml +++ b/.github/ISSUE_TEMPLATE/7-install-crash-report.yml @@ -2,11 +2,18 @@ name: bun install crash report description: Report a crash in bun install labels: - npm + - crash body: - type: markdown attributes: value: | **Thank you so much** for submitting a crash report. You're helping us make Bun more reliable for everyone! + - type: textarea + id: package_json + attributes: + label: "`package.json` file" + description: "Can you upload your `package.json` file? This helps us reproduce the crash." + render: json - type: textarea id: repro attributes: diff --git a/.github/actions/setup-bun/action.yml b/.github/actions/setup-bun/action.yml index 9d04e28cc4..d8d2745c17 100644 --- a/.github/actions/setup-bun/action.yml +++ b/.github/actions/setup-bun/action.yml @@ -4,7 +4,7 @@ description: An internal version of the 'oven-sh/setup-bun' action. inputs: bun-version: type: string - description: "The version of bun to install: 'latest', 'canary', 'bun-v1.0.0', etc." + description: "The version of bun to install: 'latest', 'canary', 'bun-v1.2.0', etc." default: latest required: false baseline: @@ -42,9 +42,10 @@ runs: canary) release="canary";; *) release="bun-v${{ inputs.bun-version }}";; esac - curl -LO "${{ inputs.download-url }}/${release}/${target}.zip" + curl -LO "${{ inputs.download-url }}/${release}/${target}.zip" --retry 5 unzip ${target}.zip mkdir -p ${{ runner.temp }}/.bun/bin mv ${target}/bun* ${{ runner.temp }}/.bun/bin/ chmod +x ${{ runner.temp }}/.bun/bin/* + ln -fs ${{ runner.temp }}/.bun/bin/bun ${{ runner.temp }}/.bun/bin/bunx echo "${{ runner.temp }}/.bun/bin" >> ${GITHUB_PATH} diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml new file mode 100644 index 0000000000..be833ae846 --- /dev/null +++ b/.github/workflows/clang-format.yml @@ -0,0 +1,41 @@ +name: clang-format + +permissions: + contents: write + +on: + workflow_call: + workflow_dispatch: + pull_request: + merge_group: + +env: + BUN_VERSION: "1.2.0" + LLVM_VERSION: "18.1.8" + LLVM_VERSION_MAJOR: "18" + +jobs: + clang-format: + name: clang-format + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Setup Bun + uses: ./.github/actions/setup-bun + with: + bun-version: ${{ env.BUN_VERSION }} + - name: Install LLVM + run: | + curl -fsSL https://apt.llvm.org/llvm.sh | sudo bash -s -- ${{ env.LLVM_VERSION_MAJOR }} all + - name: Clang Format + env: + LLVM_VERSION: ${{ env.LLVM_VERSION }} + run: | + bun run clang-format + - name: Commit + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "`bun run clang-format`" diff --git a/.github/workflows/clang-tidy.yml b/.github/workflows/clang-tidy.yml new file mode 100644 index 0000000000..934af25254 --- /dev/null +++ b/.github/workflows/clang-tidy.yml @@ -0,0 +1,41 @@ +name: clang-tidy + +permissions: + contents: write + +on: + workflow_call: + workflow_dispatch: + pull_request: + merge_group: + +env: + BUN_VERSION: "1.2.0" + LLVM_VERSION: "18.1.8" + LLVM_VERSION_MAJOR: "18" + +jobs: + clang-tidy: + name: clang-tidy + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Setup Bun + uses: ./.github/actions/setup-bun + with: + bun-version: ${{ env.BUN_VERSION }} + - name: Install LLVM + run: | + curl -fsSL https://apt.llvm.org/llvm.sh | sudo bash -s -- ${{ env.LLVM_VERSION_MAJOR }} all + - name: Clang Tidy + env: + LLVM_VERSION: ${{ env.LLVM_VERSION }} + run: | + bun run clang-tidy:diff + - name: Commit + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "`bun run clang-tidy`" diff --git a/.github/workflows/labeled.yml b/.github/workflows/labeled.yml index f0240aa0c3..7d521d55a3 100644 --- a/.github/workflows/labeled.yml +++ b/.github/workflows/labeled.yml @@ -1,6 +1,6 @@ name: Issue Labeled env: - BUN_VERSION: 1.1.13 + BUN_VERSION: 1.1.44 on: issues: @@ -23,7 +23,7 @@ jobs: # - name: Setup Bun # uses: ./.github/actions/setup-bun # with: - # bun-version: "1.1.24" + # bun-version: ${{ env.BUN_VERSION }} # - name: "categorize bug" # id: add-labels # env: @@ -59,7 +59,7 @@ jobs: - name: Setup Bun uses: ./.github/actions/setup-bun with: - bun-version: "1.1.13" + bun-version: ${{ env.BUN_VERSION }} - name: "add platform and command label" id: add-labels if: github.event.label.name == 'crash' @@ -72,7 +72,7 @@ jobs: echo "labels=$LABELS" >> $GITHUB_OUTPUT bun scripts/is-outdated.ts - if [[ -f "is-outdated.txt" ]]; then + if [[ -f "is-outdated.txt" ]]; then echo "is-outdated=true" >> $GITHUB_OUTPUT fi @@ -83,6 +83,26 @@ jobs: echo "latest=$(cat LATEST)" >> $GITHUB_OUTPUT rm -rf is-outdated.txt outdated.txt latest.txt + - name: Generate comment text with Sentry Link + if: github.event.label.name == 'crash' + # ignore if fail + continue-on-error: true + id: generate-comment-text + env: + GITHUB_ISSUE_BODY: ${{ github.event.issue.body }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_EVENTS_SECRET }} + shell: bash + run: | + bun scripts/associate-issue-with-sentry.ts + + if [[ -f "sentry-link.txt" ]]; then + echo "sentry-link=$(cat sentry-link.txt)" >> $GITHUB_OUTPUT + fi + + if [[ -f "sentry-id.txt" ]]; then + echo "sentry-id=$(cat sentry-id.txt)" >> $GITHUB_OUTPUT + fi + - name: Add labels uses: actions-cool/issues-helper@v3 if: github.event.label.name == 'crash' @@ -92,7 +112,7 @@ jobs: issue-number: ${{ github.event.issue.number }} labels: ${{ steps.add-labels.outputs.labels }} - name: Comment outdated - if: steps.add-labels.outputs.is-outdated == 'true' && github.event.label.name == 'crash' + if: steps.add-labels.outputs.is-outdated == 'true' && github.event.label.name == 'crash' && steps.generate-comment-text.outputs.sentry-link == '' uses: actions-cool/issues-helper@v3 with: actions: "create-comment" @@ -106,6 +126,40 @@ jobs: ```sh bun upgrade ``` + - name: Comment with Sentry Link and outdated version + if: steps.generate-comment-text.outputs.sentry-link != '' && github.event.label.name == 'crash' && steps.add-labels.outputs.is-outdated == 'true' + uses: actions-cool/issues-helper@v3 + with: + actions: "create-comment" + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.issue.number }} + body: | + @${{ github.event.issue.user.login }}, thank you for reporting this crash. The latest version of Bun is v${{ steps.add-labels.outputs.latest }}, but this crash was reported on Bun v${{ steps.add-labels.outputs.oudated }}. + + Are you able to reproduce this crash on the latest version of Bun? + + ```sh + bun upgrade + ``` + + For Bun's internal tracking, this issue is [${{ steps.generate-comment-text.outputs.sentry-id }}](${{ steps.generate-comment-text.outputs.sentry-link }}). + + + + - name: Comment with Sentry Link + if: steps.generate-comment-text.outputs.sentry-link != '' && github.event.label.name == 'crash' && steps.add-labels.outputs.is-outdated != 'true' + uses: actions-cool/issues-helper@v3 + with: + actions: "create-comment" + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.issue.number }} + body: | + Thank you for reporting this crash. + + For Bun's internal tracking, this issue is [${{ steps.generate-comment-text.outputs.sentry-id }}](${{ steps.generate-comment-text.outputs.sentry-link }}). + + + - name: Comment needs repro if: github.event.label.name == 'needs repro' uses: actions-cool/issues-helper@v3 @@ -114,4 +168,4 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} issue-number: ${{ github.event.issue.number }} body: | - Hello @${{ github.event.issue.user.login }}. Please provide a [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) using a GitHub repository, [Replit](https://replit.com/@replit/Bun), or [CodeSandbox](https://codesandbox.io/templates/bun). Issues marked with `needs repro` will be closed if they have no activity within 3 days. + Hello @${{ github.event.issue.user.login }}. Please provide a [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) using a GitHub repository, [Replit](https://replit.com/@replit/Bun), [CodeSandbox](https://codesandbox.io/templates/bun), or provide a bulleted list of commands to run that reproduce this issue. Issues marked with `needs repro` will be closed if they have no activity within 3 days. diff --git a/.github/workflows/lint-cpp.yml b/.github/workflows/lint-cpp.yml deleted file mode 100644 index 6dffbf0599..0000000000 --- a/.github/workflows/lint-cpp.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: lint-cpp - -permissions: - contents: read - -concurrency: - group: ${{ github.workflow }}-${{ github.event_name == 'workflow_dispatch' && inputs.run-id || github.ref }} - cancel-in-progress: true - -on: - workflow_dispatch: - inputs: - run-id: - type: string - description: The workflow ID to download artifacts (skips the build step) - pull_request: - paths: - - ".github/workflows/lint-cpp.yml" - - "**/*.cpp" - - "src/deps/**/*" - - "CMakeLists.txt" - -jobs: - lint-cpp: - if: ${{ !inputs.run-id }} - name: Lint C++ - uses: ./.github/workflows/run-lint-cpp.yml - secrets: inherit - with: - pr-number: ${{ github.event.number }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000000..33ef015a53 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,22 @@ +name: Lint + +on: + pull_request: + workflow_dispatch: + +env: + BUN_VERSION: "1.2.0" + OXLINT_VERSION: "0.15.0" + +jobs: + lint-js: + name: "Lint JavaScript" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Bun + uses: ./.github/actions/setup-bun + with: + bun-version: ${{ env.BUN_VERSION }} + - name: Lint + run: bunx oxlint --config oxlint.json --quiet --format github diff --git a/.github/workflows/packages-ci.yml b/.github/workflows/packages-ci.yml new file mode 100644 index 0000000000..f0d9bdab99 --- /dev/null +++ b/.github/workflows/packages-ci.yml @@ -0,0 +1,55 @@ +name: Packages CI + +on: + push: + branches: + - main + paths: + - "packages/**" + - .prettierrc + - .prettierignore + - tsconfig.json + - oxlint.json + - "!**/*.md" + pull_request: + branches: + - main + paths: + - "packages/**" + - .prettierrc + - .prettierignore + - tsconfig.json + - oxlint.json + - "!**/*.md" + +env: + BUN_VERSION: "canary" + +jobs: + bun-plugin-svelte: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Bun + uses: ./.github/actions/setup-bun + with: + bun-version: ${{ env.BUN_VERSION }} + + - name: Install dependencies + run: | + bun install + pushd ./packages/bun-plugin-svelte && bun install + + - name: Lint + run: | + bunx oxlint@0.15 --format github --deny-warnings + bunx prettier --config ../../.prettierrc --check . + working-directory: ./packages/bun-plugin-svelte + + - name: Check types + run: bun check:types + working-directory: ./packages/bun-plugin-svelte + + - name: Test + run: bun test + working-directory: ./packages/bun-plugin-svelte diff --git a/.github/workflows/prettier-format.yml b/.github/workflows/prettier-format.yml new file mode 100644 index 0000000000..8f0c127202 --- /dev/null +++ b/.github/workflows/prettier-format.yml @@ -0,0 +1,37 @@ +name: prettier-format + +permissions: + contents: write + +on: + workflow_call: + workflow_dispatch: + pull_request: + merge_group: + +env: + BUN_VERSION: "1.2.0" + +jobs: + prettier-format: + name: prettier-format + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Setup Bun + uses: ./.github/actions/setup-bun + with: + bun-version: ${{ env.BUN_VERSION }} + - name: Setup Dependencies + run: | + bun install + - name: Prettier Format + run: | + bun run prettier:diff + - name: Commit + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "`bun run prettier:extra`" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ab0bf70103..9a1f110a78 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,6 +44,10 @@ on: description: Should types be released to npm? type: boolean default: false + use-definitelytyped: + description: "Should types be PR'd to DefinitelyTyped?" + type: boolean + default: false jobs: sign: @@ -66,7 +70,7 @@ jobs: - name: Setup Bun uses: ./.github/actions/setup-bun with: - bun-version: "1.1.20" + bun-version: "1.2.3" - name: Install Dependencies run: bun install - name: Sign Release @@ -94,7 +98,7 @@ jobs: - name: Setup Bun uses: ./.github/actions/setup-bun with: - bun-version: "1.1.20" + bun-version: "1.2.3" - name: Install Dependencies run: bun install - name: Release @@ -123,7 +127,7 @@ jobs: if: ${{ env.BUN_VERSION != 'canary' }} uses: ./.github/actions/setup-bun with: - bun-version: "1.1.20" + bun-version: "1.2.3" - name: Setup Bun if: ${{ env.BUN_VERSION == 'canary' }} uses: ./.github/actions/setup-bun @@ -155,6 +159,52 @@ jobs: with: package: packages/bun-types/package.json token: ${{ secrets.NPM_TOKEN }} + definitelytyped: + name: Make pr to DefinitelyTyped to update `bun-types` version + runs-on: ubuntu-latest + needs: npm-types + if: ${{ github.event_name == 'release' || github.event.inputs.use-definitelytyped == 'true' }} + permissions: + contents: read + steps: + - name: Checkout (DefinitelyTyped) + uses: actions/checkout@v4 + with: + repository: DefinitelyTyped/DefinitelyTyped + - name: Checkout (bun) + uses: actions/checkout@v4 + with: + path: bun + - name: Setup Bun + uses: ./bun/.github/actions/setup-bun + with: + bun-version: "1.2.0" + - id: bun-version + run: echo "BUN_VERSION=${BUN_VERSION#bun-v}" >> "$GITHUB_OUTPUT" + - name: Update bun-types version in package.json + run: | + bun -e ' + const file = Bun.file("./types/bun/package.json"); + const json = await file.json(); + const version = "${{ steps.bun-version.outputs.BUN_VERSION }}"; + json.dependencies["bun-types"] = version; + json.version = version.slice(0, version.lastIndexOf(".")) + ".9999"; + await file.write(JSON.stringify(json, null, 4) + "\n"); + ' + - name: Create Pull Request + uses: peter-evans/create-pull-request@v7 + if: ${{ env.BUN_LATEST == 'true' && env.BUN_VERSION != 'canary'}} + with: + token: ${{ secrets.ROBOBUN_TOKEN }} + add-paths: ./types/bun/package.json + title: "[bun] update to ${{ steps.bun-version.outputs.BUN_VERSION }}" + commit-message: "[bun] update to ${{ steps.bun-version.outputs.BUN_VERSION }}" + body: | + Update `bun-types` version to ${{ steps.bun-version.outputs.BUN_VERSION }} + + https://bun.sh/blog/${{ env.BUN_VERSION }} + push-to-fork: oven-sh/DefinitelyTyped + branch: ${{env.BUN_VERSION}} docker: name: Release to Dockerhub runs-on: ubuntu-latest @@ -181,7 +231,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Setup Docker emulator - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - id: buildx name: Setup Docker buildx uses: docker/setup-buildx-action@v3 @@ -189,7 +239,7 @@ jobs: platforms: linux/amd64,linux/arm64 - id: metadata name: Setup Docker metadata - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: oven/bun flavor: | @@ -206,7 +256,7 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Push to Docker - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: ./dockerhub/${{ matrix.dir || matrix.variant }} platforms: linux/amd64,linux/arm64 @@ -265,7 +315,7 @@ jobs: - name: Setup Bun uses: ./.github/actions/setup-bun with: - bun-version: "1.1.20" + bun-version: "1.2.0" - name: Install Dependencies run: bun install - name: Release @@ -309,7 +359,7 @@ jobs: uses: ./.github/actions/setup-bun if: ${{ env.BUN_LATEST == 'true' }} with: - bun-version: "1.1.12" + bun-version: "1.2.0" - name: Bump version uses: ./.github/actions/bump if: ${{ env.BUN_LATEST == 'true' }} diff --git a/.github/workflows/run-format.yml b/.github/workflows/run-format.yml deleted file mode 100644 index 4d03ce22e8..0000000000 --- a/.github/workflows/run-format.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Format - -permissions: - contents: write - -on: - workflow_call: - inputs: - zig-version: - type: string - required: true - -jobs: - format: - name: Format - runs-on: ubuntu-latest - if: ${{ github.ref != 'refs/heads/main' }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - sparse-checkout: | - .github - src - scripts - packages - test - bench - - name: Setup Bun - uses: ./.github/actions/setup-bun - with: - bun-version: "1.1.20" - - name: Setup Zig - uses: mlugg/setup-zig@v1 - with: - version: ${{ inputs.zig-version }} - - name: Install Dependencies - run: | - bun install - - name: Format - run: | - bun fmt - - name: Format Zig - run: | - bun fmt:zig - - name: Generate submodule versions - run: | - bash ./scripts/write-versions.sh - - name: Commit - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: Apply formatting changes diff --git a/.github/workflows/run-lint-cpp.yml b/.github/workflows/run-lint-cpp.yml deleted file mode 100644 index fc8b42dd49..0000000000 --- a/.github/workflows/run-lint-cpp.yml +++ /dev/null @@ -1,84 +0,0 @@ -name: lint-cpp - -permissions: - contents: read -env: - LLVM_VERSION: 18 - LC_CTYPE: "en_US.UTF-8" - LC_ALL: "en_US.UTF-8" - -on: - workflow_call: - inputs: - pr-number: - required: true - type: number - -jobs: - lint-cpp: - name: Lint C++ - runs-on: ${{ github.repository_owner == 'oven-sh' && 'macos-13-xlarge' || 'macos-13' }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Setup Bun - uses: ./.github/actions/setup-bun - with: - bun-version: 1.1.23 - - name: Install Dependencies - env: - HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1 - HOMEBREW_NO_AUTO_UPDATE: 1 - HOMEBREW_NO_INSTALL_CLEANUP: 1 - run: | - brew install \ - llvm@${{ env.LLVM_VERSION }} \ - ninja \ - coreutils \ - openssl@1.1 \ - libiconv \ - gnu-sed --force --overwrite - echo "$(brew --prefix coreutils)/libexec/gnubin" >> $GITHUB_PATH - echo "$(brew --prefix llvm@$LLVM_VERSION)/bin" >> $GITHUB_PATH - brew link --overwrite llvm@$LLVM_VERSION - - name: Bun install - run: | - bun install - - name: clang-tidy - id: format - env: - CPU_TARGET: native - BUN_SILENT: 1 - run: | - rm -f did_fail format.log - echo "${{ inputs.pr-number }}" > pr-number.txt - echo "pr_number=$(cat pr-number.txt)" >> $GITHUB_OUTPUT - bun run --silent build:tidy &> >(tee -p format.log) && echo 0 > did_succeed.txt - # Upload format.log as github artifact for the workflow - if [ -f did_succeed.txt ]; then - echo "0" > did_fail.txt - else - echo "1" > did_fail.txt - fi - echo "did_fail=$(cat did_fail.txt)" >> $GITHUB_OUTPUT - - - name: Upload format.log - uses: actions/upload-artifact@v2 - with: - name: format.log - path: format.log - - name: Upload PR - uses: actions/upload-artifact@v2 - with: - name: pr-number.txt - path: pr-number.txt - - name: Upload PR - uses: actions/upload-artifact@v2 - with: - name: did_fail.txt - path: did_fail.txt - - name: Fail if formatting failed - if: ${{ steps.format.outputs.did_fail == '1' }} - run: exit 1 diff --git a/.github/workflows/run-lint.yml b/.github/workflows/run-lint.yml index 45aa25307d..648da1a9ca 100644 --- a/.github/workflows/run-lint.yml +++ b/.github/workflows/run-lint.yml @@ -4,6 +4,7 @@ permissions: contents: read env: LLVM_VERSION: 16 + BUN_VERSION: "1.2.0" on: workflow_call: @@ -22,7 +23,7 @@ jobs: - name: Setup Bun uses: ./.github/actions/setup-bun with: - bun-version: "1.1.3" + bun-version: ${{ env.BUN_VERSION }} - name: Install Dependencies run: | bun --cwd=packages/bun-internal-test install diff --git a/.github/workflows/test-bump.yml b/.github/workflows/test-bump.yml index 03012a1239..e2a4ae1b05 100644 --- a/.github/workflows/test-bump.yml +++ b/.github/workflows/test-bump.yml @@ -8,6 +8,9 @@ on: description: What is the release tag? (e.g. "1.0.2", "canary") required: true +env: + BUN_VERSION: "1.2.0" + jobs: bump: name: "Bump version" @@ -21,7 +24,7 @@ jobs: - name: Setup Bun uses: ./.github/actions/setup-bun with: - bun-version: "1.1.12" + bun-version: ${{ env.BUN_VERSION }} - name: Bump version uses: ./.github/actions/bump with: diff --git a/.github/workflows/typos.yml b/.github/workflows/typos.yml new file mode 100644 index 0000000000..74c2aaec89 --- /dev/null +++ b/.github/workflows/typos.yml @@ -0,0 +1,19 @@ +name: Typos + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Spellcheck + uses: crate-ci/typos@v1.29.4 + with: + files: docs/**/* diff --git a/.github/workflows/update-cares.yml b/.github/workflows/update-cares.yml new file mode 100644 index 0000000000..d5d111b663 --- /dev/null +++ b/.github/workflows/update-cares.yml @@ -0,0 +1,92 @@ +name: Update c-ares + +on: + schedule: + - cron: "0 4 * * 0" + workflow_dispatch: + +jobs: + check-update: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - name: Check c-ares version + id: check-version + run: | + set -euo pipefail + + # Extract the commit hash from the line after COMMIT + CURRENT_VERSION=$(awk '/[[:space:]]*COMMIT[[:space:]]*$/{getline; gsub(/^[[:space:]]+|[[:space:]]+$/,"",$0); print}' cmake/targets/BuildCares.cmake) + + if [ -z "$CURRENT_VERSION" ]; then + echo "Error: Could not find COMMIT line in BuildCares.cmake" + exit 1 + fi + + # Validate that it looks like a git hash + if ! [[ $CURRENT_VERSION =~ ^[0-9a-f]{40}$ ]]; then + echo "Error: Invalid git hash format in BuildCares.cmake" + echo "Found: $CURRENT_VERSION" + echo "Expected: 40 character hexadecimal string" + exit 1 + fi + + echo "current=$CURRENT_VERSION" >> $GITHUB_OUTPUT + + LATEST_RELEASE=$(curl -sL https://api.github.com/repos/c-ares/c-ares/releases/latest) + if [ -z "$LATEST_RELEASE" ]; then + echo "Error: Failed to fetch latest release from GitHub API" + exit 1 + fi + + LATEST_TAG=$(echo "$LATEST_RELEASE" | jq -r '.tag_name') + if [ -z "$LATEST_TAG" ] || [ "$LATEST_TAG" = "null" ]; then + echo "Error: Could not extract tag name from GitHub API response" + exit 1 + fi + + LATEST_SHA=$(curl -sL "https://api.github.com/repos/c-ares/c-ares/git/ref/tags/$LATEST_TAG" | jq -r '.object.sha') + if [ -z "$LATEST_SHA" ] || [ "$LATEST_SHA" = "null" ]; then + echo "Error: Could not fetch SHA for tag $LATEST_TAG" + exit 1 + fi + + if ! [[ $LATEST_SHA =~ ^[0-9a-f]{40}$ ]]; then + echo "Error: Invalid SHA format received from GitHub" + echo "Found: $LATEST_SHA" + echo "Expected: 40 character hexadecimal string" + exit 1 + fi + + echo "latest=$LATEST_SHA" >> $GITHUB_OUTPUT + echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT + + - name: Update version if needed + if: success() && steps.check-version.outputs.current != steps.check-version.outputs.latest + run: | + set -euo pipefail + # Handle multi-line format where COMMIT and its value are on separate lines + sed -i -E '/[[:space:]]*COMMIT[[:space:]]*$/{n;s/[[:space:]]*([0-9a-f]+)[[:space:]]*$/ ${{ steps.check-version.outputs.latest }}/}' cmake/targets/BuildCares.cmake + + - name: Create Pull Request + if: success() && steps.check-version.outputs.current != steps.check-version.outputs.latest + uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + add-paths: | + cmake/targets/BuildCares.cmake + commit-message: "deps: update c-ares to ${{ steps.check-version.outputs.tag }} (${{ steps.check-version.outputs.latest }})" + title: "deps: update c-ares to ${{ steps.check-version.outputs.tag }}" + delete-branch: true + branch: deps/update-cares-${{ github.run_number }} + body: | + ## What does this PR do? + + Updates c-ares to version ${{ steps.check-version.outputs.tag }} + + Auto-updated by [this workflow](https://github.com/oven-sh/bun/actions/workflows/update-cares.yml) diff --git a/.github/workflows/update-libarchive.yml b/.github/workflows/update-libarchive.yml new file mode 100644 index 0000000000..f4dce7cfce --- /dev/null +++ b/.github/workflows/update-libarchive.yml @@ -0,0 +1,92 @@ +name: Update libarchive + +on: + schedule: + - cron: "0 3 * * 0" + workflow_dispatch: + +jobs: + check-update: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - name: Check libarchive version + id: check-version + run: | + set -euo pipefail + + # Extract the commit hash from the line after COMMIT + CURRENT_VERSION=$(awk '/[[:space:]]*COMMIT[[:space:]]*$/{getline; gsub(/^[[:space:]]+|[[:space:]]+$/,"",$0); print}' cmake/targets/BuildLibArchive.cmake) + + if [ -z "$CURRENT_VERSION" ]; then + echo "Error: Could not find COMMIT line in BuildLibArchive.cmake" + exit 1 + fi + + # Validate that it looks like a git hash + if ! [[ $CURRENT_VERSION =~ ^[0-9a-f]{40}$ ]]; then + echo "Error: Invalid git hash format in BuildLibArchive.cmake" + echo "Found: $CURRENT_VERSION" + echo "Expected: 40 character hexadecimal string" + exit 1 + fi + + echo "current=$CURRENT_VERSION" >> $GITHUB_OUTPUT + + LATEST_RELEASE=$(curl -sL https://api.github.com/repos/libarchive/libarchive/releases/latest) + if [ -z "$LATEST_RELEASE" ]; then + echo "Error: Failed to fetch latest release from GitHub API" + exit 1 + fi + + LATEST_TAG=$(echo "$LATEST_RELEASE" | jq -r '.tag_name') + if [ -z "$LATEST_TAG" ] || [ "$LATEST_TAG" = "null" ]; then + echo "Error: Could not extract tag name from GitHub API response" + exit 1 + fi + + LATEST_SHA=$(curl -sL "https://api.github.com/repos/libarchive/libarchive/git/ref/tags/$LATEST_TAG" | jq -r '.object.sha') + if [ -z "$LATEST_SHA" ] || [ "$LATEST_SHA" = "null" ]; then + echo "Error: Could not fetch SHA for tag $LATEST_TAG" + exit 1 + fi + + if ! [[ $LATEST_SHA =~ ^[0-9a-f]{40}$ ]]; then + echo "Error: Invalid SHA format received from GitHub" + echo "Found: $LATEST_SHA" + echo "Expected: 40 character hexadecimal string" + exit 1 + fi + + echo "latest=$LATEST_SHA" >> $GITHUB_OUTPUT + echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT + + - name: Update version if needed + if: success() && steps.check-version.outputs.current != steps.check-version.outputs.latest + run: | + set -euo pipefail + # Handle multi-line format where COMMIT and its value are on separate lines + sed -i -E '/[[:space:]]*COMMIT[[:space:]]*$/{n;s/[[:space:]]*([0-9a-f]+)[[:space:]]*$/ ${{ steps.check-version.outputs.latest }}/}' cmake/targets/BuildLibArchive.cmake + + - name: Create Pull Request + if: success() && steps.check-version.outputs.current != steps.check-version.outputs.latest + uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + add-paths: | + cmake/targets/BuildLibArchive.cmake + commit-message: "deps: update libarchive to ${{ steps.check-version.outputs.tag }} (${{ steps.check-version.outputs.latest }})" + title: "deps: update libarchive to ${{ steps.check-version.outputs.tag }}" + delete-branch: true + branch: deps/update-libarchive-${{ github.run_number }} + body: | + ## What does this PR do? + + Updates libarchive to version ${{ steps.check-version.outputs.tag }} + + Auto-updated by [this workflow](https://github.com/oven-sh/bun/actions/workflows/update-libarchive.yml) diff --git a/.github/workflows/update-libdeflate.yml b/.github/workflows/update-libdeflate.yml new file mode 100644 index 0000000000..7e0be86a1c --- /dev/null +++ b/.github/workflows/update-libdeflate.yml @@ -0,0 +1,92 @@ +name: Update libdeflate + +on: + schedule: + - cron: "0 2 * * 0" + workflow_dispatch: + +jobs: + check-update: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - name: Check libdeflate version + id: check-version + run: | + set -euo pipefail + + # Extract the commit hash from the line after COMMIT + CURRENT_VERSION=$(awk '/[[:space:]]*COMMIT[[:space:]]*$/{getline; gsub(/^[[:space:]]+|[[:space:]]+$/,"",$0); print}' cmake/targets/BuildLibDeflate.cmake) + + if [ -z "$CURRENT_VERSION" ]; then + echo "Error: Could not find COMMIT line in BuildLibDeflate.cmake" + exit 1 + fi + + # Validate that it looks like a git hash + if ! [[ $CURRENT_VERSION =~ ^[0-9a-f]{40}$ ]]; then + echo "Error: Invalid git hash format in BuildLibDeflate.cmake" + echo "Found: $CURRENT_VERSION" + echo "Expected: 40 character hexadecimal string" + exit 1 + fi + + echo "current=$CURRENT_VERSION" >> $GITHUB_OUTPUT + + LATEST_RELEASE=$(curl -sL https://api.github.com/repos/ebiggers/libdeflate/releases/latest) + if [ -z "$LATEST_RELEASE" ]; then + echo "Error: Failed to fetch latest release from GitHub API" + exit 1 + fi + + LATEST_TAG=$(echo "$LATEST_RELEASE" | jq -r '.tag_name') + if [ -z "$LATEST_TAG" ] || [ "$LATEST_TAG" = "null" ]; then + echo "Error: Could not extract tag name from GitHub API response" + exit 1 + fi + + LATEST_SHA=$(curl -sL "https://api.github.com/repos/ebiggers/libdeflate/git/ref/tags/$LATEST_TAG" | jq -r '.object.sha') + if [ -z "$LATEST_SHA" ] || [ "$LATEST_SHA" = "null" ]; then + echo "Error: Could not fetch SHA for tag $LATEST_TAG" + exit 1 + fi + + if ! [[ $LATEST_SHA =~ ^[0-9a-f]{40}$ ]]; then + echo "Error: Invalid SHA format received from GitHub" + echo "Found: $LATEST_SHA" + echo "Expected: 40 character hexadecimal string" + exit 1 + fi + + echo "latest=$LATEST_SHA" >> $GITHUB_OUTPUT + echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT + + - name: Update version if needed + if: success() && steps.check-version.outputs.current != steps.check-version.outputs.latest + run: | + set -euo pipefail + # Handle multi-line format where COMMIT and its value are on separate lines + sed -i -E '/[[:space:]]*COMMIT[[:space:]]*$/{n;s/[[:space:]]*([0-9a-f]+)[[:space:]]*$/ ${{ steps.check-version.outputs.latest }}/}' cmake/targets/BuildLibDeflate.cmake + + - name: Create Pull Request + if: success() && steps.check-version.outputs.current != steps.check-version.outputs.latest + uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + add-paths: | + cmake/targets/BuildLibDeflate.cmake + commit-message: "deps: update libdeflate to ${{ steps.check-version.outputs.tag }} (${{ steps.check-version.outputs.latest }})" + title: "deps: update libdeflate to ${{ steps.check-version.outputs.tag }}" + delete-branch: true + branch: deps/update-libdeflate-${{ github.run_number }} + body: | + ## What does this PR do? + + Updates libdeflate to version ${{ steps.check-version.outputs.tag }} + + Auto-updated by [this workflow](https://github.com/oven-sh/bun/actions/workflows/update-libdeflate.yml) diff --git a/.github/workflows/update-lolhtml.yml b/.github/workflows/update-lolhtml.yml new file mode 100644 index 0000000000..f48c4b5ce9 --- /dev/null +++ b/.github/workflows/update-lolhtml.yml @@ -0,0 +1,92 @@ +name: Update lolhtml + +on: + schedule: + - cron: "0 1 * * 0" + workflow_dispatch: + +jobs: + check-update: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - name: Check lolhtml version + id: check-version + run: | + set -euo pipefail + + # Extract the commit hash from the line after COMMIT + CURRENT_VERSION=$(awk '/[[:space:]]*COMMIT[[:space:]]*$/{getline; gsub(/^[[:space:]]+|[[:space:]]+$/,"",$0); print}' cmake/targets/BuildLolHtml.cmake) + + if [ -z "$CURRENT_VERSION" ]; then + echo "Error: Could not find COMMIT line in BuildLolHtml.cmake" + exit 1 + fi + + # Validate that it looks like a git hash + if ! [[ $CURRENT_VERSION =~ ^[0-9a-f]{40}$ ]]; then + echo "Error: Invalid git hash format in BuildLolHtml.cmake" + echo "Found: $CURRENT_VERSION" + echo "Expected: 40 character hexadecimal string" + exit 1 + fi + + echo "current=$CURRENT_VERSION" >> $GITHUB_OUTPUT + + LATEST_RELEASE=$(curl -sL https://api.github.com/repos/cloudflare/lol-html/releases/latest) + if [ -z "$LATEST_RELEASE" ]; then + echo "Error: Failed to fetch latest release from GitHub API" + exit 1 + fi + + LATEST_TAG=$(echo "$LATEST_RELEASE" | jq -r '.tag_name') + if [ -z "$LATEST_TAG" ] || [ "$LATEST_TAG" = "null" ]; then + echo "Error: Could not extract tag name from GitHub API response" + exit 1 + fi + + LATEST_SHA=$(curl -sL "https://api.github.com/repos/cloudflare/lol-html/git/ref/tags/$LATEST_TAG" | jq -r '.object.sha') + if [ -z "$LATEST_SHA" ] || [ "$LATEST_SHA" = "null" ]; then + echo "Error: Could not fetch SHA for tag $LATEST_TAG" + exit 1 + fi + + if ! [[ $LATEST_SHA =~ ^[0-9a-f]{40}$ ]]; then + echo "Error: Invalid SHA format received from GitHub" + echo "Found: $LATEST_SHA" + echo "Expected: 40 character hexadecimal string" + exit 1 + fi + + echo "latest=$LATEST_SHA" >> $GITHUB_OUTPUT + echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT + + - name: Update version if needed + if: success() && steps.check-version.outputs.current != steps.check-version.outputs.latest + run: | + set -euo pipefail + # Handle multi-line format where COMMIT and its value are on separate lines + sed -i -E '/[[:space:]]*COMMIT[[:space:]]*$/{n;s/[[:space:]]*([0-9a-f]+)[[:space:]]*$/ ${{ steps.check-version.outputs.latest }}/}' cmake/targets/BuildLolHtml.cmake + + - name: Create Pull Request + if: success() && steps.check-version.outputs.current != steps.check-version.outputs.latest + uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + add-paths: | + cmake/targets/BuildLolHtml.cmake + commit-message: "deps: update lolhtml to ${{ steps.check-version.outputs.tag }} (${{ steps.check-version.outputs.latest }})" + title: "deps: update lolhtml to ${{ steps.check-version.outputs.tag }}" + delete-branch: true + branch: deps/update-lolhtml-${{ github.run_number }} + body: | + ## What does this PR do? + + Updates lolhtml to version ${{ steps.check-version.outputs.tag }} + + Auto-updated by [this workflow](https://github.com/oven-sh/bun/actions/workflows/update-lolhtml.yml) diff --git a/.github/workflows/update-lshpack.yml b/.github/workflows/update-lshpack.yml new file mode 100644 index 0000000000..ae917cc3e9 --- /dev/null +++ b/.github/workflows/update-lshpack.yml @@ -0,0 +1,92 @@ +name: Update lshpack + +on: + schedule: + - cron: "0 5 * * 0" + workflow_dispatch: + +jobs: + check-update: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - name: Check lshpack version + id: check-version + run: | + set -euo pipefail + + # Extract the commit hash from the line after COMMIT + CURRENT_VERSION=$(awk '/[[:space:]]*COMMIT[[:space:]]*$/{getline; gsub(/^[[:space:]]+|[[:space:]]+$/,"",$0); print}' cmake/targets/BuildLshpack.cmake) + + if [ -z "$CURRENT_VERSION" ]; then + echo "Error: Could not find COMMIT line in BuildLshpack.cmake" + exit 1 + fi + + # Validate that it looks like a git hash + if ! [[ $CURRENT_VERSION =~ ^[0-9a-f]{40}$ ]]; then + echo "Error: Invalid git hash format in BuildLshpack.cmake" + echo "Found: $CURRENT_VERSION" + echo "Expected: 40 character hexadecimal string" + exit 1 + fi + + echo "current=$CURRENT_VERSION" >> $GITHUB_OUTPUT + + LATEST_RELEASE=$(curl -sL https://api.github.com/repos/litespeedtech/ls-hpack/releases/latest) + if [ -z "$LATEST_RELEASE" ]; then + echo "Error: Failed to fetch latest release from GitHub API" + exit 1 + fi + + LATEST_TAG=$(echo "$LATEST_RELEASE" | jq -r '.tag_name') + if [ -z "$LATEST_TAG" ] || [ "$LATEST_TAG" = "null" ]; then + echo "Error: Could not extract tag name from GitHub API response" + exit 1 + fi + + LATEST_SHA=$(curl -sL "https://api.github.com/repos/litespeedtech/ls-hpack/git/ref/tags/$LATEST_TAG" | jq -r '.object.sha') + if [ -z "$LATEST_SHA" ] || [ "$LATEST_SHA" = "null" ]; then + echo "Error: Could not fetch SHA for tag $LATEST_TAG" + exit 1 + fi + + if ! [[ $LATEST_SHA =~ ^[0-9a-f]{40}$ ]]; then + echo "Error: Invalid SHA format received from GitHub" + echo "Found: $LATEST_SHA" + echo "Expected: 40 character hexadecimal string" + exit 1 + fi + + echo "latest=$LATEST_SHA" >> $GITHUB_OUTPUT + echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT + + - name: Update version if needed + if: success() && steps.check-version.outputs.current != steps.check-version.outputs.latest + run: | + set -euo pipefail + # Handle multi-line format where COMMIT and its value are on separate lines + sed -i -E '/[[:space:]]*COMMIT[[:space:]]*$/{n;s/[[:space:]]*([0-9a-f]+)[[:space:]]*$/ ${{ steps.check-version.outputs.latest }}/}' cmake/targets/BuildLshpack.cmake + + - name: Create Pull Request + if: success() && steps.check-version.outputs.current != steps.check-version.outputs.latest + uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + add-paths: | + cmake/targets/BuildLshpack.cmake + commit-message: "deps: update lshpack to ${{ steps.check-version.outputs.tag }} (${{ steps.check-version.outputs.latest }})" + title: "deps: update lshpack to ${{ steps.check-version.outputs.tag }}" + delete-branch: true + branch: deps/update-lshpack-${{ github.run_number }} + body: | + ## What does this PR do? + + Updates lshpack to version ${{ steps.check-version.outputs.tag }} + + Auto-updated by [this workflow](https://github.com/oven-sh/bun/actions/workflows/update-lshpack.yml) diff --git a/.github/workflows/update-root-certs.yml b/.github/workflows/update-root-certs.yml new file mode 100644 index 0000000000..556fa79682 --- /dev/null +++ b/.github/workflows/update-root-certs.yml @@ -0,0 +1,82 @@ +name: Daily Root Certs Update Check + +on: + schedule: + - cron: "0 0 * * *" # Runs at 00:00 UTC every day + workflow_dispatch: # Allows manual trigger + +jobs: + check-and-update: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Generate root certs and capture output + id: generate-certs + run: | + cd packages/bun-usockets/ + OUTPUT=$(bun generate-root-certs.mjs -v) + echo "cert_output<> $GITHUB_ENV + echo "$OUTPUT" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Check for changes and stage files + id: check-changes + run: | + if [[ -n "$(git status --porcelain)" ]]; then + echo "Found changes, staging modified files..." + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + + # Get list of modified files and add them + git status --porcelain | while read -r status file; do + # Remove leading status and whitespace + file=$(echo "$file" | sed 's/^.* //') + echo "Adding changed file: $file" + git add "$file" + done + + echo "changes=true" >> $GITHUB_OUTPUT + + # Store the list of changed files + CHANGED_FILES=$(git status --porcelain) + echo "changed_files<> $GITHUB_ENV + echo "$CHANGED_FILES" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + else + echo "No changes detected" + echo "changes=false" >> $GITHUB_OUTPUT + fi + + - name: Create Pull Request + if: steps.check-changes.outputs.changes == 'true' + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: "update(root_certs): Update root certificates $(date +'%Y-%m-%d')" + title: "update(root_certs) $(date +'%Y-%m-%d')" + body: | + Automated root certificates update + + ${{ env.cert_output }} + + ## Changed Files: + ``` + ${{ env.changed_files }} + ``` + branch: certs/update-root-certs-${{ github.run_number }} + base: main + delete-branch: true + labels: + - "automation" + - "root-certs" diff --git a/.github/workflows/update-sqlite3.yml b/.github/workflows/update-sqlite3.yml new file mode 100644 index 0000000000..a69c6821c6 --- /dev/null +++ b/.github/workflows/update-sqlite3.yml @@ -0,0 +1,109 @@ +name: Update SQLite3 + +on: + schedule: + - cron: "0 6 * * 0" # Run weekly + workflow_dispatch: + +jobs: + check-update: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - name: Check SQLite version + id: check-version + run: | + set -euo pipefail + + # Get current version from the header file using SQLITE_VERSION_NUMBER + CURRENT_VERSION_NUM=$(grep -o '#define SQLITE_VERSION_NUMBER [0-9]\+' src/bun.js/bindings/sqlite/sqlite3_local.h | awk '{print $3}' | tr -d '\n\r') + if [ -z "$CURRENT_VERSION_NUM" ]; then + echo "Error: Could not find SQLITE_VERSION_NUMBER in sqlite3_local.h" + exit 1 + fi + + # Convert numeric version to semantic version for display + CURRENT_MAJOR=$((CURRENT_VERSION_NUM / 1000000)) + CURRENT_MINOR=$((($CURRENT_VERSION_NUM / 1000) % 1000)) + CURRENT_PATCH=$((CURRENT_VERSION_NUM % 1000)) + CURRENT_VERSION="$CURRENT_MAJOR.$CURRENT_MINOR.$CURRENT_PATCH" + + echo "current=$CURRENT_VERSION" >> $GITHUB_OUTPUT + echo "current_num=$CURRENT_VERSION_NUM" >> $GITHUB_OUTPUT + + # Fetch SQLite download page + DOWNLOAD_PAGE=$(curl -sL https://sqlite.org/download.html) + if [ -z "$DOWNLOAD_PAGE" ]; then + echo "Error: Failed to fetch SQLite download page" + exit 1 + fi + + # Extract latest version and year from the amalgamation link + LATEST_INFO=$(echo "$DOWNLOAD_PAGE" | grep -o 'sqlite-amalgamation-[0-9]\{7\}.zip' | head -n1) + LATEST_YEAR=$(echo "$DOWNLOAD_PAGE" | grep -o '[0-9]\{4\}/sqlite-amalgamation-[0-9]\{7\}.zip' | head -n1 | cut -d'/' -f1 | tr -d '\n\r') + LATEST_VERSION_NUM=$(echo "$LATEST_INFO" | grep -o '[0-9]\{7\}' | tr -d '\n\r') + + if [ -z "$LATEST_VERSION_NUM" ] || [ -z "$LATEST_YEAR" ]; then + echo "Error: Could not extract latest version info" + exit 1 + fi + + # Convert numeric version to semantic version for display + LATEST_MAJOR=$((10#$LATEST_VERSION_NUM / 1000000)) + LATEST_MINOR=$((($LATEST_VERSION_NUM / 10000) % 100)) + LATEST_PATCH=$((10#$LATEST_VERSION_NUM % 1000)) + LATEST_VERSION="$LATEST_MAJOR.$LATEST_MINOR.$LATEST_PATCH" + + echo "latest=$LATEST_VERSION" >> $GITHUB_OUTPUT + echo "latest_year=$LATEST_YEAR" >> $GITHUB_OUTPUT + echo "latest_num=$LATEST_VERSION_NUM" >> $GITHUB_OUTPUT + + # Debug output + echo "Current version: $CURRENT_VERSION ($CURRENT_VERSION_NUM)" + echo "Latest version: $LATEST_VERSION ($LATEST_VERSION_NUM)" + + - name: Update SQLite if needed + if: success() && steps.check-version.outputs.current_num < steps.check-version.outputs.latest_num + run: | + set -euo pipefail + + TEMP_DIR=$(mktemp -d) + cd $TEMP_DIR + + echo "Downloading from: https://sqlite.org/${{ steps.check-version.outputs.latest_year }}/sqlite-amalgamation-${{ steps.check-version.outputs.latest_num }}.zip" + + # Download and extract latest version + wget "https://sqlite.org/${{ steps.check-version.outputs.latest_year }}/sqlite-amalgamation-${{ steps.check-version.outputs.latest_num }}.zip" + unzip "sqlite-amalgamation-${{ steps.check-version.outputs.latest_num }}.zip" + cd "sqlite-amalgamation-${{ steps.check-version.outputs.latest_num }}" + + # Add header comment and copy files + echo "// clang-format off" > $GITHUB_WORKSPACE/src/bun.js/bindings/sqlite/sqlite3.c + cat sqlite3.c >> $GITHUB_WORKSPACE/src/bun.js/bindings/sqlite/sqlite3.c + + echo "// clang-format off" > $GITHUB_WORKSPACE/src/bun.js/bindings/sqlite/sqlite3_local.h + cat sqlite3.h >> $GITHUB_WORKSPACE/src/bun.js/bindings/sqlite/sqlite3_local.h + + - name: Create Pull Request + if: success() && steps.check-version.outputs.current_num < steps.check-version.outputs.latest_num + uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + add-paths: | + src/bun.js/bindings/sqlite/sqlite3.c + src/bun.js/bindings/sqlite/sqlite3_local.h + commit-message: "deps: update sqlite to ${{ steps.check-version.outputs.latest }}" + title: "deps: update sqlite to ${{ steps.check-version.outputs.latest }}" + delete-branch: true + branch: deps/update-sqlite-${{ steps.check-version.outputs.latest }} + body: | + ## What does this PR do? + + Updates SQLite to version ${{ steps.check-version.outputs.latest }} + + Auto-updated by [this workflow](https://github.com/oven-sh/bun/actions/workflows/update-sqlite3.yml) diff --git a/.github/workflows/zig-format.yml b/.github/workflows/zig-format.yml new file mode 100644 index 0000000000..199ab83395 --- /dev/null +++ b/.github/workflows/zig-format.yml @@ -0,0 +1,34 @@ +name: zig-format + +permissions: + contents: write + +on: + workflow_call: + workflow_dispatch: + pull_request: + merge_group: + +env: + BUN_VERSION: "1.2.0" + +jobs: + zig-format: + name: zig-format + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Setup Bun + uses: ./.github/actions/setup-bun + with: + bun-version: ${{ env.BUN_VERSION }} + - name: Zig Format + run: | + bun run zig-format:diff + - name: Commit + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "`bun run zig-format`" diff --git a/.gitignore b/.gitignore index a0c4419668..8793467f69 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ .vscode/clang* .vscode/cpp* .zig-cache +.bake-debug *.a *.bc *.big @@ -26,6 +27,7 @@ *.db *.dmg *.dSYM +*.generated.ts *.jsb *.lib *.log @@ -49,13 +51,12 @@ /build-*/ /bun-webkit /kcov-out -/src/deps/libuv /test-report.json /test-report.md /test.js /test.ts -/testdir /test.zig +/testdir build build.ninja bun-binary @@ -112,16 +113,15 @@ pnpm-lock.yaml profile.json README.md.template release/ +scripts/env.local sign.*.json sign.json +src/bake/generated.ts +src/generated_enum_extractor.zig src/bun.js/bindings-obj src/bun.js/bindings/GeneratedJS2Native.zig +src/bun.js/bindings/GeneratedBindings.zig src/bun.js/debug-bindings-obj -src/deps/c-ares/build -src/deps/libiconv -src/deps/openssl -src/deps/PLCrashReporter/ -src/deps/s2n-tls src/deps/zig-clap/.gitattributes src/deps/zig-clap/.github src/deps/zig-clap/example @@ -137,6 +137,7 @@ src/runtime.version src/tests.zig test.txt test/js/bun/glob/fixtures +test/node.js/upstream tsconfig.tsbuildinfo txt.js x64 @@ -146,3 +147,39 @@ zig-out test/node.js/upstream .zig-cache scripts/env.local +*.generated.ts +src/bake/generated.ts +test/cli/install/registry/packages/publish-pkg-* +test/cli/install/registry/packages/@secret/publish-pkg-8 +test/js/third_party/prisma/prisma/sqlite/dev.db-journal +tmp + +# Dependencies +/vendor + +# Dependencies (before CMake) +# These can be removed in the far future +/src/bun.js/WebKit +/src/deps/boringssl +/src/deps/brotli +/src/deps/c*ares +/src/deps/libarchive +/src/deps/libdeflate +/src/deps/libuv +/src/deps/lol*html +/src/deps/ls*hpack +/src/deps/mimalloc +/src/deps/picohttpparser +/src/deps/tinycc +/src/deps/WebKit +/src/deps/zig +/src/deps/zlib +/src/deps/zstd + +# Generated files + +.buildkite/ci.yml +*.sock +scratch*.{js,ts,tsx,cjs,mjs} + +*.bun-build \ No newline at end of file diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index c5069240a4..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,88 +0,0 @@ -[submodule "src/javascript/jsc/WebKit"] -path = src/bun.js/WebKit -url = https://github.com/oven-sh/WebKit.git -ignore = dirty -depth = 1 -update = none -shallow = true -fetchRecurseSubmodules = false -[submodule "src/deps/picohttpparser"] -path = src/deps/picohttpparser -url = https://github.com/h2o/picohttpparser.git -ignore = dirty -depth = 1 -shallow = true -fetchRecurseSubmodules = false -[submodule "src/deps/mimalloc"] -path = src/deps/mimalloc -url = https://github.com/Jarred-Sumner/mimalloc.git -ignore = dirty -depth = 1 -shallow = true -fetchRecurseSubmodules = false -[submodule "src/deps/zlib"] -path = src/deps/zlib -url = https://github.com/cloudflare/zlib.git -ignore = dirty -depth = 1 -shallow = true -fetchRecurseSubmodules = false -[submodule "src/deps/libarchive"] -path = src/deps/libarchive -url = https://github.com/libarchive/libarchive.git -ignore = dirty -depth = 1 -shallow = true -fetchRecurseSubmodules = false -[submodule "src/deps/boringssl"] -path = src/deps/boringssl -url = https://github.com/oven-sh/boringssl.git -ignore = dirty -depth = 1 -shallow = true -fetchRecurseSubmodules = false -[submodule "src/deps/lol-html"] -path = src/deps/lol-html -url = https://github.com/cloudflare/lol-html -ignore = dirty -depth = 1 -shallow = true -fetchRecurseSubmodules = false -[submodule "src/deps/tinycc"] -path = src/deps/tinycc -url = https://github.com/Jarred-Sumner/tinycc.git -ignore = dirty -depth = 1 -shallow = true -fetchRecurseSubmodules = false -[submodule "src/deps/c-ares"] -path = src/deps/c-ares -url = https://github.com/c-ares/c-ares.git -ignore = dirty -depth = 1 -shallow = true -fetchRecurseSubmodules = false -[submodule "src/deps/zstd"] -path = src/deps/zstd -url = https://github.com/facebook/zstd.git -ignore = dirty -depth = 1 -shallow = true -fetchRecurseSubmodules = false -[submodule "src/deps/ls-hpack"] -path = src/deps/ls-hpack -url = https://github.com/litespeedtech/ls-hpack.git -ignore = dirty -depth = 1 -shallow = true -fetchRecurseSubmodules = false -[submodule "zig"] -path = src/deps/zig -url = https://github.com/oven-sh/zig -depth = 1 -shallow = true -fetchRecurseSubmodules = false -[submodule "src/deps/libdeflate"] -path = src/deps/libdeflate -url = https://github.com/ebiggers/libdeflate -ignore = "dirty" diff --git a/.lldbinit b/.lldbinit index 5a59503d5d..a2357365bb 100644 --- a/.lldbinit +++ b/.lldbinit @@ -1,4 +1,4 @@ -command script import src/deps/zig/tools/lldb_pretty_printers.py -command script import src/bun.js/WebKit/Tools/lldb/lldb_webkit.py +# command script import vendor/zig/tools/lldb_pretty_printers.py +command script import vendor/WebKit/Tools/lldb/lldb_webkit.py # type summary add --summary-string "${var} | inner=${var[0-30]}, source=${var[33-64]}, tag=${var[31-32]}" "unsigned long" diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000000..5b36b34dde --- /dev/null +++ b/.mailmap @@ -0,0 +1,2 @@ +# To learn more about git's mailmap: https://ntietz.com/blog/git-mailmap-for-name-changes +chloe caruso diff --git a/.prettierignore b/.prettierignore index d7360d9d2f..5344afdbd8 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,7 +1,10 @@ src/bun.js/WebKit -src/deps +vendor test/snapshots test/js/deno test/node.js src/react-refresh.js *.min.js +test/snippets +test/js/node/test +bun.lock diff --git a/.typos.toml b/.typos.toml new file mode 100644 index 0000000000..7819bc056f --- /dev/null +++ b/.typos.toml @@ -0,0 +1,2 @@ +[type.md] +extend-ignore-words-re = ["^ba"] diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 3bd648a1ff..8e3517a2e3 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -3,18 +3,18 @@ { "name": "Debug", "forcedInclude": ["${workspaceFolder}/src/bun.js/bindings/root.h"], - "compileCommands": "${workspaceFolder}/build/compile_commands.json", + "compileCommands": "${workspaceFolder}/build/debug/compile_commands.json", "includePath": [ "${workspaceFolder}/build/bun-webkit/include", - "${workspaceFolder}/build/codegen", + "${workspaceFolder}/build/debug/codegen", "${workspaceFolder}/src/bun.js/bindings/", "${workspaceFolder}/src/bun.js/bindings/webcore/", "${workspaceFolder}/src/bun.js/bindings/sqlite/", "${workspaceFolder}/src/bun.js/bindings/webcrypto/", "${workspaceFolder}/src/bun.js/modules/", "${workspaceFolder}/src/js/builtins/", - "${workspaceFolder}/src/deps/boringssl/include/", - "${workspaceFolder}/src/deps", + "${workspaceFolder}/vendor/boringssl/include/", + "${workspaceFolder}/vendor", "${workspaceFolder}/src/napi/*", "${workspaceFolder}/packages/bun-usockets/src", "${workspaceFolder}/packages/", @@ -26,8 +26,8 @@ "${workspaceFolder}/src/napi/*", "${workspaceFolder}/src/js/builtins/*", "${workspaceFolder}/src/bun.js/modules/*", - "${workspaceFolder}/src/deps/*", - "${workspaceFolder}/src/deps/boringssl/include/*", + "${workspaceFolder}/vendor/*", + "${workspaceFolder}/vendor/boringssl/include/*", "${workspaceFolder}/packages/bun-usockets/*", "${workspaceFolder}/packages/bun-uws/*", "${workspaceFolder}/src/napi/*", @@ -55,12 +55,12 @@ "name": "BunWithJSCDebug", "forcedInclude": ["${workspaceFolder}/src/bun.js/bindings/root.h"], "includePath": [ - "${workspaceFolder}/build/codegen", - "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Debug/", - "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Debug/ICU/Headers/", - "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Debug/JavaScriptCore/PrivateHeaders/", - "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Debug/WTF/Headers", - "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Debug/bmalloc/Headers/", + "${workspaceFolder}/build/debug/codegen", + "${workspaceFolder}/vendor/WebKit/WebKitBuild/Debug/", + "${workspaceFolder}/vendor/WebKit/WebKitBuild/Debug/ICU/Headers/", + "${workspaceFolder}/vendor/WebKit/WebKitBuild/Debug/JavaScriptCore/PrivateHeaders/", + "${workspaceFolder}/vendor/WebKit/WebKitBuild/Debug/WTF/Headers", + "${workspaceFolder}/vendor/WebKit/WebKitBuild/Debug/bmalloc/Headers/", "${workspaceFolder}/src/bun.js/bindings/", "${workspaceFolder}/src/bun.js/bindings/webcore/", "${workspaceFolder}/src/bun.js/bindings/sqlite/", @@ -68,19 +68,19 @@ "${workspaceFolder}/src/bun.js/modules/", "${workspaceFolder}/src/js/builtins/", "${workspaceFolder}/src/js/out", - "${workspaceFolder}/src/deps/boringssl/include/", - "${workspaceFolder}/src/deps", + "${workspaceFolder}/vendor/boringssl/include/", + "${workspaceFolder}/vendor", "${workspaceFolder}/src/napi/*", "${workspaceFolder}/packages/bun-usockets/src", "${workspaceFolder}/packages/", ], "browse": { "path": [ - "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Debug/", - "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Debug/ICU/Headers/", - "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Debug/JavaScriptCore/PrivateHeaders/**", - "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Debug/WTF/Headers/**", - "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Debug/bmalloc/Headers/**", + "${workspaceFolder}/vendor/WebKit/WebKitBuild/Debug/", + "${workspaceFolder}/vendor/WebKit/WebKitBuild/Debug/ICU/Headers/", + "${workspaceFolder}/vendor/WebKit/WebKitBuild/Debug/JavaScriptCore/PrivateHeaders/**", + "${workspaceFolder}/vendor/WebKit/WebKitBuild/Debug/WTF/Headers/**", + "${workspaceFolder}/vendor/WebKit/WebKitBuild/Debug/bmalloc/Headers/**", "${workspaceFolder}/src/bun.js/bindings/*", "${workspaceFolder}/src/bun.js/bindings/*", "${workspaceFolder}/src/napi/*", @@ -90,8 +90,8 @@ "${workspaceFolder}/src/js/builtins/*", "${workspaceFolder}/src/js/out/*", "${workspaceFolder}/src/bun.js/modules/*", - "${workspaceFolder}/src/deps", - "${workspaceFolder}/src/deps/boringssl/include/", + "${workspaceFolder}/vendor", + "${workspaceFolder}/vendor/boringssl/include/", "${workspaceFolder}/packages/bun-usockets/", "${workspaceFolder}/packages/bun-uws/", "${workspaceFolder}/src/napi", diff --git a/.vscode/launch.json b/.vscode/launch.json index b51cae69bb..b4149c3020 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,31 +12,33 @@ "type": "lldb", "request": "launch", "name": "bun test [file]", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "1", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [file] --only", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "--only", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "1", "BUN_DEBUG_jest": "1", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", @@ -48,77 +50,82 @@ "type": "lldb", "request": "launch", "name": "bun test [file] (fast)", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "0", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [file] (verbose)", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "0", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [file] --watch", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "--watch", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [file] --hot", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "--hot", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [file] --inspect", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", "BUN_INSPECT": "ws://localhost:0/?wait=1", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], "serverReadyAction": { "pattern": "https://debug.bun.sh/#localhost:([0-9]+)/", "uriFormat": "https://debug.bun.sh/#ws://localhost:%s/", @@ -129,17 +136,18 @@ "type": "lldb", "request": "launch", "name": "bun test [file] --inspect-brk", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", "BUN_INSPECT": "ws://localhost:0/?break=1", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], "serverReadyAction": { "pattern": "https://debug.bun.sh/#localhost:([0-9]+)/", "uriFormat": "https://debug.bun.sh/#ws://localhost:%s/", @@ -151,8 +159,8 @@ "type": "lldb", "request": "launch", "name": "bun run [file]", - "program": "${workspaceFolder}/build/bun-debug", - "args": ["run", "${fileBasename}"], + "program": "${workspaceFolder}/build/debug/bun-debug", + "args": ["${file}"], "cwd": "${fileDirname}", "env": { "FORCE_COLOR": "0", @@ -160,69 +168,82 @@ "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun run [file] (fast)", - "program": "${workspaceFolder}/build/bun-debug", - "args": ["run", "${fileBasename}"], + "program": "${workspaceFolder}/build/debug/bun-debug", + "args": ["run", "${file}"], "cwd": "${fileDirname}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "0", + "BUN_DEBUG_IncrementalGraph": "1", + "BUN_DEBUG_Bake": "1", + "BUN_DEBUG_reload_file_list": "1", + "GOMAXPROCS": "1", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun run [file] (verbose)", - "program": "${workspaceFolder}/build/bun-debug", - "args": ["run", "${fileBasename}"], + "program": "${workspaceFolder}/build/debug/bun-debug", + "args": ["run", "${file}"], "cwd": "${fileDirname}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "0", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun run [file] --watch", - "program": "${workspaceFolder}/build/bun-debug", - "args": ["run", "--watch", "${fileBasename}"], + "program": "${workspaceFolder}/build/debug/bun-debug", + "args": ["run", "--watch", "${file}"], "cwd": "${fileDirname}", "env": { - "FORCE_COLOR": "1", + // "BUN_DEBUG_DEBUGGER": "1", + // "BUN_DEBUG_INTERNAL_DEBUGGER": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", + // "BUN_INSPECT": "ws+unix:///var/folders/jk/8fzl9l5119598vsqrmphsw7m0000gn/T/tl15npi7qtf.sock?report=1", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun run [file] --hot", - "program": "${workspaceFolder}/build/bun-debug", - "args": ["run", "--hot", "${fileBasename}"], + "program": "${workspaceFolder}/build/debug/bun-debug", + "args": ["run", "--hot", "${file}"], "cwd": "${fileDirname}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun run [file] --inspect", - "program": "${workspaceFolder}/build/bun-debug", - "args": ["run", "${fileBasename}"], + "program": "${workspaceFolder}/build/debug/bun-debug", + "args": ["run", "${file}"], "cwd": "${fileDirname}", "env": { "FORCE_COLOR": "0", @@ -231,6 +252,8 @@ "BUN_INSPECT": "ws://localhost:0/?wait=1", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], "serverReadyAction": { "pattern": "https://debug.bun.sh/#localhost:([0-9]+)/", "uriFormat": "https://debug.bun.sh/#ws://localhost:%s/", @@ -241,8 +264,8 @@ "type": "lldb", "request": "launch", "name": "bun run [file] --inspect-brk", - "program": "${workspaceFolder}/build/bun-debug", - "args": ["run", "${fileBasename}"], + "program": "${workspaceFolder}/build/debug/bun-debug", + "args": ["run", "${file}"], "cwd": "${fileDirname}", "env": { "FORCE_COLOR": "0", @@ -251,6 +274,8 @@ "BUN_INSPECT": "ws://localhost:0/?break=1", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], "serverReadyAction": { "pattern": "https://debug.bun.sh/#localhost:([0-9]+)/", "uriFormat": "https://debug.bun.sh/#ws://localhost:%s/", @@ -262,92 +287,98 @@ "type": "lldb", "request": "launch", "name": "bun test [...]", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [...] (fast)", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "0", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [...] (verbose)", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [...] --watch", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "--watch", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [...] --hot", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "--hot", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [...] --inspect", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", "BUN_INSPECT": "ws://localhost:0/?wait=1", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], "serverReadyAction": { "pattern": "https://debug.bun.sh/#localhost:([0-9]+)/", "uriFormat": "https://debug.bun.sh/#ws://localhost:%s/", @@ -358,17 +389,18 @@ "type": "lldb", "request": "launch", "name": "bun test [...] --inspect-brk", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_DEBUG_jest": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", "BUN_INSPECT": "ws://localhost:0/?break=1", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], "serverReadyAction": { "pattern": "https://debug.bun.sh/#localhost:([0-9]+)/", "uriFormat": "https://debug.bun.sh/#ws://localhost:%s/", @@ -380,59 +412,63 @@ "type": "lldb", "request": "launch", "name": "bun exec [...]", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["exec", "${input:testName}"], "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, // bun test [*] { "type": "lldb", "request": "launch", "name": "bun test [*]", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [*] (fast)", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "0", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", "request": "launch", "name": "bun test [*] --inspect", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["test"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", "BUN_INSPECT": "ws://localhost:0/", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], "serverReadyAction": { "pattern": "https://debug.bun.sh/#localhost:([0-9]+)/", "uriFormat": "https://debug.bun.sh/#ws://localhost:%s/", @@ -443,15 +479,16 @@ "type": "lldb", "request": "launch", "name": "bun install [folder]", - "program": "${workspaceFolder}/build/bun-debug", + "program": "${workspaceFolder}/build/debug/bun-debug", "args": ["install"], "cwd": "${fileDirname}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, { "type": "lldb", @@ -461,11 +498,12 @@ "args": ["test/runner.node.mjs"], "cwd": "${workspaceFolder}", "env": { - "FORCE_COLOR": "1", "BUN_DEBUG_QUIET_LOGS": "1", "BUN_GARBAGE_COLLECTOR_LEVEL": "2", }, "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, // Windows: bun test [file] { @@ -475,14 +513,10 @@ }, "request": "launch", "name": "Windows: bun test [file]", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -504,14 +538,10 @@ }, "request": "launch", "name": "Windows: bun test --only [file]", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "--only", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -533,14 +563,10 @@ }, "request": "launch", "name": "Windows: bun test [file] (fast)", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -562,14 +588,10 @@ }, "request": "launch", "name": "Windows: bun test [file] (verbose)", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "0", @@ -591,14 +613,10 @@ }, "request": "launch", "name": "Windows: bun test [file] --inspect", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -629,14 +647,10 @@ }, "request": "launch", "name": "Windows: bun test [file] --inspect-brk", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "${file}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -668,14 +682,10 @@ }, "request": "launch", "name": "Windows: bun run [file]", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["run", "${fileBasename}"], "cwd": "${fileDirname}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -697,14 +707,10 @@ }, "request": "launch", "name": "Windows: bun install", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["install"], "cwd": "${fileDirname}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -722,16 +728,16 @@ }, "request": "launch", "name": "Windows: bun run [file] (verbose)", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["run", "${fileBasename}"], "cwd": "${fileDirname}", "environment": [ { - "name": "FORCE_COLOR", + "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", }, { - "name": "BUN_DEBUG_QUIET_LOGS", + "name": "BUN_DEBUG_SYS", "value": "1", }, { @@ -747,14 +753,10 @@ }, "request": "launch", "name": "Windows: bun run [file] --inspect", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["run", "${fileBasename}"], "cwd": "${fileDirname}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -781,14 +783,10 @@ }, "request": "launch", "name": "Windows: bun run [file] --inspect-brk", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["run", "${fileBasename}"], "cwd": "${fileDirname}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -816,14 +814,10 @@ }, "request": "launch", "name": "Windows: bun test [...]", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -845,14 +839,10 @@ }, "request": "launch", "name": "Windows: bun test [...] (fast)", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -874,14 +864,10 @@ }, "request": "launch", "name": "Windows: bun test [...] (verbose)", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "0", @@ -903,14 +889,10 @@ }, "request": "launch", "name": "Windows: bun test [...] --watch", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "--watch", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -932,14 +914,10 @@ }, "request": "launch", "name": "Windows: bun test [...] --hot", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "--hot", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -961,14 +939,10 @@ }, "request": "launch", "name": "Windows: bun test [...] --inspect", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -999,14 +973,10 @@ }, "request": "launch", "name": "Windows: bun test [...] --inspect-brk", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test", "${input:testName}"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -1038,14 +1008,10 @@ }, "request": "launch", "name": "Windows: bun exec [...]", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["exec", "${input:testName}"], "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -1064,14 +1030,10 @@ }, "request": "launch", "name": "Windows: bun test [*]", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -1089,14 +1051,10 @@ }, "request": "launch", "name": "Windows: bun test [*] (fast)", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -1118,14 +1076,10 @@ }, "request": "launch", "name": "Windows: bun test [*] --inspect", - "program": "${workspaceFolder}/build/bun-debug.exe", + "program": "${workspaceFolder}/build/debug/bun-debug.exe", "args": ["test"], - "cwd": "${workspaceFolder}/test", + "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -1160,10 +1114,6 @@ "args": ["test/runner.node.mjs"], "cwd": "${workspaceFolder}", "environment": [ - { - "name": "FORCE_COLOR", - "value": "1", - }, { "name": "BUN_DEBUG_QUIET_LOGS", "value": "1", @@ -1178,6 +1128,8 @@ }, ], "console": "internalConsole", + // Don't pause when the GC runs while the debugger is open. + "postRunCommands": ["command source '${workspaceFolder}/misctools/lldb/lldb_commands'"], }, ], "inputs": [ diff --git a/.vscode/settings.json b/.vscode/settings.json index a533a0a9f0..a6ec222240 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,8 +12,7 @@ "search.exclude": { "node_modules": true, ".git": true, - "src/bun.js/WebKit": true, - "src/deps/*/**": true, + "vendor/*/**": true, "test/node.js/upstream": true, // This will fill up your whole search history. "test/js/node/test/fixtures": true, @@ -30,13 +29,14 @@ // Zig "zig.initialSetupDone": true, "zig.buildOption": "build", - "zig.zls.zigLibPath": "${workspaceFolder}/src/deps/zig/lib", - "zig.buildArgs": ["-Dgenerated-code=./build/codegen"], + "zig.zls.zigLibPath": "${workspaceFolder}/vendor/zig/lib", + "zig.buildArgs": ["-Dgenerated-code=./build/debug/codegen"], "zig.zls.buildOnSaveStep": "check", // "zig.zls.enableBuildOnSave": true, // "zig.buildOnSave": true, "zig.buildFilePath": "${workspaceFolder}/build.zig", - "zig.path": "${workspaceFolder}/.cache/zig/zig.exe", + "zig.path": "${workspaceFolder}/vendor/zig/zig.exe", + "zig.zls.path": "${workspaceFolder}/vendor/zig/zls.exe", "zig.formattingProvider": "zls", "zig.zls.enableInlayHints": false, "[zig]": { @@ -53,14 +53,18 @@ "cmake.configureOnOpen": false, "C_Cpp.errorSquiggles": "enabled", "[cpp]": { + "editor.tabSize": 4, "editor.defaultFormatter": "xaver.clang-format", }, "[c]": { + "editor.tabSize": 4, "editor.defaultFormatter": "xaver.clang-format", }, "[h]": { + "editor.tabSize": 4, "editor.defaultFormatter": "xaver.clang-format", }, + "clangd.arguments": ["--header-insertion=never"], // JavaScript "prettier.enable": true, @@ -75,7 +79,7 @@ "prettier.prettierPath": "./node_modules/prettier", // TypeScript - "typescript.tsdk": "${workspaceFolder}/node_modules/typescript/lib", + "typescript.tsdk": "node_modules/typescript/lib", "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode", }, @@ -137,8 +141,11 @@ "packages/bun-uws/fuzzing": true, }, "files.associations": { + "*.css": "tailwindcss", "*.idl": "cpp", + "*.mdc": "markdown", "array": "cpp", + "ios": "cpp", }, "C_Cpp.files.exclude": { "**/.vscode": true, diff --git a/.vscode/tasks.json b/.vscode/tasks.json index faf1dc0d22..5ead186425 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,50 +2,57 @@ "version": "2.0.0", "tasks": [ { - "type": "process", - "label": "Install Dependencies", - "command": "scripts/all-dependencies.sh", - "windows": { - "command": "scripts/all-dependencies.ps1", - }, - "icon": { - "id": "arrow-down", - }, - "options": { - "cwd": "${workspaceFolder}", - }, - }, - { - "type": "process", - "label": "Setup Environment", - "dependsOn": ["Install Dependencies"], - "command": "scripts/setup.sh", - "windows": { - "command": "scripts/setup.ps1", - }, - "icon": { - "id": "check", - }, - "options": { - "cwd": "${workspaceFolder}", - }, - }, - { - "type": "process", "label": "Build Bun", - "dependsOn": ["Setup Environment"], - "command": "bun", - "args": ["run", "build"], - "icon": { - "id": "gear", + "type": "shell", + "command": "bun run build", + "group": { + "kind": "build", + "isDefault": true, }, - "options": { - "cwd": "${workspaceFolder}", - }, - "isBuildCommand": true, - "runOptions": { - "instanceLimit": 1, - "reevaluateOnRerun": true, + "problemMatcher": [ + { + "owner": "zig", + "fileLocation": ["relative", "${workspaceFolder}"], + "pattern": [ + { + "regexp": "^(.+?):(\\d+):(\\d+): (error|warning|note): (.+)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5, + }, + { + "regexp": "^\\s+(.+)$", + "message": 1, + "loop": true, + }, + ], + }, + { + "owner": "clang", + "fileLocation": ["relative", "${workspaceFolder}"], + "pattern": [ + { + "regexp": "^([^:]+):(\\d+):(\\d+):\\s+(warning|error|note|remark):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5, + }, + { + "regexp": "^\\s*(.*)$", + "message": 1, + "loop": true, + }, + ], + }, + ], + "presentation": { + "reveal": "always", + "panel": "shared", + "clear": true, }, }, ], diff --git a/CMakeLists.txt b/CMakeLists.txt index f2b6f85f11..6762f49e66 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,1646 +1,57 @@ -cmake_minimum_required(VERSION 3.22) -cmake_policy(SET CMP0091 NEW) -cmake_policy(SET CMP0067 NEW) - -set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) -set(Bun_VERSION "1.1.27") -set(WEBKIT_TAG 3f9ba9bae0ee666f5e3edb295c86cbc855cd05a0) - -set(BUN_WORKDIR "${CMAKE_CURRENT_BINARY_DIR}") -message(STATUS "Configuring Bun ${Bun_VERSION} in ${BUN_WORKDIR}") - -set(CMAKE_COLOR_DIAGNOSTICS ON) -set(CMAKE_CXX_STANDARD 20) -set(CMAKE_C_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_C_STANDARD_REQUIRED ON) - -option(ZIG_CACHE_DIR "Path to the Zig cache directory" "") - -if(NOT ZIG_CACHE_DIR) - SET(ZIG_CACHE_DIR "${BUN_WORKDIR}") - cmake_path(APPEND ZIG_CACHE_DIR "zig-cache") -endif() - -set(LOCAL_ZIG_CACHE_DIR "${ZIG_CACHE_DIR}") -set(GLOBAL_ZIG_CACHE_DIR "${ZIG_CACHE_DIR}") - -cmake_path(APPEND LOCAL_ZIG_CACHE_DIR "local") -cmake_path(APPEND GLOBAL_ZIG_CACHE_DIR "global") - -# Used in process.version, process.versions.node, napi, and elsewhere -set(REPORTED_NODEJS_VERSION "22.6.0") - -# Used in process.versions.modules and compared while loading V8 modules -set(REPORTED_NODEJS_ABI_VERSION "127") - -# WebKit uses -std=gnu++20 on non-macOS non-Windows -# If we do not set this, it will crash at startup on the first memory allocation. -if(NOT WIN32 AND NOT APPLE) - set(CMAKE_CXX_EXTENSIONS ON) - set(CMAKE_POSITION_INDEPENDENT_CODE FALSE) -endif() - -# --- Build Type --- -if(NOT CMAKE_BUILD_TYPE) - message(WARNING "No CMAKE_BUILD_TYPE value specified, defaulting to Debug.\nSet a build type with -DCMAKE_BUILD_TYPE=") - set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build (Debug, Release)" FORCE) -else() - if(NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|Release)$") - message(FATAL_ERROR - "Invalid CMAKE_BUILD_TYPE value specified: ${CMAKE_BUILD_TYPE}\n" - "CMAKE_BUILD_TYPE must be Debug or Release.") - endif() - - message(STATUS "The CMake build type is: ${CMAKE_BUILD_TYPE}") -endif() - -if(WIN32 AND NOT CMAKE_CL_SHOWINCLUDES_PREFIX) - # workaround until cmake fix is shipped https://github.com/ninja-build/ninja/issues/2280 - # './build/.ninja_deps' may need to be deleted, the bug is "Note: including file: ..." is saved - # as part of some file paths - set(CMAKE_CL_SHOWINCLUDES_PREFIX "Note: including file:") -endif() - -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(DEBUG ON) - set(DEFAULT_ZIG_OPTIMIZE "Debug") - set(bun "bun-debug") - - # COMPILE_COMMANDS - set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -elseif(CMAKE_BUILD_TYPE STREQUAL "Release") - set(DEBUG OFF) - set(DEFAULT_ZIG_OPTIMIZE "ReleaseFast") - - if(WIN32) - # Debug symbols are in a separate file: bun.pdb - set(bun "bun") - set(DEFAULT_ZIG_OPTIMIZE "ReleaseSafe") - else() - if(ZIG_OPTIMIZE STREQUAL "Debug") - set(bun "bun-debug") - else() - set(bun "bun-profile") - endif() - endif() -endif() - -# --- MacOS SDK --- -if(APPLE AND DEFINED ENV{CI}) - set(CMAKE_OSX_DEPLOYMENT_TARGET "13.0") -endif() - -if(APPLE AND NOT CMAKE_OSX_DEPLOYMENT_TARGET) - execute_process(COMMAND xcrun --show-sdk-path OUTPUT_VARIABLE SDKROOT) - string(STRIP ${SDKROOT} SDKROOT) - message(STATUS "MacOS SDK path: ${SDKROOT}") - SET(CMAKE_OSX_SYSROOT ${SDKROOT}) - - execute_process(COMMAND xcrun --sdk macosx --show-sdk-version OUTPUT_VARIABLE MACOSX_DEPLOYMENT_TARGET) - string(STRIP ${MACOSX_DEPLOYMENT_TARGET} MACOSX_DEPLOYMENT_TARGET) - set(CMAKE_OSX_DEPLOYMENT_TARGET ${MACOSX_DEPLOYMENT_TARGET}) - - # Check if current version of macOS is less than the deployment target and if so, raise an error - execute_process(COMMAND sw_vers -productVersion OUTPUT_VARIABLE MACOS_VERSION) - string(STRIP ${MACOS_VERSION} MACOS_VERSION) - - if(MACOS_VERSION VERSION_LESS ${MACOSX_DEPLOYMENT_TARGET}) - message(WARNING - "The current version of macOS (${MACOS_VERSION}) is less than the deployment target (${MACOSX_DEPLOYMENT_TARGET}).\n" - "The build will be incompatible with your current device due to mismatches in `icucore` versions.\n" - "To fix this, please either:\n" - " - Upgrade to at least macOS ${MACOSX_DEPLOYMENT_TARGET}\n" - " - Use `xcode-select` to switch to an SDK version <= ${MACOS_VERSION}\n" - " - Set CMAKE_OSX_DEPLOYMENT_TARGET=${MACOS_VERSION} (make sure to build all dependencies with this variable set too)" - ) - endif() -endif() - -if(APPLE) - message(STATUS "Building for macOS v${CMAKE_OSX_DEPLOYMENT_TARGET}") -endif() - -# --- LLVM --- -# This detection is a little overkill, but it ensures that the set LLVM_VERSION matches under -# any case possible. Sorry for the complexity... -# -# Bun and WebKit must be compiled with the same compiler, so we do as much as we can to ensure that -# the compiler used for the prebuilt WebKit is the same as we install as a dependency. -# -# It has to be done before project() is called, so that CMake doesnt pick a compiler for us, but even then -# we do some extra work afterwards to double-check, and we will rerun BUN_FIND_LLVM if the compiler did not match. -# -# If the user passes -DLLVM_PREFIX, most of this logic is skipped, but we still warn if invalid. -if(WIN32 OR APPLE) - set(LLVM_VERSION 18) -else() - set(LLVM_VERSION 16) -endif() - -macro(BUN_FIND_LLVM) - find_program( - _LLVM_CXX_PATH - NAMES clang++-${LLVM_VERSION} clang++ - PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} - DOC "Path to LLVM ${LLVM_VERSION}'s clang++ binary. Please pass -DLLVM_PREFIX with the path to LLVM" - ) - - if(NOT _LLVM_CXX_PATH) - message(FATAL_ERROR "Could not find LLVM ${LLVM_VERSION}, search paths: ${PLATFORM_LLVM_SEARCH_PATHS}") - endif() - - set(CMAKE_CXX_COMPILER "${_LLVM_CXX_PATH}") - find_program( - _LLVM_C_PATH - NAMES clang-${LLVM_VERSION} clang - PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} - DOC "Path to LLVM ${LLVM_VERSION}'s clang binary. Please pass -DLLVM_PREFIX with the path to LLVM" - ) - - if(NOT _LLVM_C_PATH) - message(FATAL_ERROR "Could not find LLVM ${LLVM_VERSION}, search paths: ${PLATFORM_LLVM_SEARCH_PATHS}") - endif() - - set(CMAKE_C_COMPILER "${_LLVM_C_PATH}") - - find_program( - STRIP - NAMES llvm-strip - PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} - DOC "Path to LLVM ${LLVM_VERSION}'s llvm-strip binary" - ) - - find_program( - STRIP - NAMES strip - PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} - DOC "Path to strip binary" - ) - find_program( - DSYMUTIL - NAMES dsymutil - PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} - DOC "Path to LLVM ${LLVM_VERSION}'s dsymutil binary" - ) - find_program( - AR - NAMES llvm-ar - PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} - DOC "Path to LLVM ${LLVM_VERSION}'s llvm-ar binary" - ) - find_program( - AR - NAMES ar - PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} - DOC "Path to LLVM ${LLVM_VERSION}'s llvm-ar binary" - ) - find_program( - RANLIB - NAMES llvm-ranlib - PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} - DOC "Path to LLVM ${LLVM_VERSION}'s llvm-ar binary" - ) - - execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version OUTPUT_VARIABLE _tmp) - string(REGEX MATCH "version ([0-9]+)\\.([0-9]+)\\.([0-9]+)" CMAKE_CXX_COMPILER_VERSION "${_tmp}") - set(CMAKE_CXX_COMPILER_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") -endmacro() - -if(UNIX) - if(LLVM_PREFIX) - set(PLATFORM_LLVM_SEARCH_PATHS ${LLVM_PREFIX}/bin) - else() - set(PLATFORM_LLVM_SEARCH_PATHS /usr/lib/llvm-${LLVM_VERSION}/bin /usr/lib/llvm${LLVM_VERSION}/bin /usr/bin /usr/local/bin) - - if(APPLE) - set(PLATFORM_LLVM_SEARCH_PATHS /opt/homebrew/opt/llvm@${LLVM_VERSION}/bin /opt/homebrew/bin ${PLATFORM_LLVM_SEARCH_PATHS}) - endif() - endif() - - if(CMAKE_CXX_COMPILER) - set(_LLVM_CXX_PATH "${CMAKE_CXX_COMPILER}") - endif() - - if(CMAKE_C_COMPILER) - set(_LLVM_C_PATH "${CMAKE_C_COMPILER}") - endif() - - BUN_FIND_LLVM() -else() - # Windows uses Clang-CL - # TODO: good configuration in this regard. -G Ninja will pick clang-cl if possible, which should be fine for most users. - if(NOT CMAKE_C_COMPILER) - set(CMAKE_C_COMPILER "clang-cl") - endif() - - if(NOT CMAKE_CXX_COMPILER) - set(CMAKE_CXX_COMPILER "clang-cl") - endif() - - find_program( - STRIP - NAMES llvm-strip - PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} - DOC "Path to LLVM ${LLVM_VERSION}'s llvm-strip binary" - ) - find_program( - AR - NAMES llvm-ar - PATHS ENV PATH ${PLATFORM_LLVM_SEARCH_PATHS} - DOC "Path to LLVM ${LLVM_VERSION}'s llvm-ar binary" - ) -endif() - -project(Bun VERSION "${Bun_VERSION}") - -# if(MSVC) -# message(FATAL_ERROR "Bun does not support building with MSVC. Please use `cmake -G Ninja` with LLVM ${LLVM_VERSION} and Ninja.") -# endif() - -# More effort to prevent using the wrong C++ compiler -if(UNIX) - if((NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR(NOT CMAKE_CXX_COMPILER_VERSION MATCHES "^${LLVM_VERSION}\.")) - # Attempt to auto-correct the compiler - message(STATUS "Compiler mismatch, attempting to auto-correct") - unset(_LLVM_CXX_PATH) - BUN_FIND_LLVM() - - if((NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR(NOT CMAKE_CXX_COMPILER_VERSION MATCHES "^${LLVM_VERSION}\.")) - message(WARNING "Expected LLVM ${LLVM_VERSION} as the C++ compiler, build may fail or break at runtime.") - endif() - endif() -endif() - -message(STATUS "C++ Compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} at ${CMAKE_CXX_COMPILER}") - -# --- End LLVM --- -if(NOT WIN32) - set(SHELL "bash") - set(SCRIPT_EXTENSION "sh") -else() - set(SCRIPT_EXTENSION "ps1") - - # pwsh is the new powershell, powershell is the old one. - find_program(SHELL NAMES pwsh powershell) -endif() - -set(DEFAULT_ON_UNLESS_APPLE ON) - -if(APPLE) - set(DEFAULT_ON_UNLESS_APPLE OFF) -endif() - -set(CI OFF) - -if(DEFINED ENV{CI} OR DEFINED ENV{GITHUB_ACTIONS}) - set(CI ON) -endif() - -set(DEFAULT_USE_STATIC_LIBATOMIC ON) -set(DEFAULT_USE_DEBUG_JSC, OFF) - -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(DEFAULT_USE_DEBUG_JSC ON) - set(DEFAULT_LTO OFF) -elseif(CMAKE_BUILD_TYPE STREQUAL "Release") - if(CI) - set(DEFAULT_LTO ON) - else() - set(DEFAULT_LTO OFF) - endif() -endif() - -if(WIN32) - set(DEFAULT_USE_DEBUG_JSC OFF) -endif() - -if(UNIX AND NOT APPLE) - execute_process(COMMAND grep -w "NAME" /etc/os-release OUTPUT_VARIABLE LINUX_DISTRO) - - if(${LINUX_DISTRO} MATCHES "NAME=\"(Arch|Manjaro|Artix) Linux\"|NAME=\"openSUSE Tumbleweed\"\n") - set(DEFAULT_USE_STATIC_LIBATOMIC OFF) - endif() -endif() - -# -- Build Flags -- -option(USE_STATIC_SQLITE "Statically link SQLite?" ${DEFAULT_ON_UNLESS_APPLE}) -option(USE_CUSTOM_ZLIB "Use Bun's recommended version of zlib" ON) -option(USE_CUSTOM_LIBDEFLATE "Use Bun's recommended version of libdeflate" ON) -option(USE_CUSTOM_BORINGSSL "Use Bun's recommended version of BoringSSL" ON) -option(USE_CUSTOM_LIBARCHIVE "Use Bun's recommended version of libarchive" ON) -option(USE_CUSTOM_MIMALLOC "Use Bun's recommended version of Mimalloc" ON) -option(USE_CUSTOM_ZSTD "Use Bun's recommended version of zstd" ON) -option(USE_CUSTOM_CARES "Use Bun's recommended version of c-ares" ON) -option(USE_CUSTOM_LOLHTML "Use Bun's recommended version of lolhtml" ON) -option(USE_CUSTOM_TINYCC "Use Bun's recommended version of tinycc" ON) -option(USE_CUSTOM_LIBUV "Use Bun's recommended version of libuv (Windows only)" ON) -option(USE_CUSTOM_LSHPACK "Use Bun's recommended version of ls-hpack" ON) -option(USE_BASELINE_BUILD "Build Bun for baseline (older) CPUs" OFF) -option(USE_SYSTEM_ICU "Use the system-provided libicu. May fix startup crashes when building WebKit yourself." OFF) - -option(USE_VALGRIND "Build Bun with Valgrind support (Linux only)" OFF) - -option(ZIG_OPTIMIZE "Optimization level for Zig" ${DEFAULT_ZIG_OPTIMIZE}) -option(USE_DEBUG_JSC "Enable assertions and use a debug build of JavaScriptCore" ${DEFAULT_USE_DEBUG_JSC}) -option(USE_UNIFIED_SOURCES "Use unified sources to speed up the build" OFF) -option(USE_STATIC_LIBATOMIC "Statically link libatomic, requires the presence of libatomic.a" ${DEFAULT_USE_STATIC_LIBATOMIC}) - -option(USE_LTO "Enable Link-Time Optimization" ${DEFAULT_LTO}) - -if(APPLE AND USE_LTO) - set(USE_LTO OFF) - message(FATAL_ERROR "Link-Time Optimization is not supported on macOS because it requires -fuse-ld=lld and lld causes many segfaults on macOS (likely related to stack size)") -endif() - -if(WIN32 AND USE_LTO) - set(CMAKE_LINKER_TYPE LLD) - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF) -endif() - -option(BUN_TIDY_ONLY "Only run clang-tidy" OFF) -option(BUN_TIDY_ONLY_EXTRA " Only run clang-tidy, with extra checks for local development" OFF) - -if(NOT ZIG_LIB_DIR) - cmake_path(SET ZIG_LIB_DIR NORMALIZE "${CMAKE_CURRENT_SOURCE_DIR}/src/deps/zig/lib") -endif() - -if(USE_VALGRIND) - # Disable SIMD - set(USE_BASELINE_BUILD ON) - - if(ARCH STREQUAL "x86_64") - # This is for picohttpparser - # Valgrind cannot handle SSE4.2 instructions - add_compile_definitions("__SSE4_2__=0") - endif() -endif() - -if(NOT CANARY) - set(CANARY 0) -endif() - -if(NOT ENABLE_LOGS) - set(ENABLE_LOGS false) -endif() - -if(NOT ZIG_OPTIMIZE) - set(ZIG_OPTIMIZE ${DEFAULT_ZIG_OPTIMIZE}) -endif() - -set(ERROR_LIMIT 100 CACHE STRING "Maximum number of errors to show when compiling C++ code") - -set(ARCH x86_64) -set(HOMEBREW_PREFIX "/usr/local") - -if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64|arm") - set(ARCH aarch64) - set(HOMEBREW_PREFIX "/opt/homebrew") -endif() - -if(NOT CPU_TARGET) - if(DEFINED ENV{CPU_TARGET}) - set(CPU_TARGET $ENV{CPU_TARGET}) - else() - set(CPU_TARGET "native" CACHE STRING "CPU target for the compiler" FORCE) - - if(ARCH STREQUAL "x86_64") - if(USE_BASELINE_BUILD) - set(CPU_TARGET "nehalem") - else() - set(CPU_TARGET "haswell") - endif() - endif() - endif() -endif() - -message(STATUS "Building for CPU Target: ${CPU_TARGET}") - -if(NOT ZIG_TARGET) - set(ZIG_TARGET "native") - - if(WIN32) - set(ZIG_TARGET "${ARCH}-windows-msvc") - endif() -endif() - -set(CONFIGURE_DEPENDS "CONFIGURE_DEPENDS") - -if(NO_CONFIGURE_DEPENDS) - set(CONFIGURE_DEPENDS "") -endif() - -# --- CLI Paths --- -set(REQUIRED_IF_NOT_ONLY_CPP_OR_LINK "") - -if(NOT BUN_CPP_ONLY AND NOT BUN_LINK_ONLY) - set(REQUIRED_IF_NOT_ONLY_CPP_OR_LINK "REQUIRED") -endif() - -# Zig Compiler -function(validate_zig validator_result_var item) - set(${validator_result_var} FALSE PARENT_SCOPE) - - # We will allow any valid zig compiler, as long as it contains some text from `zig zen` - # Ideally we would do a version or feature check, but that would be quite slow - execute_process(COMMAND ${item} zen OUTPUT_VARIABLE ZIG_ZEN_OUTPUT) - - if(ZIG_ZEN_OUTPUT MATCHES "Together we serve the users") - set(${validator_result_var} TRUE PARENT_SCOPE) - else() - set(${validator_result_var} FALSE PARENT_SCOPE) - endif() -endfunction() - -if(ZIG_COMPILER) - if(ZIG_COMPILER STREQUAL "system") - message(STATUS "Using system Zig compiler") - unset(ZIG_COMPILER_) - endif() - - find_program(ZIG_COMPILER_ zig ${REQUIRED_IF_NOT_ONLY_CPP_OR_LINK} DOC "Path to the Zig compiler" VALIDATOR validate_zig) - set(ZIG_COMPILER "${ZIG_COMPILER_}") - message(STATUS "Found Zig Compiler: ${ZIG_COMPILER}") -elseif(NOT BUN_CPP_ONLY AND NOT BUN_LINK_ONLY AND NOT BUN_TIDY_ONLY AND NOT BUN_TIDY_ONLY_EXTRA) - execute_process( - COMMAND "${SHELL}" - "${CMAKE_CURRENT_SOURCE_DIR}/scripts/download-zig.${SCRIPT_EXTENSION}" - ) - set(ZIG_COMPILER "${CMAKE_CURRENT_SOURCE_DIR}/.cache/zig/zig") - - if(WIN32) - set(ZIG_COMPILER "${ZIG_COMPILER}.exe") - endif() - - if(NOT EXISTS "${ZIG_COMPILER}") - unset(ZIG_COMPILER) - message(FATAL_ERROR "Auto-installation of Zig failed. Please pass -DZIG_COMPILER=system or a path to the Zig") - endif() - - message(STATUS "Installed Zig Compiler: ${ZIG_COMPILER}") - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "build.zig") - - message(STATUS "Using zig cache directory: ${ZIG_CACHE_DIR}") -endif() - -# Bun -find_program(BUN_EXECUTABLE bun ${REQUIRED_IF_NOT_ONLY_CPP_OR_LINK} DOC "Path to an already built release of Bun") -message(STATUS "Found Bun: ${BUN_EXECUTABLE}") - -if(WIN32 AND NO_CODEGEN) - # TODO(@paperdave): remove this, see bun-windows.yml's comment. - set(BUN_EXECUTABLE "echo") -endif() - -# Prettier -find_program(PRETTIER prettier DOC "Path to prettier" PATHS ./node_modules/.bin ENV PATH) - -# Esbuild (TODO: switch these to "bun build") -find_program(ESBUILD esbuild DOC "Path to esbuild" PATHS ./node_modules/.bin ENV PATH) - -# Ruby (only needed for unified sources) -if(USE_UNIFIED_SOURCES) - # ruby 'WebKit/Source/WTF/Scripts/generate-unified-source-bundles.rb' source_list.txt --source-tree-path . --derived-sources-path build/unified-sources - find_program(RUBY ruby DOC "Path to ruby") -endif() - -# CCache -# find_program(CCACHE_PROGRAM sccache) -find_program(CCACHE_PROGRAM ccache) - -if(CCACHE_PROGRAM) - set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") - set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") - message(STATUS "Using ccache: ${CCACHE_PROGRAM}") -endif() - -# --- WebKit --- -# WebKit is either prebuilt and distributed via NPM, or you can pass WEBKIT_DIR to use a local build. -# We cannot include their CMake build files (TODO: explain why, for now ask @paperdave why) -# -# On Unix, this will pull from NPM the single package that is needed and use that -if(WIN32) - set(STATIC_LIB_EXT "lib") - set(libJavaScriptCore "JavaScriptCore") - set(libWTF "WTF") -else() - set(STATIC_LIB_EXT "a") - set(libJavaScriptCore "libJavaScriptCore") - set(libWTF "libWTF") -endif() - -if(NOT WEBKIT_DIR) - set(BUN_WEBKIT_PACKAGE_NAME_SUFFIX "") - set(ASSERT_ENABLED "0") - - if(USE_DEBUG_JSC) - add_compile_definitions("BUN_DEBUG=1") - set(BUN_WEBKIT_PACKAGE_NAME_SUFFIX "-debug") - set(ASSERT_ENABLED "1") - elseif(NOT DEBUG AND NOT WIN32) - # Avoid waiting for LTO in local release builds outside of CI - if(USE_LTO) - set(BUN_WEBKIT_PACKAGE_NAME_SUFFIX "-lto") - else() - set(BUN_WEBKIT_PACKAGE_NAME_SUFFIX "") - endif() - - set(ASSERT_ENABLED "0") - endif() - - if(WIN32) - set(BUN_WEBKIT_PACKAGE_PLATFORM "windows") - elseif(APPLE) - set(BUN_WEBKIT_PACKAGE_PLATFORM "macos") - else() - set(BUN_WEBKIT_PACKAGE_PLATFORM "linux") - endif() - - if(ARCH STREQUAL "x86_64") - set(BUN_WEBKIT_PACKAGE_ARCH "amd64") - elseif(ARCH MATCHES "aarch64|arm64|arm") - set(BUN_WEBKIT_PACKAGE_ARCH "arm64") - endif() - - set(BUN_WEBKIT_PACKAGE_NAME "bun-webkit-${BUN_WEBKIT_PACKAGE_PLATFORM}-${BUN_WEBKIT_PACKAGE_ARCH}${BUN_WEBKIT_PACKAGE_NAME_SUFFIX}") - - message(STATUS "Using Pre-built WebKit: ${BUN_WEBKIT_PACKAGE_NAME}") - execute_process( - COMMAND "${SHELL}" - "${CMAKE_CURRENT_SOURCE_DIR}/scripts/download-webkit.${SCRIPT_EXTENSION}" - "${BUN_WORKDIR}/bun-webkit" - "${WEBKIT_TAG}" - "${BUN_WEBKIT_PACKAGE_NAME}" - WORKING_DIRECTORY ${BUN_WORKDIR} - ) - - if(NOT EXISTS "${BUN_WORKDIR}/bun-webkit") - message(FATAL_ERROR "Prebuilt WebKit package ${BUN_WEBKIT_PACKAGE_NAME} failed to install") - endif() - - set(WEBKIT_INCLUDE_DIR "${BUN_WORKDIR}/bun-webkit/include") - - if(APPLE) - set(ICU_INCLUDE_DIR "") - else() - set(ICU_INCLUDE_DIR "${BUN_WORKDIR}/bun-webkit/include/wtf/unicode") - endif() - - set(WEBKIT_LIB_DIR "${BUN_WORKDIR}/bun-webkit/lib") -elseif(WEBKIT_DIR STREQUAL "omit") - message(STATUS "Not using WebKit. This is only valid if you are only trying to build Zig code") -else() - # Expected to be WebKit/WebKitBuild/${CMAKE_BUILD_TYPE} - if(EXISTS "${WEBKIT_DIR}/cmakeconfig.h") - # You may need to run: - # make jsc-compile-debug jsc-copy-headers - include_directories( - "${WEBKIT_DIR}/" - "${WEBKIT_DIR}/JavaScriptCore/Headers/JavaScriptCore" - "${WEBKIT_DIR}/JavaScriptCore/PrivateHeaders" - "${WEBKIT_DIR}/bmalloc/Headers" - "${WEBKIT_DIR}/WTF/Headers" - ) - set(WEBKIT_LIB_DIR "${WEBKIT_DIR}/lib") - - if(USE_DEBUG_JSC) - add_compile_definitions("BUN_DEBUG=1") - set(ASSERT_ENABLED "1") - endif() - - message(STATUS "Using WebKit from ${WEBKIT_DIR}") - else() - if(NOT EXISTS "${WEBKIT_DIR}/lib/${libWTF}.${STATIC_LIB_EXT}" OR NOT EXISTS "${WEBKIT_DIR}/lib/${libJavaScriptCore}.${STATIC_LIB_EXT}") - if(WEBKIT_DIR MATCHES "src/bun.js/WebKit$") - message(FATAL_ERROR "WebKit directory ${WEBKIT_DIR} does not contain all the required files for Bun. Did you forget to init submodules?") - endif() - - message(FATAL_ERROR "WebKit directory ${WEBKIT_DIR} does not contain all the required files for Bun. Expected a path to the oven-sh/WebKit repository, or a path to a folder containing `include` and `lib`.") - endif() - - set(WEBKIT_INCLUDE_DIR "${WEBKIT_DIR}/include") - set(WEBKIT_LIB_DIR "${WEBKIT_DIR}/lib") - - message(STATUS "Using specified WebKit directory: ${WEBKIT_DIR}") - - set(ASSERT_ENABLED "0") - message(STATUS "WebKit assertions: OFF") - endif() -endif() - -# --- CMake Macros --- - -# Append the given dependencies to the source file -macro(WEBKIT_ADD_SOURCE_DEPENDENCIES _source _deps) - set(_tmp) - get_source_file_property(_tmp ${_source} OBJECT_DEPENDS) - - if(NOT _tmp) - set(_tmp "") - endif() - - foreach(f ${_deps}) - list(APPEND _tmp "${f}") - endforeach() - - set_source_files_properties(${_source} PROPERTIES OBJECT_DEPENDS "${_tmp}") - unset(_tmp) -endmacro() - -# --- BUILD --- -set(BUN_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src") -set(BUN_DEPS_DIR "${BUN_SRC}/deps") -set(BUN_CODEGEN_SRC "${BUN_SRC}/codegen") - -if(NOT BUN_DEPS_OUT_DIR) - set(BUN_DEPS_OUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/build/bun-deps") -endif() - -set(BUN_RAW_SOURCES, "") - -file(GLOB BUN_CPP ${CONFIGURE_DEPENDS} - "${BUN_SRC}/deps/*.cpp" - "${BUN_SRC}/io/*.cpp" - "${BUN_SRC}/bun.js/modules/*.cpp" - "${BUN_SRC}/bun.js/bindings/*.cpp" - "${BUN_SRC}/bun.js/bindings/webcore/*.cpp" - "${BUN_SRC}/bun.js/bindings/sqlite/*.cpp" - "${BUN_SRC}/bun.js/bindings/webcrypto/*.cpp" - "${BUN_SRC}/bun.js/bindings/webcrypto/*/*.cpp" - "${BUN_SRC}/bun.js/bindings/v8/*.cpp" - "${BUN_SRC}/deps/picohttpparser/picohttpparser.c" -) -list(APPEND BUN_RAW_SOURCES ${BUN_CPP}) - -# -- uSockets -- -set(USOCKETS_SRC "${CMAKE_CURRENT_SOURCE_DIR}/packages/bun-usockets/src") -file(GLOB USOCKETS_FILES ${CONFIGURE_DEPENDS} - "${USOCKETS_SRC}/*.c" - "${USOCKETS_SRC}/eventing/*.c" - "${USOCKETS_SRC}/internal/*.c" - "${USOCKETS_SRC}/crypto/*.c" - "${USOCKETS_SRC}/crypto/*.cpp" -) -list(APPEND BUN_RAW_SOURCES ${USOCKETS_FILES}) - -# --- Classes Generator --- -file(GLOB BUN_CLASSES_TS ${CONFIGURE_DEPENDS} - "${BUN_SRC}/bun.js/*.classes.ts" - "${BUN_SRC}/bun.js/api/*.classes.ts" - "${BUN_SRC}/bun.js/test/*.classes.ts" - "${BUN_SRC}/bun.js/webcore/*.classes.ts" - "${BUN_SRC}/bun.js/node/*.classes.ts" -) -add_custom_command( - OUTPUT "${BUN_WORKDIR}/codegen/ZigGeneratedClasses.h" - "${BUN_WORKDIR}/codegen/ZigGeneratedClasses.cpp" - "${BUN_WORKDIR}/codegen/ZigGeneratedClasses+lazyStructureHeader.h" - "${BUN_WORKDIR}/codegen/ZigGeneratedClasses+DOMClientIsoSubspaces.h" - "${BUN_WORKDIR}/codegen/ZigGeneratedClasses+DOMIsoSubspaces.h" - "${BUN_WORKDIR}/codegen/ZigGeneratedClasses+lazyStructureImpl.h" - "${BUN_WORKDIR}/codegen/ZigGeneratedClasses.zig" - COMMAND ${BUN_EXECUTABLE} run "${BUN_CODEGEN_SRC}/generate-classes.ts" ${BUN_CLASSES_TS} "${BUN_WORKDIR}/codegen" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - MAIN_DEPENDENCY "${BUN_CODEGEN_SRC}/generate-classes.ts" - DEPENDS ${BUN_CLASSES_TS} - VERBATIM - COMMENT "Generating *.classes.ts bindings" -) -list(APPEND BUN_RAW_SOURCES "${BUN_WORKDIR}/codegen/ZigGeneratedClasses.cpp") - -if(NOT NO_CODEGEN) - # --- ErrorCode Generator --- - file(GLOB NODE_ERRORS_TS ${CONFIGURE_DEPENDS} - "${BUN_SRC}/bun.js/bindings/ErrorCode.ts" - ) - add_custom_command( - OUTPUT "${BUN_WORKDIR}/codegen/ErrorCode+List.h" "${BUN_WORKDIR}/codegen/ErrorCode+Data.h" "${BUN_WORKDIR}/codegen/ErrorCode.zig" - COMMAND ${BUN_EXECUTABLE} run "${BUN_CODEGEN_SRC}/generate-node-errors.ts" "${BUN_WORKDIR}/codegen" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - MAIN_DEPENDENCY "${BUN_CODEGEN_SRC}/generate-node-errors.ts" - DEPENDS ${NODE_ERRORS_TS} - VERBATIM - COMMENT "Generating ErrorCode.zig" - ) - - # This needs something to force it to be regenerated - WEBKIT_ADD_SOURCE_DEPENDENCIES( - "${BUN_SRC}/bun.js/bindings/ErrorCode.cpp" - "${BUN_WORKDIR}/codegen/ErrorCode+List.h" - ) - WEBKIT_ADD_SOURCE_DEPENDENCIES( - "${BUN_SRC}/bun.js/bindings/ErrorCode.h" - "${BUN_WORKDIR}/codegen/ErrorCode+Data.h" - ) -endif() - -# --- JSSink Generator --- -add_custom_command( - OUTPUT "${BUN_WORKDIR}/codegen/JSSink.cpp" - "${BUN_WORKDIR}/codegen/JSSink.h" - COMMAND ${BUN_EXECUTABLE} run "src/codegen/generate-jssink.ts" "${BUN_WORKDIR}/codegen" - VERBATIM - MAIN_DEPENDENCY "src/codegen/generate-jssink.ts" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Generating JSSink" - USES_TERMINAL -) -list(APPEND BUN_RAW_SOURCES "${BUN_WORKDIR}/codegen/JSSink.cpp") - -# --- .lut.h Generator --- -set(BUN_OBJECT_LUT_SOURCES - bun.js/bindings/BunObject.cpp - bun.js/bindings/ZigGlobalObject.lut.txt - bun.js/bindings/JSBuffer.cpp - bun.js/bindings/BunProcess.cpp - bun.js/bindings/ProcessBindingConstants.cpp - bun.js/bindings/ProcessBindingNatives.cpp -) -set(BUN_OBJECT_LUT_OUTPUTS "") -set(BUN_HASH_LUT_GENERATOR "${BUN_CODEGEN_SRC}/create-hash-table.ts") - -if(NOT BUN_LINK_ONLY) - macro(GENERATE_HASH_LUT _input _output _display_name) - if(NOT NO_CODEGEN) - add_custom_command( - OUTPUT ${_output} - MAIN_DEPENDENCY ${BUN_HASH_LUT_GENERATOR} - DEPENDS ${_input} - COMMAND ${BUN_EXECUTABLE} run ${BUN_HASH_LUT_GENERATOR} ${_input} ${_output} - VERBATIM - COMMENT "Generating ${_display_name}" - ) - endif() - - list(APPEND BUN_OBJECT_LUT_OUTPUTS "${_output}") - - # list(APPEND Bun_HEADERS ${_output}) - WEBKIT_ADD_SOURCE_DEPENDENCIES(${_input} ${_output}) - endmacro() - - foreach(_file ${BUN_OBJECT_LUT_SOURCES}) - if(NOT EXISTS "${BUN_SRC}/${_file}") - message(FATAL_ERROR "Could not find ${_file} needed for LUT generation") - endif() - - get_filename_component(_name ${_file} NAME_WE) - - # workaround for ZigGlobalObject - if(_name MATCHES "ZigGlobalObject") - set(_name "ZigGlobalObject") - endif() - - GENERATE_HASH_LUT(${BUN_SRC}/${_file} ${BUN_WORKDIR}/codegen/${_name}.lut.h ${_name}.lut.h) - endforeach() - - WEBKIT_ADD_SOURCE_DEPENDENCIES(${BUN_SRC}/bun.js/bindings/ZigGlobalObject.cpp ${BUN_WORKDIR}/codegen/ZigGlobalObject.lut.h) -endif() - -# --- Identifier Cache --- -if(NOT NO_CODEGEN) - set(BUN_IDENTIFIER_CACHE_OUT - "${BUN_SRC}/js_lexer/id_continue_bitset.blob" - "${BUN_SRC}/js_lexer/id_continue_bitset.meta.blob" - "${BUN_SRC}/js_lexer/id_start_bitset.blob" - "${BUN_SRC}/js_lexer/id_start_bitset.meta.blob") - add_custom_command( - OUTPUT ${BUN_IDENTIFIER_CACHE_OUT} - MAIN_DEPENDENCY "${BUN_SRC}/js_lexer/identifier_data.zig" - DEPENDS "${BUN_SRC}/js_lexer/identifier_cache.zig" - COMMAND ${ZIG_COMPILER} run "--zig-lib-dir" "${ZIG_LIB_DIR}" "--cache-dir" "${LOCAL_ZIG_CACHE_DIR}" "--global-cache-dir" "${GLOBAL_ZIG_CACHE_DIR}" "${BUN_SRC}/js_lexer/identifier_data.zig" - VERBATIM - COMMENT "Building Identifier Cache" - ) -endif() - -# --- Bundled TS/JS --- -# Note: It's not worth doing this in parallel at the CMake/Ninja level, because this bundling -# requires all the JS files to be known, but also Bun will use all cores during bundling anyways. -if(NOT NO_CODEGEN) - file(GLOB BUN_TS_MODULES ${CONFIGURE_DEPENDS} - "${BUN_SRC}/js/node/*.ts" - "${BUN_SRC}/js/node/*.js" - "${BUN_SRC}/js/bun/*.ts" - "${BUN_SRC}/js/bun/*.js" - "${BUN_SRC}/js/builtins/*.ts" - "${BUN_SRC}/js/builtins/*.js" - "${BUN_SRC}/js/thirdparty/*.js" - "${BUN_SRC}/js/thirdparty/*.ts" - "${BUN_SRC}/js/internal/*.js" - "${BUN_SRC}/js/internal/*.ts" - "${BUN_SRC}/js/internal/cluster/*.ts" - "${BUN_SRC}/js/internal/util/*.js" - "${BUN_SRC}/js/internal/fs/*.ts" - "${BUN_SRC}/js/node/*.js" - "${BUN_SRC}/js/node/*.ts" - "${BUN_SRC}/js/thirdparty/*.js" - "${BUN_SRC}/js/thirdparty/*.ts" - "${BUN_SRC}/js/internal-for-testing.ts" - ) - - file(GLOB CODEGEN_FILES ${CONFIGURE_DEPENDS} "${BUN_CODEGEN_SRC}/*.ts") - - add_custom_command( - OUTPUT - "${BUN_WORKDIR}/codegen/WebCoreJSBuiltins.cpp" - "${BUN_WORKDIR}/codegen/WebCoreJSBuiltins.h" - "${BUN_WORKDIR}/codegen/InternalModuleRegistryConstants.h" - "${BUN_WORKDIR}/codegen/InternalModuleRegistry+createInternalModuleById.h" - "${BUN_WORKDIR}/codegen/InternalModuleRegistry+enum.h" - "${BUN_WORKDIR}/codegen/InternalModuleRegistry+numberOfModules.h" - "${BUN_WORKDIR}/codegen/NativeModuleImpl.h" - "${BUN_WORKDIR}/codegen/ResolvedSourceTag.zig" - "${BUN_WORKDIR}/codegen/SyntheticModuleType.h" - "${BUN_WORKDIR}/codegen/GeneratedJS2Native.h" - "${BUN_SRC}/bun.js/bindings/GeneratedJS2Native.zig" - COMMAND ${BUN_EXECUTABLE} run "${BUN_SRC}/codegen/bundle-modules.ts" "--debug=${DEBUG}" "${BUN_WORKDIR}" - DEPENDS ${BUN_TS_MODULES} ${CODEGEN_FILES} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Bundling JS" - ) -endif() - -WEBKIT_ADD_SOURCE_DEPENDENCIES( - "${BUN_SRC}/bun.js/bindings/InternalModuleRegistry.cpp" - "${BUN_WORKDIR}/codegen/InternalModuleRegistryConstants.h" -) -list(APPEND BUN_RAW_SOURCES "${BUN_WORKDIR}/codegen/WebCoreJSBuiltins.cpp") - -# --- Peechy API --- -# if(NOT NO_CODEGEN) -# add_custom_command( -# OUTPUT "${BUN_SRC}/api/schema.js" -# "${BUN_SRC}/api/schema.d.ts" -# "${BUN_SRC}/api/schema.zig" -# WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" -# COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/node_modules/.bin/peechy" -# "--schema" "${BUN_SRC}/api/schema.peechy" -# "--esm" "${BUN_SRC}/api/schema.js" -# "--ts" "${BUN_SRC}/api/schema.d.ts" -# "--zig" "${BUN_SRC}/api/schema.zig" -# COMMAND "${ZIG_COMPILER}" "fmt" "src/api/schema.zig" -# COMMAND "${PRETTIER}" "--config=.prettierrc.cjs" "--write" "src/api/schema.js" "src/api/schema.d.ts" -# DEPENDS "${BUN_SRC}/api/schema.peechy" -# COMMENT "Building schema" -# ) -# add_custom_command( -# OUTPUT "${BUN_SRC}/analytics/analytics_schema.zig" -# WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" -# COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/node_modules/.bin/peechy" -# "--schema" "${BUN_SRC}/analytics/schema.peechy" -# "--zig" "${BUN_SRC}/analytics/analytics_schema.zig" -# COMMAND "${ZIG_COMPILER}" "fmt" "${BUN_SRC}/analytics/analytics_schema.zig" -# DEPENDS "${BUN_SRC}/api/schema.peechy" -# COMMENT "Building analytics_schema.zig" -# ) -# endif() - -# --- Runtime.js --- -if(NOT NO_CODEGEN) - add_custom_command( - OUTPUT "src/fallback.out.js" - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMAND "${ESBUILD}" "--target=esnext" "--bundle" "src/fallback.ts" "--format=iife" "--platform=browser" "--minify" "--outfile=src/fallback.out.js" - DEPENDS "src/fallback.ts" - ) -endif() - -# --- Zig Object --- -file(GLOB ZIG_FILES - "${BUN_SRC}/*.zig" - "${BUN_SRC}/*/*.zig" - "${BUN_SRC}/*/*/*.zig" - "${BUN_SRC}/*/*/*/*.zig" - "${BUN_SRC}/*/*/*/*/*.zig" +cmake_minimum_required(VERSION 3.24) +message(STATUS "Configuring Bun") + +list(APPEND CMAKE_MODULE_PATH + ${CMAKE_SOURCE_DIR}/cmake + ${CMAKE_SOURCE_DIR}/cmake/targets + ${CMAKE_SOURCE_DIR}/cmake/tools + ${CMAKE_SOURCE_DIR}/cmake/analysis + ${CMAKE_SOURCE_DIR}/cmake/scripts ) -if(NOT BUN_ZIG_OBJ_FORMAT) - # To use LLVM bitcode from Zig, more work needs to be done. Currently, an install of - # LLVM 18.1.7 does not compatible with what bitcode Zig 0.13 outputs (has LLVM 18.1.7) - # Change to "bc" to experiment, "Invalid record" means it is not valid output. - set(BUN_ZIG_OBJ_FORMAT "obj") +include(Policies) +include(Globals) + +if (CMAKE_HOST_WIN32) + # Workaround for TLS certificate verification issue on Windows when downloading from GitHub + # Remove this once we've bumped the CI machines build image + set(CMAKE_TLS_VERIFY 0) endif() -if(NOT BUN_ZIG_OBJ_DIR) - set(BUN_ZIG_OBJ_DIR "${BUN_WORKDIR}/CMakeFiles") +# --- Compilers --- + +if(CMAKE_HOST_APPLE) + include(SetupMacSDK) endif() +include(SetupLLVM) +include(SetupCcache) -get_filename_component(BUN_ZIG_OBJ_DIR "${BUN_ZIG_OBJ_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +# --- Project --- -if(WIN32) - set(BUN_ZIG_OBJ "${BUN_ZIG_OBJ_DIR}/bun-zig.o") -else() - set(BUN_ZIG_OBJ "${BUN_ZIG_OBJ_DIR}/bun-zig.o") -endif() - -set(USES_TERMINAL_NOT_IN_CI "") - -if(NOT CI) - set(USES_TERMINAL_NOT_IN_CI "USES_TERMINAL") -endif() - -if(NOT BUN_LINK_ONLY AND NOT BUN_CPP_ONLY) - add_custom_command( - OUTPUT "${BUN_ZIG_OBJ}" - COMMAND - "${ZIG_COMPILER}" "build" "obj" - "--zig-lib-dir" "${ZIG_LIB_DIR}" - "--prefix" "${BUN_ZIG_OBJ_DIR}" - "--verbose" - "-Dgenerated-code=${BUN_WORKDIR}/codegen" - "-freference-trace=10" - "-Dversion=${Bun_VERSION}" - "-Dcanary=${CANARY}" - "-Doptimize=${ZIG_OPTIMIZE}" - "-Dcpu=${CPU_TARGET}" - "-Dtarget=${ZIG_TARGET}" - "-Denable_logs=${ENABLE_LOGS}" - "-Dreported_nodejs_version=${REPORTED_NODEJS_VERSION}" - "-Dobj_format=${BUN_ZIG_OBJ_FORMAT}" - "--cache-dir" "${LOCAL_ZIG_CACHE_DIR}" - "--global-cache-dir" "${GLOBAL_ZIG_CACHE_DIR}" - DEPENDS - "${CMAKE_CURRENT_SOURCE_DIR}/build.zig" - "${ZIG_FILES}" - "${BUN_WORKDIR}/codegen/ZigGeneratedClasses.zig" - "${BUN_WORKDIR}/codegen/ErrorCode.zig" - "${BUN_WORKDIR}/codegen/ResolvedSourceTag.zig" - "${BUN_IDENTIFIER_CACHE_OUT}" - "${BUN_SRC}/api/schema.zig" - "${BUN_SRC}/bun.js/bindings/GeneratedJS2Native.zig" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Building zig code" - VERBATIM - - # This is here to show Zig's progress indicator - ${USES_TERMINAL_NOT_IN_CI} - ) -endif() - -if(WIN32) - list(APPEND BUN_RAW_SOURCES "${BUN_SRC}/bun.js/bindings/windows/musl-memmem.c") - include_directories("${BUN_SRC}/bun.js/bindings/windows") -endif() - -if(NOT BUN_CPP_ARCHIVE) - # TODO: unified sources - set(BUN_SOURCES ${BUN_RAW_SOURCES}) -else() - # used by ci - set(BUN_SOURCES "") - add_link_options("${BUN_CPP_ARCHIVE}") -endif() - -# -- Windows resources (app icon) -- -if(CANARY GREATER 0) - set(Bun_VERSION_WITH_TAG "${Bun_VERSION}-canary.${CANARY}") -else() - set(Bun_VERSION_WITH_TAG "${Bun_VERSION}") -endif() - -if(WIN32) - set(BUN_ICO_PATH "${BUN_SRC}/bun.ico") - configure_file("${BUN_SRC}/windows-app-info.rc" "${BUN_WORKDIR}/CMakeFiles/windows-app-info.rc") - list(APPEND BUN_SOURCES "${BUN_WORKDIR}/CMakeFiles/windows-app-info.rc") -endif() - -# -- The Buntime™️ --- -if(BUN_TIDY_ONLY OR BUN_TIDY_ONLY_EXTRA) - add_library(${bun} OBJECT "${BUN_SOURCES}") -elseif(NOT BUN_CPP_ONLY) - add_executable(${bun} "${BUN_SOURCES}" "${BUN_ZIG_OBJ}") -else() - add_executable(${bun} "${BUN_SOURCES}") -endif() - -set_target_properties(${bun} PROPERTIES - CXX_STANDARD 20 - CXX_STANDARD_REQUIRED YES - CXX_EXTENSIONS YES - CXX_VISIBILITY_PRESET hidden - C_STANDARD 17 - C_STANDARD_REQUIRED YES - VISIBILITY_INLINES_HIDDEN YES -) - -if(APPLE) - add_compile_definitions("__DARWIN_NON_CANCELABLE=1") -endif() - -add_compile_definitions( - - # TODO: are all of these variables strictly necessary? - "_HAS_EXCEPTIONS=0" - "LIBUS_USE_OPENSSL=1" - "LIBUS_USE_BORINGSSL=1" - "WITH_BORINGSSL=1" - "STATICALLY_LINKED_WITH_JavaScriptCore=1" - "STATICALLY_LINKED_WITH_BMALLOC=1" - "BUILDING_WITH_CMAKE=1" - "JSC_OBJC_API_ENABLED=0" - "BUN_SINGLE_THREADED_PER_VM_ENTRY_SCOPE=1" - "NAPI_EXPERIMENTAL=ON" - "NOMINMAX" - "IS_BUILD" - "BUILDING_JSCONLY__" - "BUN_DYNAMIC_JS_LOAD_PATH=\"${BUN_WORKDIR}/js\"" - "REPORTED_NODEJS_VERSION=\"${REPORTED_NODEJS_VERSION}\"" - "REPORTED_NODEJS_ABI_VERSION=${REPORTED_NODEJS_ABI_VERSION}" -) - -if(NOT ASSERT_ENABLED) - if(APPLE) - add_compile_definitions("_LIBCXX_ENABLE_ASSERTIONS=0") - add_compile_definitions("_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE") - endif() - - add_compile_definitions("NDEBUG=1") -else() - if(APPLE) - add_compile_definitions("_LIBCXX_ENABLE_ASSERTIONS=1") - add_compile_definitions("_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG") - elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - add_compile_definitions("_GLIBCXX_ASSERTIONS=1") - endif() - - add_compile_definitions("ASSERT_ENABLED=1") -endif() - -if(ICU_INCLUDE_DIR) - include_directories(${ICU_INCLUDE_DIR}) -endif() - -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/packages/ - ${CMAKE_CURRENT_SOURCE_DIR}/packages/bun-usockets - ${CMAKE_CURRENT_SOURCE_DIR}/packages/bun-usockets/src - ${CMAKE_CURRENT_SOURCE_DIR}/src/bun.js/bindings - ${CMAKE_CURRENT_SOURCE_DIR}/src/bun.js/bindings/webcore - ${CMAKE_CURRENT_SOURCE_DIR}/src/bun.js/bindings/webcrypto - ${CMAKE_CURRENT_SOURCE_DIR}/src/bun.js/bindings/sqlite - ${CMAKE_CURRENT_SOURCE_DIR}/src/bun.js/modules - ${CMAKE_CURRENT_SOURCE_DIR}/src/js/builtins - ${CMAKE_CURRENT_SOURCE_DIR}/src/napi - ${CMAKE_CURRENT_SOURCE_DIR}/src/deps - ${CMAKE_CURRENT_SOURCE_DIR}/src/deps/picohttpparser - ${WEBKIT_INCLUDE_DIR} - "${BUN_WORKDIR}/codegen" -) - -# -- BUN_CPP_ONLY Target -if(NOT BUN_CPP_ARCHIVE) - if(BUN_CPP_ONLY) - if(NOT WIN32) - string(REPLACE ";" ".o\n " BUN_OBJECT_LIST "${BUN_SOURCES}.o") - string(REPLACE "${BUN_WORKDIR}/" "CMakeFiles/${bun}.dir/" BUN_OBJECT_LIST "${BUN_OBJECT_LIST}") - string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "CMakeFiles/${bun}.dir/" BUN_OBJECT_LIST "${BUN_OBJECT_LIST}") - write_file("${BUN_WORKDIR}/compile-cpp-only.sh" - "#!/usr/bin/env bash\n" - "# this file is generated in CMakeLists.txt\n" - "set -ex\n" - "OBJ_LIST=(\n ${BUN_OBJECT_LIST}\n)\n" - "ninja \${OBJ_LIST[@]} $@\n" - "\"${AR}\" rcvs bun-cpp-objects.a \${OBJ_LIST[@]}\n" - "echo '-> bun-cpp-objects.a'\n" - ) - else() - string(REPLACE ";" ".obj\",\n \"" BUN_OBJECT_LIST "\"${BUN_SOURCES}.obj\"") - string(REPLACE "rc.obj" "rc.res" BUN_OBJECT_LIST "${BUN_OBJECT_LIST}") - string(REPLACE "${BUN_WORKDIR}/" "CMakeFiles/${bun}.dir/" BUN_OBJECT_LIST "${BUN_OBJECT_LIST}") - string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "CMakeFiles/${bun}.dir/" BUN_OBJECT_LIST "${BUN_OBJECT_LIST}") - write_file("${BUN_WORKDIR}/compile-cpp-only.ps1" - "# this file is generated in CMakeLists.txt\n" - "$ErrorActionPreference = \"Stop\"\n" - "$ObjectFiles=@(\n ${BUN_OBJECT_LIST}\n)\n" - "ninja @ObjectFiles @args\n" - "& \"${AR}\" rcvs bun-cpp-objects.a @ObjectFiles\n" - "Write-Host '-> bun-cpp-objects.a'\n" - ) - endif() - endif() -else() - set_target_properties(${bun} PROPERTIES LINKER_LANGUAGE CXX) -endif() - -# --- clang and linker flags --- -if(CMAKE_BUILD_TYPE STREQUAL "Debug") - if(NOT WIN32) - target_compile_options(${bun} PUBLIC -O0 -g -g3 -ggdb -gdwarf-4 - -Werror=return-type - -Werror=return-stack-address - -Werror=implicit-function-declaration - -Werror=uninitialized - -Werror=conditional-uninitialized - -Werror=suspicious-memaccess - -Werror=int-conversion - -Werror=nonnull - -Werror=move - -Werror=sometimes-uninitialized - -Werror=unused - -Wno-unused-function - -Wno-nullability-completeness - -Werror - -fsanitize=null - -fsanitize-recover=all - -fsanitize=bounds - -fsanitize=return - -fsanitize=nullability-arg - -fsanitize=nullability-assign - -fsanitize=nullability-return - -fsanitize=returns-nonnull-attribute - -fsanitize=unreachable - ) - target_link_libraries(${bun} PRIVATE -fsanitize=null) - else() - target_compile_options(${bun} PUBLIC /Od /Z7) - endif() - - add_compile_definitions("BUN_DEBUG=1") -elseif(CMAKE_BUILD_TYPE STREQUAL "Release") - set(LTO_FLAG "") - - if(NOT WIN32) - if(USE_LTO) - list(APPEND LTO_FLAG "-flto=full" "-emit-llvm" "-fwhole-program-vtables" "-fforce-emit-vtables") - endif() - - # Leave -Werror=unused off in release builds so we avoid errors from being used in ASSERT - target_compile_options(${bun} PUBLIC -O3 ${LTO_FLAG} -g1 - -Werror=return-type - -Werror=return-stack-address - -Werror=implicit-function-declaration - -Werror=uninitialized - -Werror=conditional-uninitialized - -Werror=suspicious-memaccess - -Werror=int-conversion - -Werror=nonnull - -Werror=move - -Werror=sometimes-uninitialized - -Wno-nullability-completeness - -Werror - ) - else() - set(LTO_LINK_FLAG "") - - if(USE_LTO) - target_compile_options(${bun} PUBLIC -Xclang -emit-llvm-bc) - - list(APPEND LTO_FLAG "-flto=full") - list(APPEND LTO_LINK_FLAG "-flto=full") - list(APPEND LTO_LINK_FLAG "/LTCG") - list(APPEND LTO_LINK_FLAG "/OPT:REF") - list(APPEND LTO_LINK_FLAG "/OPT:NOICF") - endif() - - target_compile_options(${bun} PUBLIC - /O2 - ${LTO_FLAG} - /Gy - /Gw - /GF - /GA - ) - target_link_options(${bun} PUBLIC - ${LTO_LINK_FLAG} - /DEBUG:FULL - - /delayload:ole32.dll - /delayload:WINMM.dll - /delayload:dbghelp.dll - /delayload:VCRUNTIME140_1.dll - - # libuv loads these two immediately, but for some reason it seems to still be slightly faster to delayload them - /delayload:WS2_32.dll - /delayload:WSOCK32.dll - /delayload:ADVAPI32.dll - /delayload:IPHLPAPI.dll - ) - endif() -endif() - -if(NOT CI AND NOT WIN32) - target_compile_options(${bun} PRIVATE -fdiagnostics-color=always) -endif() - -if(NOT CPU_TARGET STREQUAL "native") - # passing -march=native to clang will break older systems - # by default on x64, CPU_TARGET is set to "haswell" or "nehalem" depending on baseline - # on arm, this argument will not be passed. - target_compile_options(${bun} PUBLIC "-march=${CPU_TARGET}") -else() - if(APPLE AND ARCH STREQUAL "aarch64") - # On arm macOS, we can set it to a minimum of the M1 cpu set. this might be the default already. - target_compile_options(${bun} PUBLIC "-mcpu=apple-m1") - endif() - - if(NOT WIN32 AND NOT APPLE AND ARCH STREQUAL "aarch64") - # on arm64 linux, we set a minimum of armv8 - target_compile_options(${bun} PUBLIC -march=armv8-a+crc -mtune=ampere1) - endif() -endif() - -target_compile_options(${bun} PUBLIC -ferror-limit=${ERROR_LIMIT}) - -if(WIN32) - add_compile_definitions( - "WIN32" - "_WINDOWS" - "WIN32_LEAN_AND_MEAN=1" - "_CRT_SECURE_NO_WARNINGS" - "BORINGSSL_NO_CXX=1" # lol - ) - - # set_property(TARGET ${bun} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - set_property(TARGET ${bun} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") - - target_compile_options(${bun} PUBLIC "/EHsc" "/GR-" -Xclang -fno-c++-static-destructors) - - target_link_options(${bun} PUBLIC "/STACK:0x1200000,0x100000" "/DEF:${BUN_SRC}/symbols.def" "/errorlimit:0") -else() - target_compile_options(${bun} PUBLIC - -mtune=${CPU_TARGET} - -fconstexpr-steps=2542484 - -fconstexpr-depth=54 - -fno-exceptions - -fno-asynchronous-unwind-tables - -fno-unwind-tables - -fno-c++-static-destructors - -fvisibility=hidden - -fvisibility-inlines-hidden - -fno-rtti - -fno-omit-frame-pointer - -mno-omit-leaf-frame-pointer - -fno-pic - -fno-pie - -faddrsig - -ffile-prefix-map="${CMAKE_CURRENT_SOURCE_DIR}"=. - -ffile-prefix-map="${BUN_DEPS_DIR}"=src/deps - -ffile-prefix-map="${BUN_DEPS_OUT_DIR}"=src/deps - ) -endif() - -if(APPLE) - target_link_options(${bun} PUBLIC "-dead_strip") - target_link_options(${bun} PUBLIC "-dead_strip_dylibs") - target_link_options(${bun} PUBLIC "-Wl,-stack_size,0x1200000") - target_link_options(${bun} PUBLIC "-exported_symbols_list" "${BUN_SRC}/symbols.txt") - set_target_properties(${bun} PROPERTIES LINK_DEPENDS "${BUN_SRC}/symbols.txt") - target_link_options(${bun} PUBLIC "-fno-keep-static-consts") - target_link_libraries(${bun} PRIVATE "resolv") -endif() - -if(UNIX AND NOT APPLE) - target_link_options(${bun} PUBLIC - -fuse-ld=lld-${LLVM_VERSION} - -fno-pic - -static-libstdc++ - -static-libgcc - "-Wl,-no-pie" - "-Wl,-icf=safe" - "-Wl,--as-needed" - "-Wl,--gc-sections" - "-Wl,-z,stack-size=12800000" - "-Wl,--wrap=fcntl" - "-Wl,--wrap=fcntl64" - "-Wl,--wrap=stat64" - "-Wl,--wrap=pow" - "-Wl,--wrap=exp" - "-Wl,--wrap=expf" - "-Wl,--wrap=log" - "-Wl,--wrap=log2" - "-Wl,--wrap=lstat" - "-Wl,--wrap=stat64" - "-Wl,--wrap=stat" - "-Wl,--wrap=fstat" - "-Wl,--wrap=fstatat" - "-Wl,--wrap=lstat64" - "-Wl,--wrap=fstat64" - "-Wl,--wrap=fstatat64" - "-Wl,--wrap=mknod" - "-Wl,--wrap=mknodat" - "-Wl,--wrap=statx" - "-Wl,--wrap=fmod" - "-Wl,--compress-debug-sections=zlib" - "-Bsymbolics-functions" - "-rdynamic" - "-Wl,--dynamic-list=${BUN_SRC}/symbols.dyn" - "-Wl,--version-script=${BUN_SRC}/linker.lds" - -Wl,-z,lazy - -Wl,-z,norelro - ) - - target_link_libraries(${bun} PRIVATE "c") - target_link_libraries(${bun} PRIVATE "pthread") - target_link_libraries(${bun} PRIVATE "dl") - - if(NOT USE_STATIC_LIBATOMIC) - target_link_libraries(${bun} PUBLIC "libatomic.so") - else() - target_link_libraries(${bun} PRIVATE "libatomic.a") - endif() - - if(USE_SYSTEM_ICU) - target_link_libraries(${bun} PRIVATE "libicudata.a") - target_link_libraries(${bun} PRIVATE "libicui18n.a") - target_link_libraries(${bun} PRIVATE "libicuuc.a") - else() - target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libicudata.a") - target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libicui18n.a") - target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libicuuc.a") - endif() - - set_target_properties(${bun} PROPERTIES LINK_DEPENDS "${BUN_SRC}/linker.lds") - set_target_properties(${bun} PROPERTIES LINK_DEPENDS "${BUN_SRC}/symbols.dyn") -endif() - -# --- ICU --- -if(APPLE) - target_link_libraries(${bun} PRIVATE "icucore") -endif() - -# --- Stripped Binary "bun" -if(CMAKE_BUILD_TYPE STREQUAL "Release" AND NOT WIN32 AND NOT ASSERT_ENABLED) - # if(CI AND APPLE) - if(APPLE) - add_custom_command( - TARGET ${bun} - POST_BUILD - COMMAND ${DSYMUTIL} -o ${BUN_WORKDIR}/${bun}.dSYM ${BUN_WORKDIR}/${bun} - COMMENT "Generating .dSYM" - ) - endif() - - add_custom_command( - TARGET ${bun} - POST_BUILD - COMMAND ${STRIP} -s -x -S -o ${BUN_WORKDIR}/bun ${BUN_WORKDIR}/${bun} - COMMENT "Stripping Symbols" - ) -endif() - -if(WIN32) - # Kill all instances of bun before linking. - # This is necessary because the file is locked by the process. - add_custom_command( - TARGET ${bun} - PRE_LINK - COMMAND - "powershell" - "/C" - "Stop-Process -Name '${bun}' -Force -ErrorAction SilentlyContinue; exit 0" - ) -endif() - -# --- Dependencies --- -if(USE_CUSTOM_ZLIB) - include_directories(${BUN_DEPS_DIR}/zlib) - - if(WIN32) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/zlib.lib") - else() - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libz.a") - endif() -else() - if(WIN32) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_DIR}/zlib_maybethisworks.lib") - else() - find_package(ZLIB REQUIRED) - target_link_libraries(${bun} PRIVATE ZLIB::ZLIB) - endif() -endif() - -if(USE_CUSTOM_BORINGSSL) - include_directories(${BUN_DEPS_DIR}/boringssl/include) - - if(WIN32) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/crypto.lib") - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/ssl.lib") - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/decrepit.lib") - else() - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libcrypto.a") - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libssl.a") - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libdecrepit.a") - endif() -else() - include(FindBoringSSL) - FindBoringSSL(${bun}) -endif() - -if(USE_CUSTOM_LIBARCHIVE) - include_directories(${BUN_DEPS_DIR}/libarchive/include) - - if(WIN32) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/archive.lib") - else() - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libarchive.a") - endif() -else() - find_package(LibArchive REQUIRED) - target_link_libraries(${bun} PRIVATE LibArchive::LibArchive) -endif() - -if(USE_CUSTOM_LIBDEFLATE) - include_directories(${BUN_DEPS_DIR}/libdeflate) - - if(WIN32) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/deflate.lib") - else() - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libdeflate.a") - endif() -else() - find_package(LibDeflate REQUIRED) - target_link_libraries(${bun} PRIVATE LibDeflate::LibDeflate) -endif() - -if(USE_CUSTOM_MIMALLOC) - include_directories(${BUN_DEPS_DIR}/mimalloc/include) - - if(WIN32) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/mimalloc.lib") - elseif(APPLE) - if(USE_DEBUG_JSC OR CMAKE_BUILD_TYPE STREQUAL "Debug") - message(STATUS "Using debug mimalloc") - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libmimalloc-debug.o") - else() - # Note: https://github.com/microsoft/mimalloc/issues/512 - # It may have been a bug in our code at the time. - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libmimalloc.o") - endif() - else() - if(USE_DEBUG_JSC OR CMAKE_BUILD_TYPE STREQUAL "Debug") - message(STATUS "Using debug mimalloc") - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libmimalloc-debug.a") - else() - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libmimalloc.o") - endif() - endif() -else() - find_package(mimalloc REQUIRED) - target_link_libraries(${bun} PRIVATE mimalloc) -endif() - -if(USE_CUSTOM_ZSTD) - include_directories(${BUN_DEPS_DIR}/zstd/include) - - if(WIN32) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/zstd.lib") - else() - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libzstd.a") - endif() -else() - find_package(zstd CONFIG REQUIRED) - target_link_libraries(${bun} PRIVATE zstd::libzstd) -endif() - -if(USE_CUSTOM_CARES) - include_directories(${BUN_DEPS_DIR}/c-ares/include) - - if(WIN32) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/cares.lib") - else() - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libcares.a") - endif() -else() - find_package(c-ares CONFIG REQUIRED) - target_link_libraries(${bun} PRIVATE c-ares::cares) -endif() - -if(USE_CUSTOM_TINYCC) - if(WIN32) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/tcc.lib") - else() - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libtcc.a") - endif() -else() - find_package(tinycc REQUIRED) - target_link_libraries(${bun} PRIVATE tinycc::tinycc) -endif() - -if(USE_CUSTOM_LOLHTML) - if(WIN32) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/lolhtml.lib") - else() - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/liblolhtml.a") - endif() -else() - find_package(lolhtml REQUIRED) - target_link_libraries(${bun} PRIVATE lolhtml::lolhtml) -endif() - -if(WIN32) - if(USE_CUSTOM_LIBUV) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/libuv.lib") - include_directories(${bun} PRIVATE "${BUN_DEPS_DIR}/libuv/include") - else() - find_package(libuv CONFIG REQUIRED) - target_link_libraries(${bun} PRIVATE $,libuv::uv_a,libuv::uv>) - endif() -endif() - -if(USE_STATIC_SQLITE) - add_library(sqlite3 STATIC src/bun.js/bindings/sqlite/sqlite3.c) - target_include_directories(sqlite3 PUBLIC src/bun.js/bindings/sqlite) - target_compile_definitions(sqlite3 PRIVATE - "SQLITE_ENABLE_COLUMN_METADATA=" - "SQLITE_MAX_VARIABLE_NUMBER=250000" - "SQLITE_ENABLE_RTREE=1" - "SQLITE_ENABLE_FTS3=1" - "SQLITE_ENABLE_FTS3_PARENTHESIS=1" - "SQLITE_ENABLE_FTS5=1" - "SQLITE_ENABLE_JSON1=1" - "SQLITE_ENABLE_MATH_FUNCTIONS=1" - ) - - if(WIN32) - target_compile_options(sqlite3 PRIVATE /MT /U_DLL) - endif() - - target_link_libraries(${bun} PRIVATE sqlite3) - message(STATUS "Using static sqlite3") - target_compile_definitions(${bun} PRIVATE "LAZY_LOAD_SQLITE=0") -else() - message(STATUS "Using dynamicly linked sqlite3") - target_compile_definitions(${bun} PRIVATE "LAZY_LOAD_SQLITE=1") -endif() - -# -- Brotli -- -set(BROTLI_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/deps/brotli") -file(GLOB BROTLI_FILES ${CONFIGURE_DEPENDS} - "${BROTLI_SRC}/common/*.c" - "${BROTLI_SRC}/enc/*.c" - "${BROTLI_SRC}/dec/*.c" -) -add_library(brotli STATIC ${BROTLI_FILES}) -target_include_directories(brotli PRIVATE "${BROTLI_SRC}/include") -target_compile_definitions(brotli PRIVATE "BROTLI_STATIC") - -if(WIN32) - target_compile_options(brotli PRIVATE /MT /U_DLL) -endif() - -target_link_libraries(${bun} PRIVATE brotli) -include_directories("${BUN_DEPS_DIR}/brotli/include") - -if(USE_CUSTOM_LSHPACK) - include_directories(${BUN_DEPS_DIR}/ls-hpack) - - if(WIN32) - include_directories(${BUN_DEPS_DIR}/ls-hpack/compat/queue) - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/lshpack.lib") - else() - target_link_libraries(${bun} PRIVATE "${BUN_DEPS_OUT_DIR}/liblshpack.a") - endif() -else() - find_package(lshpack REQUIRED) - target_link_libraries(${bun} PRIVATE lshpack) -endif() - -if(NOT WIN32) - target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libWTF.a") - target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libJavaScriptCore.a") - - if(NOT APPLE OR EXISTS "${WEBKIT_LIB_DIR}/libbmalloc.a") - target_link_libraries(${bun} PRIVATE "${WEBKIT_LIB_DIR}/libbmalloc.a") - endif() -else() - target_link_libraries(${bun} PRIVATE - "${WEBKIT_LIB_DIR}/WTF.lib" - "${WEBKIT_LIB_DIR}/JavaScriptCore.lib" - "${WEBKIT_LIB_DIR}/sicudt.lib" - "${WEBKIT_LIB_DIR}/sicuin.lib" - "${WEBKIT_LIB_DIR}/sicuuc.lib" - winmm - bcrypt - ntdll - userenv - dbghelp - wsock32 # ws2_32 required by TransmitFile aka sendfile on windows - delayimp.lib - ) -endif() - -if(BUN_LINK_ONLY) - message(STATUS "NOTE: BUN_LINK_ONLY is ON, this build config will only link the Bun executable") -endif() - -if(BUN_CPP_ONLY) - message(STATUS "NOTE: BUN_CPP_ONLY is ON, this build will only work with 'compile-cpp-only.${SCRIPT_EXTENSION}'") -endif() - -if(NO_CODEGEN) - message(STATUS "NOTE: NO_CODEGEN is ON, this build expects ./codegen to exist") -endif() - -if(BUN_TIDY_ONLY) - find_program(CLANG_TIDY_EXE NAMES "clang-tidy") - - # webkit ones are disabled disabled because it's noisy, e.g. for JavaScriptCore/Lookup.h - set(CLANG_TIDY_COMMAND "${CLANG_TIDY_EXE}" "-checks=-*,clang-analyzer-*,-clang-analyzer-webkit.UncountedLambdaCapturesChecker,-clang-analyzer-optin.core.EnumCastOutOfRange,-clang-analyzer-webkit.RefCntblBaseVirtualDtor" "--fix" "--fix-errors" "--format-style=webkit" "--warnings-as-errors=*") - set_target_properties(${bun} PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND}") -endif() - -if(BUN_TIDY_ONLY_EXTRA) - find_program(CLANG_TIDY_EXE NAMES "clang-tidy") - set(CLANG_TIDY_COMMAND "${CLANG_TIDY_EXE}" "-checks=-*,clang-analyzer-*,performance-*,-clang-analyzer-webkit.UncountedLambdaCapturesChecker,-clang-analyzer-optin.core.EnumCastOutOfRange,-clang-analyzer-webkit.RefCntblBaseVirtualDtor" "--fix" "--fix-errors" "--format-style=webkit" "--warnings-as-errors=*") - set_target_properties(${bun} PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND}") +parse_package_json(VERSION_VARIABLE DEFAULT_VERSION) +optionx(VERSION STRING "The version of Bun" DEFAULT ${DEFAULT_VERSION}) +project(Bun VERSION ${VERSION}) +include(Options) +include(CompilerFlags) + +# --- Tools --- + +include(SetupGit) +include(SetupBuildkite) +include(SetupBun) +include(SetupEsbuild) +include(SetupZig) +include(SetupRust) + +# --- Targets --- + +include(BuildBun) + +# --- Analysis --- + +if(ENABLE_ANALYSIS) + include(RunClangFormat) + include(RunClangTidy) + include(RunZigFormat) + include(RunPrettier) endif() diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 86d148847d..9e0a74c415 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,17 +1,12 @@ Configuring a development environment for Bun can take 10-30 minutes depending on your internet connection and computer speed. You will need ~10GB of free disk space for the repository and build artifacts. -If you are using Windows, please refer to [this guide](/docs/project/building-windows) - -{% details summary="For Ubuntu users" %} -TL;DR: Ubuntu 22.04 is suggested. -Bun currently requires `glibc >=2.32` in development which means if you're on Ubuntu 20.04 (glibc == 2.31), you may likely meet `error: undefined symbol: __libc_single_threaded `. You need to take extra configurations. Also, according to this [issue](https://github.com/llvm/llvm-project/issues/97314), LLVM 16 is no longer maintained on Ubuntu 24.04 (noble). And instead, you might want `brew` to install LLVM 16 for your Ubuntu 24.04. -{% /details %} +If you are using Windows, please refer to [this guide](https://bun.sh/docs/project/building-windows) ## Install Dependencies Using your system's package manager, install Bun's dependencies: -{% codetabs %} +{% codetabs group="os" %} ```bash#macOS (Homebrew) $ brew install automake ccache cmake coreutils gnu-sed go icu4c libiconv libtool ninja pkg-config rust ruby @@ -30,7 +25,7 @@ $ sudo dnf install cargo ccache cmake git golang libtool ninja-build pkg-config ``` ```bash#openSUSE Tumbleweed -$ sudo zypper install go cmake ninja automake git rustup && rustup toolchain install stable +$ sudo zypper install go cmake ninja automake git icu rustup && rustup toolchain install stable ``` {% /codetabs %} @@ -58,56 +53,54 @@ $ brew install bun ## Install LLVM -Bun requires LLVM 16 (`clang` is part of LLVM). This version requirement is to match WebKit (precompiled), as mismatching versions will cause memory allocation failures at runtime. In most cases, you can install LLVM through your system package manager: +Bun requires LLVM 18 (`clang` is part of LLVM). This version requirement is to match WebKit (precompiled), as mismatching versions will cause memory allocation failures at runtime. In most cases, you can install LLVM through your system package manager: -{% codetabs %} +{% codetabs group="os" %} ```bash#macOS (Homebrew) -$ brew install llvm@16 +$ brew install llvm@18 ``` ```bash#Ubuntu/Debian $ # LLVM has an automatic installation script that is compatible with all versions of Ubuntu -$ wget https://apt.llvm.org/llvm.sh -O - | sudo bash -s -- 16 all +$ wget https://apt.llvm.org/llvm.sh -O - | sudo bash -s -- 18 all ``` ```bash#Arch -$ sudo pacman -S llvm clang lld +$ sudo pacman -S llvm clang18 lld ``` ```bash#Fedora -$ sudo dnf install 'dnf-command(copr)' -$ sudo dnf copr enable -y @fedora-llvm-team/llvm-snapshots -$ sudo dnf install llvm clang lld +$ sudo dnf install llvm18 clang18 lld18-devel ``` ```bash#openSUSE Tumbleweed -$ sudo zypper install clang16 lld16 llvm16 +$ sudo zypper install clang18 lld18 llvm18 ``` {% /codetabs %} -If none of the above solutions apply, you will have to install it [manually](https://github.com/llvm/llvm-project/releases/tag/llvmorg-16.0.6). +If none of the above solutions apply, you will have to install it [manually](https://github.com/llvm/llvm-project/releases/tag/llvmorg-18.1.8). -Make sure Clang/LLVM 16 is in your path: +Make sure Clang/LLVM 18 is in your path: ```bash -$ which clang-16 +$ which clang-18 ``` If not, run this to manually add it: -{% codetabs %} +{% codetabs group="os" %} ```bash#macOS (Homebrew) # use fish_add_path if you're using fish -# use path+="$(brew --prefix llvm@16)/bin" if you are using zsh -$ export PATH="$(brew --prefix llvm@16)/bin:$PATH" +# use path+="$(brew --prefix llvm@18)/bin" if you are using zsh +$ export PATH="$(brew --prefix llvm@18)/bin:$PATH" ``` ```bash#Arch # use fish_add_path if you're using fish -$ export PATH="$PATH:/usr/lib/llvm16/bin" +$ export PATH="$PATH:/usr/lib/llvm18/bin" ``` {% /codetabs %} @@ -116,42 +109,26 @@ $ export PATH="$PATH:/usr/lib/llvm16/bin" ## Building Bun -After cloning the repository, run the following command to run the first build. This may take a while as it will clone submodules and build dependencies. - -```bash -$ bun setup -``` - -The binary will be located at `./build/bun-debug`. It is recommended to add this to your `$PATH`. To verify the build worked, let's print the version number on the development build of Bun. - -```bash -$ build/bun-debug --version -x.y.z_debug -``` - -To rebuild, you can invoke `bun run build` +After cloning the repository, run the following command to build. This may take a while as it will clone submodules and build dependencies. ```bash $ bun run build ``` -These two scripts, `setup` and `build`, are aliases to do roughly the following: +The binary will be located at `./build/debug/bun-debug`. It is recommended to add this to your `$PATH`. To verify the build worked, let's print the version number on the development build of Bun. ```bash -$ ./scripts/setup.sh -$ cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug -$ ninja -C build # 'bun run build' runs just this +$ build/debug/bun-debug --version +x.y.z_debug ``` -Advanced users can pass CMake flags to customize the build. - ## VSCode VSCode is the recommended IDE for working on Bun, as it has been configured. Once opening, you can run `Extensions: Show Recommended Extensions` to install the recommended extensions for Zig and C++. ZLS is automatically configured. -If you use a different editor, make sure that you tell ZLS to use the automatically installed Zig compiler, which is located at `./.cache/zig/zig.exe`. The filename is `zig.exe` so that it works as expected on Windows, but it still works on macOS/Linux (it just has a surprising file extension). +If you use a different editor, make sure that you tell ZLS to use the automatically installed Zig compiler, which is located at `./vendor/zig/zig.exe`. The filename is `zig.exe` so that it works as expected on Windows, but it still works on macOS/Linux (it just has a surprising file extension). -We recommend adding `./build` to your `$PATH` so that you can run `bun-debug` in your terminal: +We recommend adding `./build/debug` to your `$PATH` so that you can run `bun-debug` in your terminal: ```sh $ bun-debug @@ -163,8 +140,8 @@ Several code generation scripts are used during Bun's build process. These are r In particular, these are: -- `./src/codegen/generate-jssink.ts` -- Generates `build/codegen/JSSink.cpp`, `build/codegen/JSSink.h` which implement various classes for interfacing with `ReadableStream`. This is internally how `FileSink`, `ArrayBufferSink`, `"type": "direct"` streams and other code related to streams works. -- `./src/codegen/generate-classes.ts` -- Generates `build/codegen/ZigGeneratedClasses*`, which generates Zig & C++ bindings for JavaScriptCore classes implemented in Zig. In `**/*.classes.ts` files, we define the interfaces for various classes, methods, prototypes, getters/setters etc which the code generator reads to generate boilerplate code implementing the JavaScript objects in C++ and wiring them up to Zig +- `./src/codegen/generate-jssink.ts` -- Generates `build/debug/codegen/JSSink.cpp`, `build/debug/codegen/JSSink.h` which implement various classes for interfacing with `ReadableStream`. This is internally how `FileSink`, `ArrayBufferSink`, `"type": "direct"` streams and other code related to streams works. +- `./src/codegen/generate-classes.ts` -- Generates `build/debug/codegen/ZigGeneratedClasses*`, which generates Zig & C++ bindings for JavaScriptCore classes implemented in Zig. In `**/*.classes.ts` files, we define the interfaces for various classes, methods, prototypes, getters/setters etc which the code generator reads to generate boilerplate code implementing the JavaScript objects in C++ and wiring them up to Zig - `./src/codegen/bundle-modules.ts` -- Bundles built-in modules like `node:fs`, `bun:ffi` into files we can include in the final binary. In development, these can be reloaded without rebuilding Zig (you still need to run `bun run build`, but it re-reads the transpiled files from disk afterwards). In release builds, these are embedded into the binary. - `./src/codegen/bundle-functions.ts` -- Bundles globally-accessible functions implemented in JavaScript/TypeScript like `ReadableStream`, `WritableStream`, and a handful more. These are used similarly to the builtin modules, but the output more closely aligns with what WebKit/Safari does for Safari's built-in functions so that we can copy-paste the implementations from WebKit as a starting point. @@ -180,17 +157,17 @@ To compile a release build of Bun, run: $ bun run build:release ``` -The binary will be located at `./build-release/bun` and `./build-release/bun-profile`. +The binary will be located at `./build/release/bun` and `./build/release/bun-profile`. ### Download release build from pull requests -To save you time spent building a release build locally, we provide a way to run release builds from pull requests. This is useful for manully testing changes in a release build before they are merged. +To save you time spent building a release build locally, we provide a way to run release builds from pull requests. This is useful for manually testing changes in a release build before they are merged. To run a release build from a pull request, you can use the `bun-pr` npm package: ```sh -bunx bun-pr pr-number -bunx bun-pr branch/branch-name +bunx bun-pr +bunx bun-pr bunx bun-pr "https://github.com/oven-sh/bun/pull/1234566" ``` @@ -222,24 +199,18 @@ $ valgrind --fair-sched=try --track-origins=yes bun-debug ## Building WebKit locally + Debug mode of JSC -{% callout %} - -**TODO**: This is out of date. TLDR is pass `-DUSE_DEBUG_JSC=1` or `-DWEBKIT_DIR=...` to CMake. it will probably need more fiddling. ask @paperdave if you need this. - -{% /callout %} - WebKit is not cloned by default (to save time and disk space). To clone and build WebKit locally, run: ```bash -# once you run this, `make submodule` can be used to automatically -# update WebKit and the other submodules -$ git submodule update --init --depth 1 --checkout src/bun.js/WebKit -# to make a jsc release build -$ make jsc -# JSC debug build does not work perfectly with Bun yet, this is actively being -# worked on and will eventually become the default. -$ make jsc-build-linux-compile-debug cpp -$ make jsc-build-mac-compile-debug cpp +# Clone WebKit into ./vendor/WebKit +$ git clone https://github.com/oven-sh/WebKit vendor/WebKit + +# Make a debug build of JSC. This will output build artifacts in ./vendor/WebKit/WebKitBuild/Debug +# Optionally, you can use `make jsc` for a release build +$ make jsc-debug + +# Build bun with the local JSC build +$ bun run build:local ``` Note that the WebKit folder, including build artifacts, is 8GB+ in size. @@ -267,7 +238,7 @@ The issue may manifest when initially running `bun setup` as Clang being unable ``` The C++ compiler - "/usr/bin/clang++-16" + "/usr/bin/clang++-18" is not able to compile a simple test program. ``` @@ -307,17 +278,17 @@ If you see this error when compiling, run: $ xcode-select --install ``` -## Cannot find `libatomic.a` +### Cannot find `libatomic.a` Bun defaults to linking `libatomic` statically, as not all systems have it. If you are building on a distro that does not have a static libatomic available, you can run the following command to enable dynamic linking: ```bash -$ bun setup -DUSE_STATIC_LIBATOMIC=OFF +$ bun run build -DUSE_STATIC_LIBATOMIC=OFF ``` The built version of Bun may not work on other systems if compiled this way. -## ccache conflicts with building TinyCC on macOS +### ccache conflicts with building TinyCC on macOS If you run into issues with `ccache` when building TinyCC, try reinstalling ccache @@ -325,3 +296,9 @@ If you run into issues with `ccache` when building TinyCC, try reinstalling ccac brew uninstall ccache brew install ccache ``` + +## Using bun-debug + +- Disable logging: `BUN_DEBUG_QUIET_LOGS=1 bun-debug ...` (to disable all debug logging) +- Enable logging for a specific zig scope: `BUN_DEBUG_EventLoop=1 bun-debug ...` (to allow `std.log.scoped(.EventLoop)`) +- Bun transpiles every file it runs, to see the actual executed source in a debug build find it in `/tmp/bun-debug-src/...path/to/file`, for example the transpiled version of `/home/bun/index.ts` would be in `/tmp/bun-debug-src/home/bun/index.ts` diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index aaece20d36..0000000000 --- a/Dockerfile +++ /dev/null @@ -1,645 +0,0 @@ -# This Dockerfile is used by CI workflows to build Bun. It is not intended as a development -# environment, or to be used as a base image for other projects. -# -# You likely want this image instead: https://hub.docker.com/r/oven/bun -# -# TODO: move this file to reduce confusion -ARG DEBIAN_FRONTEND=noninteractive -ARG GITHUB_WORKSPACE=/build -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 -ARG ARCH=x86_64 -ARG BUILD_MACHINE_ARCH=x86_64 -ARG BUILDARCH=amd64 -ARG TRIPLET=${ARCH}-linux-gnu -ARG GIT_SHA="" -ARG BUN_VERSION="bun-v1.1.4" -ARG BUN_DOWNLOAD_URL_BASE="https://pub-5e11e972747a44bf9aaf9394f185a982.r2.dev/releases/${BUN_VERSION}" -ARG CANARY=0 -ARG ASSERTIONS=OFF -ARG ZIG_OPTIMIZE=ReleaseFast -ARG CMAKE_BUILD_TYPE=Release - -ARG NODE_VERSION="20" -ARG LLVM_VERSION="16" - -ARG ZIG_VERSION="0.13.0" -ARG ZIG_VERSION_SHORT="0.13.0" - -ARG SCCACHE_BUCKET -ARG SCCACHE_REGION -ARG SCCACHE_S3_USE_SSL -ARG SCCACHE_ENDPOINT -ARG AWS_ACCESS_KEY_ID -ARG AWS_SECRET_ACCESS_KEY - -FROM bitnami/minideb:bullseye as bun-base - -ARG BUN_DOWNLOAD_URL_BASE -ARG DEBIAN_FRONTEND -ARG BUN_VERSION -ARG NODE_VERSION -ARG LLVM_VERSION -ARG BUILD_MACHINE_ARCH -ARG BUN_DIR -ARG BUN_DEPS_OUT_DIR -ARG CPU_TARGET - -ENV CI 1 -ENV CPU_TARGET=${CPU_TARGET} -ENV BUILDARCH=${BUILDARCH} -ENV BUN_DEPS_OUT_DIR=${BUN_DEPS_OUT_DIR} -ENV USE_LTO 1 - -ENV LC_CTYPE=en_US.UTF-8 -ENV LC_ALL=en_US.UTF-8 - -ENV SCCACHE_BUCKET=${SCCACHE_BUCKET} -ENV SCCACHE_REGION=${SCCACHE_REGION} -ENV SCCACHE_S3_USE_SSL=${SCCACHE_S3_USE_SSL} -ENV SCCACHE_ENDPOINT=${SCCACHE_ENDPOINT} -ENV AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} -ENV AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} - -RUN install_packages \ - ca-certificates \ - curl \ - gnupg \ - && echo "deb https://apt.llvm.org/bullseye/ llvm-toolchain-bullseye-${LLVM_VERSION} main" > /etc/apt/sources.list.d/llvm.list \ - && echo "deb-src https://apt.llvm.org/bullseye/ llvm-toolchain-bullseye-${LLVM_VERSION} main" >> /etc/apt/sources.list.d/llvm.list \ - && curl -fsSL "https://apt.llvm.org/llvm-snapshot.gpg.key" | apt-key add - \ - && echo "deb https://deb.nodesource.com/node_${NODE_VERSION}.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \ - && curl -fsSL "https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key" | apt-key add - \ - && echo "deb https://apt.kitware.com/ubuntu/ focal main" > /etc/apt/sources.list.d/kitware.list \ - && curl -fsSL "https://apt.kitware.com/keys/kitware-archive-latest.asc" | apt-key add - \ - && install_packages \ - wget \ - bash \ - software-properties-common \ - build-essential \ - autoconf \ - automake \ - libtool \ - pkg-config \ - clang-${LLVM_VERSION} \ - lld-${LLVM_VERSION} \ - lldb-${LLVM_VERSION} \ - clangd-${LLVM_VERSION} \ - libc++-${LLVM_VERSION}-dev \ - libc++abi-${LLVM_VERSION}-dev \ - llvm-${LLVM_VERSION}-runtime \ - llvm-${LLVM_VERSION}-dev \ - make \ - cmake \ - ninja-build \ - file \ - libc-dev \ - libxml2 \ - libxml2-dev \ - xz-utils \ - git \ - tar \ - rsync \ - gzip \ - unzip \ - perl \ - python3 \ - ruby \ - ruby-dev \ - golang \ - nodejs && \ - for f in /usr/lib/llvm-${LLVM_VERSION}/bin/*; do ln -sf "$f" /usr/bin; done \ - && ln -sf /usr/bin/clang-${LLVM_VERSION} /usr/bin/clang \ - && ln -sf /usr/bin/clang++-${LLVM_VERSION} /usr/bin/clang++ \ - && ln -sf /usr/bin/lld-${LLVM_VERSION} /usr/bin/lld \ - && ln -sf /usr/bin/lldb-${LLVM_VERSION} /usr/bin/lldb \ - && ln -sf /usr/bin/clangd-${LLVM_VERSION} /usr/bin/clangd \ - && ln -sf /usr/bin/llvm-ar-${LLVM_VERSION} /usr/bin/llvm-ar \ - && ln -sf /usr/bin/ld.lld /usr/bin/ld \ - && ln -sf /usr/bin/llvm-ranlib-${LLVM_VERSION} /usr/bin/ranlib \ - && ln -sf /usr/bin/clang /usr/bin/cc \ - && ln -sf /usr/bin/clang /usr/bin/c89 \ - && ln -sf /usr/bin/clang /usr/bin/c99 \ - && ln -sf /usr/bin/clang++ /usr/bin/c++ \ - && ln -sf /usr/bin/clang++ /usr/bin/g++ \ - && ln -sf /usr/bin/llvm-ar /usr/bin/ar \ - && ln -sf /usr/bin/clang /usr/bin/gcc \ - && arch="$(dpkg --print-architecture)" \ - && case "${arch##*-}" in \ - amd64) variant="x64";; \ - arm64) variant="aarch64";; \ - *) echo "unsupported architecture: $arch"; exit 1 ;; \ - esac \ - && wget "${BUN_DOWNLOAD_URL_BASE}/bun-linux-${variant}.zip" \ - && unzip bun-linux-${variant}.zip \ - && mv bun-linux-${variant}/bun /usr/bin/bun \ - && ln -s /usr/bin/bun /usr/bin/bunx \ - && rm -rf bun-linux-${variant} bun-linux-${variant}.zip \ - && mkdir -p ${BUN_DIR} ${BUN_DEPS_OUT_DIR} - -# && if [ -n "${SCCACHE_BUCKET}" ]; then \ -# echo "Setting up sccache" \ -# && wget https://github.com/mozilla/sccache/releases/download/v0.5.4/sccache-v0.5.4-${BUILD_MACHINE_ARCH}-unknown-linux-musl.tar.gz \ -# && tar xf sccache-v0.5.4-${BUILD_MACHINE_ARCH}-unknown-linux-musl.tar.gz \ -# && mv sccache-v0.5.4-${BUILD_MACHINE_ARCH}-unknown-linux-musl/sccache /usr/bin/sccache \ -# && rm -rf sccache-v0.5.4-${BUILD_MACHINE_ARCH}-unknown-linux-musl.tar.gz sccache-v0.5.4-${BUILD_MACHINE_ARCH}-unknown-linux-musl \ - -FROM bun-base as bun-base-with-zig - -ARG ZIG_VERSION -ARG ZIG_VERSION_SHORT -ARG BUILD_MACHINE_ARCH -ARG ZIG_FOLDERNAME=zig-linux-${BUILD_MACHINE_ARCH}-${ZIG_VERSION} -ARG ZIG_FILENAME=${ZIG_FOLDERNAME}.tar.xz -ARG ZIG_URL="https://ziglang.org/builds/${ZIG_FILENAME}" -ARG ZIG_LOCAL_CACHE_DIR=/zig-cache -ENV ZIG_LOCAL_CACHE_DIR=${ZIG_LOCAL_CACHE_DIR} - -WORKDIR $GITHUB_WORKSPACE - -ADD $ZIG_URL . -RUN tar xf ${ZIG_FILENAME} \ - && mv ${ZIG_FOLDERNAME}/lib /usr/lib/zig \ - && mv ${ZIG_FOLDERNAME}/zig /usr/bin/zig \ - && rm -rf ${ZIG_FILENAME} ${ZIG_FOLDERNAME} - -FROM bun-base as c-ares - -ARG BUN_DIR -ARG CPU_TARGET -ENV CPU_TARGET=${CPU_TARGET} -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -COPY Makefile ${BUN_DIR}/Makefile -COPY src/deps/c-ares ${BUN_DIR}/src/deps/c-ares -COPY scripts ${BUN_DIR}/scripts - -WORKDIR $BUN_DIR - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - cd $BUN_DIR \ - && bash ./scripts/build-cares.sh \ - && rm -rf ${BUN_DIR}/src/deps/c-ares ${BUN_DIR}/Makefile ${BUN_DIR}/scripts - -FROM bun-base as lolhtml - -RUN curl https://sh.rustup.rs -sSf | sh -s -- -y - -ARG BUN_DIR -ARG CPU_TARGET -ENV CPU_TARGET=${CPU_TARGET} - -COPY Makefile ${BUN_DIR}/Makefile -COPY src/deps/lol-html ${BUN_DIR}/src/deps/lol-html - -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - export PATH=$PATH:$HOME/.cargo/bin \ - && cd ${BUN_DIR} \ - && make lolhtml \ - && rm -rf src/deps/lol-html Makefile - -FROM bun-base as mimalloc - -ARG BUN_DIR -ARG CPU_TARGET -ARG ASSERTIONS -ENV CPU_TARGET=${CPU_TARGET} - -COPY Makefile ${BUN_DIR}/Makefile -COPY src/deps/mimalloc ${BUN_DIR}/src/deps/mimalloc -COPY scripts ${BUN_DIR}/scripts - -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - cd ${BUN_DIR} \ - && bash ./scripts/build-mimalloc.sh \ - && rm -rf src/deps/mimalloc Makefile - -FROM bun-base as mimalloc-debug - -ARG BUN_DIR -ARG CPU_TARGET -ARG ASSERTIONS -ENV CPU_TARGET=${CPU_TARGET} - -COPY Makefile ${BUN_DIR}/Makefile -COPY src/deps/mimalloc ${BUN_DIR}/src/deps/mimalloc - -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - cd ${BUN_DIR} \ - && make mimalloc-debug \ - && rm -rf src/deps/mimalloc Makefile - -FROM bun-base as zlib - -ARG BUN_DIR -ARG CPU_TARGET -ENV CPU_TARGET=${CPU_TARGET} -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -COPY Makefile ${BUN_DIR}/Makefile -COPY CMakeLists.txt ${BUN_DIR}/CMakeLists.txt -COPY scripts ${BUN_DIR}/scripts -COPY src/deps/zlib ${BUN_DIR}/src/deps/zlib -COPY package.json bun.lockb Makefile .gitmodules ${BUN_DIR}/ - -WORKDIR $BUN_DIR - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - cd $BUN_DIR \ - && bash ./scripts/build-zlib.sh && rm -rf src/deps/zlib scripts - - -FROM bun-base as libdeflate - -ARG BUN_DIR -ARG CPU_TARGET -ENV CPU_TARGET=${CPU_TARGET} -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -COPY Makefile ${BUN_DIR}/Makefile -COPY CMakeLists.txt ${BUN_DIR}/CMakeLists.txt -COPY scripts ${BUN_DIR}/scripts -COPY src/deps/libdeflate ${BUN_DIR}/src/deps/libdeflate -COPY package.json bun.lockb Makefile .gitmodules ${BUN_DIR}/ - -WORKDIR $BUN_DIR - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - cd $BUN_DIR \ - && bash ./scripts/build-libdeflate.sh && rm -rf src/deps/libdeflate scripts - - -FROM bun-base as libarchive - -ARG BUN_DIR -ARG CPU_TARGET -ENV CPU_TARGET=${CPU_TARGET} -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -RUN install_packages autoconf automake libtool pkg-config - -COPY scripts ${BUN_DIR}/scripts -COPY src/deps/libarchive ${BUN_DIR}/src/deps/libarchive - -WORKDIR $BUN_DIR - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - cd $BUN_DIR \ - && bash ./scripts/build-libarchive.sh && rm -rf src/deps/libarchive .scripts - -FROM bun-base as tinycc - -ARG BUN_DEPS_OUT_DIR -ARG BUN_DIR -ARG CPU_TARGET -ENV CPU_TARGET=${CPU_TARGET} - -RUN install_packages libtcc-dev && cp /usr/lib/$(uname -m)-linux-gnu/libtcc.a ${BUN_DEPS_OUT_DIR} - -FROM bun-base as boringssl - -RUN install_packages golang - -ARG BUN_DIR -ARG CPU_TARGET -ENV CPU_TARGET=${CPU_TARGET} - -COPY Makefile ${BUN_DIR}/Makefile -COPY scripts ${BUN_DIR}/scripts -COPY src/deps/boringssl ${BUN_DIR}/src/deps/boringssl - -WORKDIR $BUN_DIR - -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - cd ${BUN_DIR} \ - && bash ./scripts/build-boringssl.sh \ - && rm -rf src/deps/boringssl Makefile - - -FROM bun-base as zstd - -ARG BUN_DIR - -ARG CPU_TARGET -ENV CPU_TARGET=${CPU_TARGET} - -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -COPY Makefile ${BUN_DIR}/Makefile -COPY src/deps/zstd ${BUN_DIR}/src/deps/zstd -COPY scripts ${BUN_DIR}/scripts - -WORKDIR $BUN_DIR - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - cd $BUN_DIR \ - && bash ./scripts/build-zstd.sh \ - && rm -rf src/deps/zstd scripts - -FROM bun-base as ls-hpack - -ARG BUN_DIR - -ARG CPU_TARGET -ENV CPU_TARGET=${CPU_TARGET} - -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -COPY Makefile ${BUN_DIR}/Makefile -COPY src/deps/ls-hpack ${BUN_DIR}/src/deps/ls-hpack -COPY scripts ${BUN_DIR}/scripts - -WORKDIR $BUN_DIR - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - cd $BUN_DIR \ - && bash ./scripts/build-lshpack.sh \ - && rm -rf src/deps/ls-hpack scripts - -FROM bun-base-with-zig as bun-identifier-cache - -ARG DEBIAN_FRONTEND -ARG GITHUB_WORKSPACE -ARG CPU_TARGET -ARG BUN_DIR -ENV CPU_TARGET=${CPU_TARGET} - -WORKDIR $BUN_DIR - -COPY src/js_lexer/identifier_data.zig ${BUN_DIR}/src/js_lexer/identifier_data.zig -COPY src/js_lexer/identifier_cache.zig ${BUN_DIR}/src/js_lexer/identifier_cache.zig - -RUN --mount=type=cache,target=${ZIG_LOCAL_CACHE_DIR} \ - cd $BUN_DIR \ - && zig run src/js_lexer/identifier_data.zig - -FROM bun-base as bun-node-fallbacks - -ARG BUN_DIR - -WORKDIR $BUN_DIR - -COPY src/node-fallbacks ${BUN_DIR}/src/node-fallbacks - -RUN cd $BUN_DIR/src/node-fallbacks \ - && bun install --frozen-lockfile \ - && bun run build \ - && rm -rf src/node-fallbacks/node_modules - -FROM bun-base as bun-webkit - -ARG BUILDARCH -ARG ASSERTIONS - -COPY CMakeLists.txt ${BUN_DIR}/CMakeLists.txt - -RUN mkdir ${BUN_DIR}/bun-webkit \ - && WEBKIT_TAG=$(grep 'set(WEBKIT_TAG' "${BUN_DIR}/CMakeLists.txt" | awk '{print $2}' | cut -f 1 -d ')') \ - && WEBKIT_SUFFIX=$(if [ "${ASSERTIONS}" = "ON" ]; then echo "debug"; else echo "lto"; fi) \ - && WEBKIT_URL="https://github.com/oven-sh/WebKit/releases/download/autobuild-${WEBKIT_TAG}/bun-webkit-linux-${BUILDARCH}-${WEBKIT_SUFFIX}.tar.gz" \ - && echo "Downloading ${WEBKIT_URL}" \ - && curl -fsSL "${WEBKIT_URL}" | tar -xz -C ${BUN_DIR}/bun-webkit --strip-components=1 - -FROM bun-base as bun-cpp-objects - -ARG CANARY -ARG ASSERTIONS - -COPY --from=bun-webkit ${BUN_DIR}/bun-webkit ${BUN_DIR}/bun-webkit - -COPY packages ${BUN_DIR}/packages -COPY src ${BUN_DIR}/src -COPY CMakeLists.txt ${BUN_DIR}/CMakeLists.txt -COPY src/deps/boringssl/include ${BUN_DIR}/src/deps/boringssl/include - -# for uWebSockets -COPY src/deps/libdeflate ${BUN_DIR}/src/deps/libdeflate - -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -RUN --mount=type=cache,target=${CCACHE_DIR} mkdir ${BUN_DIR}/build \ - && cd ${BUN_DIR}/build \ - && mkdir -p tmp_modules tmp_functions js codegen \ - && cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release -DUSE_LTO=ON -DUSE_DEBUG_JSC=${ASSERTIONS} -DBUN_CPP_ONLY=1 -DWEBKIT_DIR=/build/bun/bun-webkit -DCANARY=${CANARY} -DZIG_COMPILER=system \ - && bash compile-cpp-only.sh -v - -FROM bun-base-with-zig as bun-codegen-for-zig - -COPY package.json bun.lockb Makefile .gitmodules ${BUN_DIR}/ -COPY src/runtime ${BUN_DIR}/src/runtime -COPY src/runtime.js src/runtime.bun.js ${BUN_DIR}/src/ -COPY packages/bun-error ${BUN_DIR}/packages/bun-error -COPY packages/bun-types ${BUN_DIR}/packages/bun-types -COPY src/fallback.ts ${BUN_DIR}/src/fallback.ts -COPY src/api ${BUN_DIR}/src/api - -WORKDIR $BUN_DIR - -# TODO: move away from Makefile entirely -RUN --mount=type=cache,target=${ZIG_LOCAL_CACHE_DIR} \ - bun install --frozen-lockfile \ - && make runtime_js fallback_decoder bun_error \ - && rm -rf src/runtime src/fallback.ts node_modules bun.lockb package.json Makefile - -FROM bun-base-with-zig as bun-compile-zig-obj - -ARG ZIG_PATH -ARG TRIPLET -ARG GIT_SHA -ARG CPU_TARGET -ARG CANARY=0 -ARG ASSERTIONS=OFF -ARG ZIG_OPTIMIZE=ReleaseFast - -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} - -COPY *.zig package.json CMakeLists.txt ${BUN_DIR}/ -COPY completions ${BUN_DIR}/completions -COPY packages ${BUN_DIR}/packages -COPY src ${BUN_DIR}/src - -COPY --from=bun-identifier-cache ${BUN_DIR}/src/js_lexer/*.blob ${BUN_DIR}/src/js_lexer/ -COPY --from=bun-node-fallbacks ${BUN_DIR}/src/node-fallbacks/out ${BUN_DIR}/src/node-fallbacks/out -COPY --from=bun-codegen-for-zig ${BUN_DIR}/src/*.out.js ${BUN_DIR}/src/*.out.refresh.js ${BUN_DIR}/src/ -COPY --from=bun-codegen-for-zig ${BUN_DIR}/packages/bun-error/dist ${BUN_DIR}/packages/bun-error/dist - -WORKDIR $BUN_DIR - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - --mount=type=cache,target=${ZIG_LOCAL_CACHE_DIR} \ - mkdir -p build \ - && bun run $BUN_DIR/src/codegen/bundle-modules.ts --debug=OFF $BUN_DIR/build \ - && cd build \ - && cmake .. \ - -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DUSE_LTO=ON \ - -DZIG_OPTIMIZE="${ZIG_OPTIMIZE}" \ - -DCPU_TARGET="${CPU_TARGET}" \ - -DZIG_TARGET="${TRIPLET}" \ - -DWEBKIT_DIR="omit" \ - -DNO_CONFIGURE_DEPENDS=1 \ - -DNO_CODEGEN=1 \ - -DBUN_ZIG_OBJ_DIR="/tmp" \ - -DCANARY="${CANARY}" \ - -DZIG_COMPILER=system \ - -DZIG_LIB_DIR=$BUN_DIR/src/deps/zig/lib \ - && ONLY_ZIG=1 ninja "/tmp/bun-zig.o" -v - -FROM scratch as build_release_obj - -ARG CPU_TARGET -ENV CPU_TARGET=${CPU_TARGET} - -COPY --from=bun-compile-zig-obj /tmp/bun-zig.o / - -FROM bun-base as bun-link - -ARG CPU_TARGET -ARG CANARY -ARG ASSERTIONS - -ENV CPU_TARGET=${CPU_TARGET} -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} -ARG ZIG_LOCAL_CACHE_DIR=/zig-cache -ENV ZIG_LOCAL_CACHE_DIR=${ZIG_LOCAL_CACHE_DIR} - -WORKDIR $BUN_DIR - -RUN mkdir -p build bun-webkit - -# lol -COPY src/bun.js/bindings/sqlite/sqlite3.c ${BUN_DIR}/src/bun.js/bindings/sqlite/sqlite3.c -COPY src/deps/brotli ${BUN_DIR}/src/deps/brotli - -COPY src/symbols.dyn src/linker.lds ${BUN_DIR}/src/ - -COPY CMakeLists.txt ${BUN_DIR}/CMakeLists.txt -COPY --from=zlib ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=libdeflate ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=libarchive ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=boringssl ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=lolhtml ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=mimalloc ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=zstd ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=tinycc ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=c-ares ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=ls-hpack ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=bun-compile-zig-obj /tmp/bun-zig.o ${BUN_DIR}/build/bun-zig.o -COPY --from=bun-cpp-objects ${BUN_DIR}/build/*.a ${BUN_DIR}/build/ -COPY --from=bun-cpp-objects ${BUN_DIR}/build/*.o ${BUN_DIR}/build/ -COPY --from=bun-cpp-objects ${BUN_DIR}/bun-webkit/lib ${BUN_DIR}/bun-webkit/lib - -WORKDIR $BUN_DIR/build - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - --mount=type=cache,target=${ZIG_LOCAL_CACHE_DIR} \ - cmake .. \ - -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DBUN_LINK_ONLY=1 \ - -DBUN_ZIG_OBJ_DIR="${BUN_DIR}/build" \ - -DUSE_LTO=ON \ - -DUSE_DEBUG_JSC=${ASSERTIONS} \ - -DBUN_CPP_ARCHIVE="${BUN_DIR}/build/bun-cpp-objects.a" \ - -DWEBKIT_DIR="${BUN_DIR}/bun-webkit" \ - -DBUN_DEPS_OUT_DIR="${BUN_DEPS_OUT_DIR}" \ - -DCPU_TARGET="${CPU_TARGET}" \ - -DNO_CONFIGURE_DEPENDS=1 \ - -DCANARY="${CANARY}" \ - -DZIG_COMPILER=system \ - && ninja -v \ - && ./bun --revision \ - && mkdir -p /build/out \ - && mv bun bun-profile /build/out \ - && rm -rf ${BUN_DIR} ${BUN_DEPS_OUT_DIR} - -FROM scratch as artifact - -COPY --from=bun-link /build/out / - -FROM bun-base as bun-link-assertions - -ARG CPU_TARGET -ARG CANARY -ARG ASSERTIONS - -ENV CPU_TARGET=${CPU_TARGET} -ARG CCACHE_DIR=/ccache -ENV CCACHE_DIR=${CCACHE_DIR} -ARG ZIG_LOCAL_CACHE_DIR=/zig-cache -ENV ZIG_LOCAL_CACHE_DIR=${ZIG_LOCAL_CACHE_DIR} - -WORKDIR $BUN_DIR - -RUN mkdir -p build bun-webkit - -# lol -COPY src/bun.js/bindings/sqlite/sqlite3.c ${BUN_DIR}/src/bun.js/bindings/sqlite/sqlite3.c - -COPY src/symbols.dyn src/linker.lds ${BUN_DIR}/src/ - -COPY CMakeLists.txt ${BUN_DIR}/CMakeLists.txt -COPY --from=zlib ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=libarchive ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=boringssl ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=lolhtml ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=mimalloc-debug ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=zstd ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=tinycc ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=c-ares ${BUN_DEPS_OUT_DIR}/* ${BUN_DEPS_OUT_DIR}/ -COPY --from=bun-compile-zig-obj /tmp/bun-zig.o ${BUN_DIR}/build/bun-zig.o -COPY --from=bun-cpp-objects ${BUN_DIR}/build/bun-cpp-objects.a ${BUN_DIR}/build/bun-cpp-objects.a -COPY --from=bun-cpp-objects ${BUN_DIR}/bun-webkit/lib ${BUN_DIR}/bun-webkit/lib - -WORKDIR $BUN_DIR/build - -RUN --mount=type=cache,target=${CCACHE_DIR} \ - --mount=type=cache,target=${ZIG_LOCAL_CACHE_DIR} \ - cmake .. \ - -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DBUN_LINK_ONLY=1 \ - -DBUN_ZIG_OBJ_DIR="${BUN_DIR}/build" \ - -DUSE_DEBUG_JSC=ON \ - -DBUN_CPP_ARCHIVE="${BUN_DIR}/build/bun-cpp-objects.a" \ - -DWEBKIT_DIR="${BUN_DIR}/bun-webkit" \ - -DBUN_DEPS_OUT_DIR="${BUN_DEPS_OUT_DIR}" \ - -DCPU_TARGET="${CPU_TARGET}" \ - -DNO_CONFIGURE_DEPENDS=1 \ - -DCANARY="${CANARY}" \ - -DZIG_COMPILER=system \ - -DUSE_LTO=ON \ - && ninja -v \ - && ./bun --revision \ - && mkdir -p /build/out \ - && mv bun bun-profile /build/out \ - && rm -rf ${BUN_DIR} ${BUN_DEPS_OUT_DIR} - -FROM scratch as artifact-assertions - -COPY --from=bun-link-assertions /build/out / \ No newline at end of file diff --git a/LATEST b/LATEST index b961fb9179..b966e81a45 100644 --- a/LATEST +++ b/LATEST @@ -1 +1 @@ -1.1.26 \ No newline at end of file +1.2.4 \ No newline at end of file diff --git a/Makefile b/Makefile index fb5b180219..66e0c2edc1 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,10 @@ +# ------------------------------------------------------------ +# WARNING +# ------------------------------------------------------------ +# This file is very old and will be removed soon! +# You can build Bun using `cmake` or `bun run build` +# ------------------------------------------------------------ + SHELL := $(shell which bash) # Use bash syntax to be consistent OS_NAME := $(shell uname -s | tr '[:upper:]' '[:lower:]') @@ -70,7 +77,7 @@ BUN_RELEASE_BIN = $(PACKAGE_DIR)/bun PRETTIER ?= $(shell which prettier 2>/dev/null || echo "./node_modules/.bin/prettier") ESBUILD = "$(shell which esbuild 2>/dev/null || echo "./node_modules/.bin/esbuild")" DSYMUTIL ?= $(shell which dsymutil 2>/dev/null || which dsymutil-15 2>/dev/null) -WEBKIT_DIR ?= $(realpath src/bun.js/WebKit) +WEBKIT_DIR ?= $(realpath vendor/WebKit) WEBKIT_RELEASE_DIR ?= $(WEBKIT_DIR)/WebKitBuild/Release WEBKIT_DEBUG_DIR ?= $(WEBKIT_DIR)/WebKitBuild/Debug WEBKIT_RELEASE_DIR_LTO ?= $(WEBKIT_DIR)/WebKitBuild/ReleaseLTO @@ -84,9 +91,9 @@ ZIG ?= $(shell which zig 2>/dev/null || echo -e "error: Missing zig. Please make # This is easier to happen than you'd expect. # Using realpath here causes issues because clang uses clang++ as a symlink # so if that's resolved, it won't build for C++ -REAL_CC = $(shell which clang-16 2>/dev/null || which clang 2>/dev/null) -REAL_CXX = $(shell which clang++-16 2>/dev/null || which clang++ 2>/dev/null) -CLANG_FORMAT = $(shell which clang-format-16 2>/dev/null || which clang-format 2>/dev/null) +REAL_CC = $(shell which clang-18 2>/dev/null || which clang 2>/dev/null) +REAL_CXX = $(shell which clang++-18 2>/dev/null || which clang++ 2>/dev/null) +CLANG_FORMAT = $(shell which clang-format-18 2>/dev/null || which clang-format 2>/dev/null) CC = $(REAL_CC) CXX = $(REAL_CXX) @@ -110,14 +117,14 @@ CC_WITH_CCACHE = $(CCACHE_PATH) $(CC) ifeq ($(OS_NAME),darwin) # Find LLVM ifeq ($(wildcard $(LLVM_PREFIX)),) - LLVM_PREFIX = $(shell brew --prefix llvm@16) + LLVM_PREFIX = $(shell brew --prefix llvm@18) endif ifeq ($(wildcard $(LLVM_PREFIX)),) LLVM_PREFIX = $(shell brew --prefix llvm) endif ifeq ($(wildcard $(LLVM_PREFIX)),) # This is kinda ugly, but I can't find a better way to error :( - LLVM_PREFIX = $(shell echo -e "error: Unable to find llvm. Please run 'brew install llvm@16' or set LLVM_PREFIX=/path/to/llvm") + LLVM_PREFIX = $(shell echo -e "error: Unable to find llvm. Please run 'brew install llvm@18' or set LLVM_PREFIX=/path/to/llvm") endif LDFLAGS += -L$(LLVM_PREFIX)/lib @@ -131,8 +138,8 @@ endif SED = $(shell which gsed 2>/dev/null || which sed 2>/dev/null) BUN_DIR ?= $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) -BUN_DEPS_DIR ?= $(shell pwd)/src/deps -BUN_DEPS_OUT_DIR ?= $(shell pwd)/build/bun-deps +BUN_DEPS_DIR ?= $(shell pwd)/vendor +BUN_DEPS_OUT_DIR ?= $(shell pwd)/build/release CPU_COUNT = 2 ifeq ($(OS_NAME),darwin) CPU_COUNT = $(shell sysctl -n hw.logicalcpu) @@ -157,7 +164,7 @@ CMAKE_FLAGS_WITHOUT_RELEASE = -DCMAKE_C_COMPILER=$(CC) \ -DCMAKE_OSX_DEPLOYMENT_TARGET=$(MIN_MACOS_VERSION) \ $(CMAKE_CXX_COMPILER_LAUNCHER_FLAG) \ -DCMAKE_AR=$(AR) \ - -DCMAKE_RANLIB=$(which llvm-16-ranlib 2>/dev/null || which llvm-ranlib 2>/dev/null) \ + -DCMAKE_RANLIB=$(which llvm-18-ranlib 2>/dev/null || which llvm-ranlib 2>/dev/null) \ -DCMAKE_CXX_STANDARD=20 \ -DCMAKE_C_STANDARD=17 \ -DCMAKE_CXX_STANDARD_REQUIRED=ON \ @@ -184,7 +191,7 @@ endif ifeq ($(OS_NAME),linux) LIBICONV_PATH = -AR = $(shell which llvm-ar-16 2>/dev/null || which llvm-ar 2>/dev/null || which ar 2>/dev/null) +AR = $(shell which llvm-ar-18 2>/dev/null || which llvm-ar 2>/dev/null || which ar 2>/dev/null) endif OPTIMIZATION_LEVEL=-O3 $(MARCH_NATIVE) @@ -279,7 +286,7 @@ STRIP=/usr/bin/strip endif ifeq ($(OS_NAME),linux) -STRIP=$(shell which llvm-strip 2>/dev/null || which llvm-strip-16 2>/dev/null || which strip 2>/dev/null || echo "Missing strip") +STRIP=$(shell which llvm-strip 2>/dev/null || which llvm-strip-18 2>/dev/null || which strip 2>/dev/null || echo "Missing strip") endif @@ -366,7 +373,7 @@ ifeq ($(OS_NAME),linux) endif ifeq ($(OS_NAME),darwin) -MACOS_MIN_FLAG=-mmacosx-version-min=$(MIN_MACOS_VERSION) +MACOS_MIN_FLAG=-mmacos-version-min=$(MIN_MACOS_VERSION) POSIX_PKG_MANAGER=brew INCLUDE_DIRS += $(MAC_INCLUDE_DIRS) endif @@ -667,7 +674,7 @@ endif .PHONY: assert-deps assert-deps: @echo "Checking if the required utilities are available..." - @if [ $(CLANG_VERSION) -lt "15" ]; then echo -e "ERROR: clang version >=15 required, found: $(CLANG_VERSION). Install with:\n\n $(POSIX_PKG_MANAGER) install llvm@16"; exit 1; fi + @if [ $(CLANG_VERSION) -lt "18" ]; then echo -e "ERROR: clang version >=18 required, found: $(CLANG_VERSION). Install with:\n\n $(POSIX_PKG_MANAGER) install llvm@18"; exit 1; fi @cmake --version >/dev/null 2>&1 || (echo -e "ERROR: cmake is required."; exit 1) @$(PYTHON) --version >/dev/null 2>&1 || (echo -e "ERROR: python is required."; exit 1) @$(ESBUILD) --version >/dev/null 2>&1 || (echo -e "ERROR: esbuild is required."; exit 1) @@ -682,19 +689,10 @@ assert-deps: @test $(shell cargo --version | awk '{print $$2}' | cut -d. -f2) -gt 57 || (echo -e "ERROR: cargo version must be at least 1.57."; exit 1) @echo "You have the dependencies installed! Woo" -# the following allows you to run `make submodule` to update or init submodules. but we will exclude webkit -# unless you explicitly clone it yourself (a huge download) -SUBMODULE_NAMES=$(shell cat .gitmodules | grep 'path = ' | awk '{print $$3}') -ifeq ("$(wildcard src/bun.js/WebKit/.git)", "") - SUBMODULE_NAMES := $(filter-out src/bun.js/WebKit, $(SUBMODULE_NAMES)) -endif .PHONY: init-submodules init-submodules: submodule # (backwards-compatibility alias) -.PHONY: submodule -submodule: ## to init or update all submodules - git submodule update --init --recursive --progress --depth=1 --checkout $(SUBMODULE_NAMES) .PHONY: build-obj build-obj: @@ -797,7 +795,7 @@ cls: @echo -e "\n\n---\n\n" jsc-check: - @ls $(JSC_BASE_DIR) >/dev/null 2>&1 || (echo -e "Failed to access WebKit build. Please compile the WebKit submodule using the Dockerfile at $(shell pwd)/src/javascript/WebKit/Dockerfile and then copy from /output in the Docker container to $(JSC_BASE_DIR). You can override the directory via JSC_BASE_DIR. \n\n DOCKER_BUILDKIT=1 docker build -t bun-webkit $(shell pwd)/src/bun.js/WebKit -f $(shell pwd)/src/bun.js/WebKit/Dockerfile --progress=plain\n\n docker container create bun-webkit\n\n # Get the container ID\n docker container ls\n\n docker cp DOCKER_CONTAINER_ID_YOU_JUST_FOUND:/output $(JSC_BASE_DIR)" && exit 1) + @ls $(JSC_BASE_DIR) >/dev/null 2>&1 || (echo -e "Failed to access WebKit build. Please compile the WebKit submodule using the Dockerfile at $(shell pwd)/src/javascript/WebKit/Dockerfile and then copy from /output in the Docker container to $(JSC_BASE_DIR). You can override the directory via JSC_BASE_DIR. \n\n DOCKER_BUILDKIT=1 docker build -t bun-webkit $(shell pwd)/vendor/WebKit -f $(shell pwd)/vendor/WebKit/Dockerfile --progress=plain\n\n docker container create bun-webkit\n\n # Get the container ID\n docker container ls\n\n docker cp DOCKER_CONTAINER_ID_YOU_JUST_FOUND:/output $(JSC_BASE_DIR)" && exit 1) @ls $(JSC_INCLUDE_DIR) >/dev/null 2>&1 || (echo "Failed to access WebKit include directory at $(JSC_INCLUDE_DIR)." && exit 1) @ls $(JSC_LIB) >/dev/null 2>&1 || (echo "Failed to access WebKit lib directory at $(JSC_LIB)." && exit 1) @@ -928,7 +926,7 @@ bun-codesign-release-local-debug: .PHONY: jsc jsc: jsc-build jsc-copy-headers jsc-bindings .PHONY: jsc-debug -jsc-debug: jsc-build-debug jsc-copy-headers-debug +jsc-debug: jsc-build-debug .PHONY: jsc-build jsc-build: $(JSC_BUILD_STEPS) .PHONY: jsc-build-debug @@ -938,7 +936,7 @@ jsc-bindings: headers bindings .PHONY: clone-submodules clone-submodules: - git -c submodule."src/bun.js/WebKit".update=none submodule update --init --recursive --depth=1 --progress + git -c submodule."vendor/WebKit".update=none submodule update --init --recursive --depth=1 --progress .PHONY: headers @@ -1156,7 +1154,7 @@ jsc-copy-headers: cp $(WEBKIT_DIR)/Source/JavaScriptCore/bytecode/StubInfoSummary.h $(WEBKIT_RELEASE_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/StubInfoSummary.h cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/CommonSlowPaths.h $(WEBKIT_RELEASE_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/CommonSlowPaths.h cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/DirectArguments.h $(WEBKIT_RELEASE_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/DirectArguments.h - cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/GenericArguments.h $(WEBKIT_RELEASE_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/GenericArguments.h + cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/GenericArgumentsImpl.h $(WEBKIT_RELEASE_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/GenericArgumentsImpl.h cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/SamplingProfiler.h $(WEBKIT_RELEASE_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/SamplingProfiler.h cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/ScopedArguments.h $(WEBKIT_RELEASE_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/ScopedArguments.h cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/JSLexicalEnvironment.h $(WEBKIT_RELEASE_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/JSLexicalEnvironment.h @@ -1207,7 +1205,7 @@ jsc-copy-headers-debug: cp $(WEBKIT_DIR)/Source/JavaScriptCore/bytecode/StubInfoSummary.h $(WEBKIT_DEBUG_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/StubInfoSummary.h cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/CommonSlowPaths.h $(WEBKIT_DEBUG_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/CommonSlowPaths.h cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/DirectArguments.h $(WEBKIT_DEBUG_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/DirectArguments.h - cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/GenericArguments.h $(WEBKIT_DEBUG_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/GenericArguments.h + cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/GenericArgumentsImpl.h $(WEBKIT_DEBUG_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/GenericArgumentsImpl.h cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/SamplingProfiler.h $(WEBKIT_DEBUG_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/SamplingProfiler.h cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/ScopedArguments.h $(WEBKIT_DEBUG_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/ScopedArguments.h cp $(WEBKIT_DIR)/Source/JavaScriptCore/runtime/JSLexicalEnvironment.h $(WEBKIT_DEBUG_DIR)/JavaScriptCore/PrivateHeaders/JavaScriptCore/JSLexicalEnvironment.h @@ -1258,11 +1256,12 @@ jsc-build-mac-compile: -DENABLE_STATIC_JSC=ON \ -DENABLE_SINGLE_THREADED_VM_ENTRY_SCOPE=ON \ -DALLOW_LINE_AND_COLUMN_NUMBER_IN_BUILTINS=ON \ - -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DUSE_THIN_ARCHIVES=OFF \ -DBUN_FAST_TLS=ON \ -DENABLE_FTL_JIT=ON \ -DUSE_BUN_JSC_ADDITIONS=ON \ + -DUSE_BUN_EVENT_LOOP=ON \ -G Ninja \ $(CMAKE_FLAGS_WITHOUT_RELEASE) \ -DPTHREAD_JIT_PERMISSIONS_API=1 \ @@ -1270,7 +1269,7 @@ jsc-build-mac-compile: $(WEBKIT_DIR) \ $(WEBKIT_RELEASE_DIR) && \ CFLAGS="$(CFLAGS) -ffat-lto-objects" CXXFLAGS="$(CXXFLAGS) -ffat-lto-objects" \ - cmake --build $(WEBKIT_RELEASE_DIR) --config Release --target jsc + cmake --build $(WEBKIT_RELEASE_DIR) --config RelWithDebInfo --target jsc .PHONY: jsc-build-mac-compile-lto jsc-build-mac-compile-lto: @@ -1286,6 +1285,7 @@ jsc-build-mac-compile-lto: -DUSE_THIN_ARCHIVES=OFF \ -DBUN_FAST_TLS=ON \ -DUSE_BUN_JSC_ADDITIONS=ON \ + -DUSE_BUN_EVENT_LOOP=ON \ -DCMAKE_C_FLAGS="-flto=full" \ -DCMAKE_CXX_FLAGS="-flto=full" \ -DENABLE_FTL_JIT=ON \ @@ -1301,6 +1301,7 @@ jsc-build-mac-compile-lto: .PHONY: jsc-build-mac-compile-debug jsc-build-mac-compile-debug: mkdir -p $(WEBKIT_DEBUG_DIR) $(WEBKIT_DIR); + # to disable asan, remove -DENABLE_SANITIZERS=address and add -DENABLE_MALLOC_HEAP_BREAKDOWN=ON cd $(WEBKIT_DEBUG_DIR) && \ ICU_INCLUDE_DIRS="$(HOMEBREW_PREFIX)opt/icu4c/include" \ cmake \ @@ -1309,9 +1310,9 @@ jsc-build-mac-compile-debug: -DCMAKE_BUILD_TYPE=Debug \ -DUSE_THIN_ARCHIVES=OFF \ -DENABLE_FTL_JIT=ON \ - -DENABLE_MALLOC_HEAP_BREAKDOWN=ON \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DUSE_BUN_JSC_ADDITIONS=ON \ + -DUSE_BUN_EVENT_LOOP=ON \ -DENABLE_BUN_SKIP_FAILING_ASSERTIONS=ON \ -DALLOW_LINE_AND_COLUMN_NUMBER_IN_BUILTINS=ON \ -G Ninja \ @@ -1320,6 +1321,7 @@ jsc-build-mac-compile-debug: -DUSE_PTHREAD_JIT_PERMISSIONS_API=ON \ -DENABLE_REMOTE_INSPECTOR=ON \ -DUSE_VISIBILITY_ATTRIBUTE=1 \ + -DENABLE_SANITIZERS=address \ $(WEBKIT_DIR) \ $(WEBKIT_DEBUG_DIR) && \ CFLAGS="$(CFLAGS) -ffat-lto-objects" CXXFLAGS="$(CXXFLAGS) -ffat-lto-objects" \ @@ -1336,6 +1338,7 @@ jsc-build-linux-compile-config: -DENABLE_BUN_SKIP_FAILING_ASSERTIONS=ON \ -DUSE_THIN_ARCHIVES=OFF \ -DUSE_BUN_JSC_ADDITIONS=ON \ + -DUSE_BUN_EVENT_LOOP=ON \ -DENABLE_FTL_JIT=ON \ -DENABLE_REMOTE_INSPECTOR=ON \ -DJSEXPORT_PRIVATE=WTF_EXPORT_DECLARATION \ @@ -1359,6 +1362,7 @@ jsc-build-linux-compile-config-debug: -DENABLE_BUN_SKIP_FAILING_ASSERTIONS=ON \ -DUSE_THIN_ARCHIVES=OFF \ -DUSE_BUN_JSC_ADDITIONS=ON \ + -DUSE_BUN_EVENT_LOOP=ON \ -DENABLE_FTL_JIT=ON \ -DENABLE_REMOTE_INSPECTOR=ON \ -DJSEXPORT_PRIVATE=WTF_EXPORT_DECLARATION \ @@ -1372,27 +1376,27 @@ jsc-build-linux-compile-config-debug: $(WEBKIT_DEBUG_DIR) # If you get "Error: could not load cache" -# run rm -rf src/bun.js/WebKit/CMakeCache.txt +# run rm -rf vendor/WebKit/CMakeCache.txt .PHONY: jsc-build-linux-compile-build jsc-build-linux-compile-build: mkdir -p $(WEBKIT_RELEASE_DIR) && \ cd $(WEBKIT_RELEASE_DIR) && \ - CFLAGS="$(CFLAGS) -Wl,--whole-archive -ffat-lto-objects" CXXFLAGS="$(CXXFLAGS) -Wl,--whole-archive -ffat-lto-objects -DUSE_BUN_JSC_ADDITIONS=ON" \ + CFLAGS="$(CFLAGS) -Wl,--whole-archive -ffat-lto-objects" CXXFLAGS="$(CXXFLAGS) -Wl,--whole-archive -ffat-lto-objects -DUSE_BUN_JSC_ADDITIONS=ON -DUSE_BUN_EVENT_LOOP=ON" \ cmake --build $(WEBKIT_RELEASE_DIR) --config relwithdebuginfo --target jsc .PHONY: jsc-build-linux-compile-build-debug jsc-build-linux-compile-build-debug: mkdir -p $(WEBKIT_DEBUG_DIR) && \ cd $(WEBKIT_DEBUG_DIR) && \ - CFLAGS="$(CFLAGS) -Wl,--whole-archive -ffat-lto-objects" CXXFLAGS="$(CXXFLAGS) -Wl,--whole-archive -ffat-lto-objects -DUSE_BUN_JSC_ADDITIONS=ON" \ + CFLAGS="$(CFLAGS) -Wl,--whole-archive -ffat-lto-objects" CXXFLAGS="$(CXXFLAGS) -Wl,--whole-archive -ffat-lto-objects -DUSE_BUN_JSC_ADDITIONS=ON -DUSE_BUN_EVENT_LOOP=ON" \ cmake --build $(WEBKIT_DEBUG_DIR) --config Debug --target jsc jsc-build-mac: jsc-force-fastjit jsc-build-mac-compile jsc-build-copy -jsc-build-mac-debug: jsc-force-fastjit jsc-build-mac-compile-debug jsc-build-copy-debug +jsc-build-mac-debug: jsc-force-fastjit jsc-build-mac-compile-debug jsc-build-linux: jsc-build-linux-compile-config jsc-build-linux-compile-build jsc-build-copy -jsc-build-linux-debug: jsc-build-linux-compile-config-debug jsc-build-linux-compile-build-debug jsc-build-copy-debug +jsc-build-linux-debug: jsc-build-linux-compile-config-debug jsc-build-linux-compile-build-debug jsc-build-copy: cp $(WEBKIT_RELEASE_DIR)/lib/libJavaScriptCore.a $(BUN_DEPS_OUT_DIR)/libJavaScriptCore.a @@ -1407,7 +1411,7 @@ jsc-build-copy-debug: cp $(WEBKIT_DEBUG_DIR)/lib/libbmalloc.a $(BUN_DEPS_OUT_DIR)/libbmalloc.a clean-jsc: - cd src/bun.js/WebKit && rm -rf **/CMakeCache.txt **/CMakeFiles && rm -rf src/bun.js/WebKit/WebKitBuild + cd vendor/WebKit && rm -rf **/CMakeCache.txt **/CMakeFiles && rm -rf vendor/WebKit/WebKitBuild clean-bindings: rm -rf $(OBJ_DIR)/*.o $(DEBUG_OBJ_DIR)/*.o $(DEBUG_OBJ_DIR)/webcore/*.o $(DEBUG_BINDINGS_OBJ) $(OBJ_DIR)/webcore/*.o $(BINDINGS_OBJ) $(OBJ_DIR)/*.d $(DEBUG_OBJ_DIR)/*.d diff --git a/README.md b/README.md index 63c6d5e0b7..675dd5b261 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- Logo + Logo

Bun

@@ -24,11 +24,9 @@ ## What is Bun? -> **Bun is under active development.** Use it to speed up your development workflows or run simpler production code in resource-constrained environments like serverless functions. We're working on more complete Node.js compatibility and integration with existing frameworks. Join the [Discord](https://bun.sh/discord) and watch the [GitHub repository](https://github.com/oven-sh/bun) to keep tabs on future releases. - Bun is an all-in-one toolkit for JavaScript and TypeScript apps. It ships as a single executable called `bun`. -At its core is the _Bun runtime_, a fast JavaScript runtime designed as a drop-in replacement for Node.js. It's written in Zig and powered by JavaScriptCore under the hood, dramatically reducing startup times and memory usage. +At its core is the _Bun runtime_, a fast JavaScript runtime designed as **a drop-in replacement for Node.js**. It's written in Zig and powered by JavaScriptCore under the hood, dramatically reducing startup times and memory usage. ```bash bun run index.tsx # TS and JSX supported out-of-the-box @@ -87,16 +85,19 @@ bun upgrade --canary ## Quick links - Intro + - [What is Bun?](https://bun.sh/docs/index) - [Installation](https://bun.sh/docs/installation) - [Quickstart](https://bun.sh/docs/quickstart) - [TypeScript](https://bun.sh/docs/typescript) - Templating + - [`bun init`](https://bun.sh/docs/cli/init) - [`bun create`](https://bun.sh/docs/cli/bun-create) - Runtime + - [`bun run`](https://bun.sh/docs/cli/run) - [File types](https://bun.sh/docs/runtime/loaders) - [TypeScript](https://bun.sh/docs/runtime/typescript) @@ -115,6 +116,7 @@ bun upgrade --canary - [Framework API](https://bun.sh/docs/runtime/framework) - Package manager + - [`bun install`](https://bun.sh/docs/cli/install) - [`bun add`](https://bun.sh/docs/cli/add) - [`bun remove`](https://bun.sh/docs/cli/remove) @@ -130,6 +132,7 @@ bun upgrade --canary - [Overrides and resolutions](https://bun.sh/docs/install/overrides) - Bundler + - [`Bun.build`](https://bun.sh/docs/bundler) - [Loaders](https://bun.sh/docs/bundler/loaders) - [Plugins](https://bun.sh/docs/bundler/plugins) @@ -137,6 +140,7 @@ bun upgrade --canary - [vs esbuild](https://bun.sh/docs/bundler/vs-esbuild) - Test runner + - [`bun test`](https://bun.sh/docs/cli/test) - [Writing tests](https://bun.sh/docs/test/writing) - [Watch mode](https://bun.sh/docs/test/hot) @@ -148,9 +152,11 @@ bun upgrade --canary - [Code coverage](https://bun.sh/docs/test/coverage) - Package runner + - [`bunx`](https://bun.sh/docs/cli/bunx) - API + - [HTTP server](https://bun.sh/docs/api/http) - [WebSockets](https://bun.sh/docs/api/websockets) - [Workers](https://bun.sh/docs/api/workers) @@ -183,9 +189,10 @@ bun upgrade --canary - [Building Windows](https://bun.sh/docs/project/building-windows) - [License](https://bun.sh/docs/project/licensing) -## Guides +## Guides + +- Binary -- Binary - [Convert a Blob to a DataView](https://bun.sh/guides/binary/blob-to-dataview) - [Convert a Blob to a ReadableStream](https://bun.sh/guides/binary/blob-to-stream) - [Convert a Blob to a string](https://bun.sh/guides/binary/blob-to-string) @@ -209,7 +216,8 @@ bun upgrade --canary - [Convert an ArrayBuffer to a Uint8Array](https://bun.sh/guides/binary/arraybuffer-to-typedarray) - [Convert an ArrayBuffer to an array of numbers](https://bun.sh/guides/binary/arraybuffer-to-array) -- Ecosystem +- Ecosystem + - [Build a frontend using Vite and Bun](https://bun.sh/guides/ecosystem/vite) - [Build an app with Astro and Bun](https://bun.sh/guides/ecosystem/astro) - [Build an app with Next.js and Bun](https://bun.sh/guides/ecosystem/nextjs) @@ -236,7 +244,8 @@ bun upgrade --canary - [Use React and JSX](https://bun.sh/guides/ecosystem/react) - [Add Sentry to a Bun app](https://bun.sh/guides/ecosystem/sentry) -- HTTP +- HTTP + - [Common HTTP server usage](https://bun.sh/guides/http/server) - [Configure TLS on an HTTP server](https://bun.sh/guides/http/tls) - [fetch with unix domain sockets in Bun](https://bun.sh/guides/http/fetch-unix) @@ -250,7 +259,8 @@ bun upgrade --canary - [Upload files via HTTP using FormData](https://bun.sh/guides/http/file-uploads) - [Write a simple HTTP server](https://bun.sh/guides/http/simple) -- Install +- Install + - [Add a dependency](https://bun.sh/guides/install/add) - [Add a development dependency](https://bun.sh/guides/install/add-dev) - [Add a Git dependency](https://bun.sh/guides/install/add-git) @@ -268,7 +278,8 @@ bun upgrade --canary - [Using bun install with an Azure Artifacts npm registry](https://bun.sh/guides/install/azure-artifacts) - [Using bun install with Artifactory](https://bun.sh/guides/install/jfrog-artifactory) -- Process +- Process + - [Get the process uptime in nanoseconds](https://bun.sh/guides/process/nanoseconds) - [Listen for CTRL+C](https://bun.sh/guides/process/ctrl-c) - [Listen to OS signals](https://bun.sh/guides/process/os-signals) @@ -279,7 +290,8 @@ bun upgrade --canary - [Spawn a child process](https://bun.sh/guides/process/spawn) - [Spawn a child process and communicate using IPC](https://bun.sh/guides/process/ipc) -- Read file +- Read file + - [Check if a file exists](https://bun.sh/guides/read-file/exists) - [Get the MIME type of a file](https://bun.sh/guides/read-file/mime) - [Read a file as a ReadableStream](https://bun.sh/guides/read-file/stream) @@ -290,7 +302,8 @@ bun upgrade --canary - [Read a JSON file](https://bun.sh/guides/read-file/json) - [Watch a directory for changes](https://bun.sh/guides/read-file/watch) -- Runtime +- Runtime + - [Debugging Bun with the VS Code extension](https://bun.sh/guides/runtime/vscode-debugger) - [Debugging Bun with the web debugger](https://bun.sh/guides/runtime/web-debugger) - [Define and replace static globals & constants](https://bun.sh/guides/runtime/define-constant) @@ -305,7 +318,8 @@ bun upgrade --canary - [Set a time zone in Bun](https://bun.sh/guides/runtime/timezone) - [Set environment variables](https://bun.sh/guides/runtime/set-env) -- Streams +- Streams + - [Convert a Node.js Readable to a Blob](https://bun.sh/guides/streams/node-readable-to-blob) - [Convert a Node.js Readable to a string](https://bun.sh/guides/streams/node-readable-to-string) - [Convert a Node.js Readable to an ArrayBuffer](https://bun.sh/guides/streams/node-readable-to-arraybuffer) @@ -318,7 +332,8 @@ bun upgrade --canary - [Convert a ReadableStream to an ArrayBuffer](https://bun.sh/guides/streams/to-arraybuffer) - [Convert a ReadableStream to JSON](https://bun.sh/guides/streams/to-json) -- Test +- Test + - [Bail early with the Bun test runner](https://bun.sh/guides/test/bail) - [Generate code coverage reports with the Bun test runner](https://bun.sh/guides/test/coverage) - [Mark a test as a "todo" with the Bun test runner](https://bun.sh/guides/test/todo-tests) @@ -336,7 +351,8 @@ bun upgrade --canary - [Use snapshot testing in `bun test`](https://bun.sh/guides/test/snapshot) - [Write browser DOM tests with Bun and happy-dom](https://bun.sh/guides/test/happy-dom) -- Util +- Util + - [Check if the current file is the entrypoint](https://bun.sh/guides/util/entrypoint) - [Check if two objects are deeply equal](https://bun.sh/guides/util/deep-equals) - [Compress and decompress data with DEFLATE](https://bun.sh/guides/util/deflate) @@ -355,13 +371,14 @@ bun upgrade --canary - [Hash a password](https://bun.sh/guides/util/hash-a-password) - [Sleep for a fixed number of milliseconds](https://bun.sh/guides/util/sleep) -- WebSocket +- WebSocket + - [Build a publish-subscribe WebSocket server](https://bun.sh/guides/websocket/pubsub) - [Build a simple WebSocket server](https://bun.sh/guides/websocket/simple) - [Enable compression for WebSocket messages](https://bun.sh/guides/websocket/compression) - [Set per-socket contextual data on a WebSocket](https://bun.sh/guides/websocket/context) -- Write file +- Write file - [Append content to a file](https://bun.sh/guides/write-file/append) - [Copy a file to another location](https://bun.sh/guides/write-file/file-cp) - [Delete a file](https://bun.sh/guides/write-file/unlink) diff --git a/bench/async/bun.js b/bench/async/bun.js index 51d0d119bb..b5f91da558 100644 --- a/bench/async/bun.js +++ b/bench/async/bun.js @@ -1,4 +1,4 @@ -import { run, bench } from "mitata"; +import { bench, run } from "../runner.mjs"; bench("sync", () => {}); bench("async", async () => {}); diff --git a/bench/async/deno.js b/bench/async/deno.js index 9e4347b539..b5f91da558 100644 --- a/bench/async/deno.js +++ b/bench/async/deno.js @@ -1,4 +1,4 @@ -import { run, bench } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; bench("sync", () => {}); bench("async", async () => {}); diff --git a/bench/async/node.mjs b/bench/async/node.mjs index 51d0d119bb..b5f91da558 100644 --- a/bench/async/node.mjs +++ b/bench/async/node.mjs @@ -1,4 +1,4 @@ -import { run, bench } from "mitata"; +import { bench, run } from "../runner.mjs"; bench("sync", () => {}); bench("async", async () => {}); diff --git a/bench/async/package.json b/bench/async/package.json index f5c377686b..bb84ce4cf6 100644 --- a/bench/async/package.json +++ b/bench/async/package.json @@ -3,9 +3,9 @@ "scripts": { "deps": "exit 0", "build": "exit 0", - "bench:bun": "$BUN bun.js", - "bench:node": "$NODE node.mjs", - "bench:deno": "$DENO run -A --unstable deno.js", + "bench:bun": "bun bun.js", + "bench:node": "node node.mjs", + "bench:deno": "deno run -A --unstable deno.js", "bench": "bun run bench:bun && bun run bench:node && bun run bench:deno" } } diff --git a/bench/bun.lock b/bench/bun.lock new file mode 100644 index 0000000000..31e497f2fa --- /dev/null +++ b/bench/bun.lock @@ -0,0 +1,416 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "bench", + "dependencies": { + "@babel/core": "^7.16.10", + "@babel/preset-react": "^7.16.7", + "@babel/standalone": "^7.24.7", + "@swc/core": "^1.2.133", + "benchmark": "^2.1.4", + "braces": "^3.0.2", + "color": "^4.2.3", + "esbuild": "^0.14.12", + "eventemitter3": "^5.0.0", + "execa": "^8.0.1", + "fast-glob": "3.3.1", + "fdir": "^6.1.0", + "mitata": "^1.0.25", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "string-width": "7.1.0", + "tinycolor2": "^1.6.0", + "zx": "^7.2.3", + }, + "devDependencies": { + "fast-deep-equal": "^3.1.3", + }, + }, + }, + "packages": { + "@ampproject/remapping": ["@ampproject/remapping@2.2.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w=="], + + "@babel/code-frame": ["@babel/code-frame@7.18.6", "", { "dependencies": { "@babel/highlight": "^7.18.6" } }, "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q=="], + + "@babel/compat-data": ["@babel/compat-data@7.20.14", "", {}, "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw=="], + + "@babel/core": ["@babel/core@7.20.12", "", { "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-module-transforms": "^7.20.11", "@babel/helpers": "^7.20.7", "@babel/parser": "^7.20.7", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.12", "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", "semver": "^6.3.0" } }, "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg=="], + + "@babel/generator": ["@babel/generator@7.20.14", "", { "dependencies": { "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" } }, "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.20.7", "", { "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ=="], + + "@babel/helper-environment-visitor": ["@babel/helper-environment-visitor@7.18.9", "", {}, "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg=="], + + "@babel/helper-function-name": ["@babel/helper-function-name@7.19.0", "", { "dependencies": { "@babel/template": "^7.18.10", "@babel/types": "^7.19.0" } }, "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w=="], + + "@babel/helper-hoist-variables": ["@babel/helper-hoist-variables@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.20.11", "", { "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.10", "@babel/types": "^7.20.7" } }, "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.20.2", "", {}, "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ=="], + + "@babel/helper-simple-access": ["@babel/helper-simple-access@7.20.2", "", { "dependencies": { "@babel/types": "^7.20.2" } }, "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA=="], + + "@babel/helper-split-export-declaration": ["@babel/helper-split-export-declaration@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.19.4", "", {}, "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.19.1", "", {}, "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.18.6", "", {}, "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw=="], + + "@babel/helpers": ["@babel/helpers@7.20.13", "", { "dependencies": { "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.13", "@babel/types": "^7.20.7" } }, "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg=="], + + "@babel/highlight": ["@babel/highlight@7.18.6", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g=="], + + "@babel/parser": ["@babel/parser@7.20.15", "", { "bin": "./bin/babel-parser.js" }, "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.18.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q=="], + + "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.18.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA=="], + + "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.20.13", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw=="], + + "@babel/plugin-transform-react-jsx-development": ["@babel/plugin-transform-react-jsx-development@7.18.6", "", { "dependencies": { "@babel/plugin-transform-react-jsx": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA=="], + + "@babel/plugin-transform-react-pure-annotations": ["@babel/plugin-transform-react-pure-annotations@7.18.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ=="], + + "@babel/preset-react": ["@babel/preset-react@7.18.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-transform-react-display-name": "^7.18.6", "@babel/plugin-transform-react-jsx": "^7.18.6", "@babel/plugin-transform-react-jsx-development": "^7.18.6", "@babel/plugin-transform-react-pure-annotations": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg=="], + + "@babel/standalone": ["@babel/standalone@7.24.7", "", {}, "sha512-QRIRMJ2KTeN+vt4l9OjYlxDVXEpcor1Z6V7OeYzeBOw6Q8ew9oMTHjzTx8s6ClsZO7wVf6JgTRutihatN6K0yA=="], + + "@babel/template": ["@babel/template@7.20.7", "", { "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7" } }, "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw=="], + + "@babel/traverse": ["@babel/traverse@7.20.13", "", { "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/parser": "^7.20.13", "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" } }, "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ=="], + + "@babel/types": ["@babel/types@7.20.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.14.54", "", { "os": "linux", "cpu": "none" }, "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.1.1", "", { "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.0", "", {}, "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.1.2", "", {}, "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.14", "", {}, "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.17", "", { "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@swc/core": ["@swc/core@1.3.35", "", { "dependencies": { "@swc/core-darwin-arm64": "1.3.35", "@swc/core-darwin-x64": "1.3.35", "@swc/core-linux-arm-gnueabihf": "1.3.35", "@swc/core-linux-arm64-gnu": "1.3.35", "@swc/core-linux-arm64-musl": "1.3.35", "@swc/core-linux-x64-gnu": "1.3.35", "@swc/core-linux-x64-musl": "1.3.35", "@swc/core-win32-arm64-msvc": "1.3.35", "@swc/core-win32-ia32-msvc": "1.3.35", "@swc/core-win32-x64-msvc": "1.3.35" } }, "sha512-KmiBin0XSVzJhzX19zTiCqmLslZ40Cl7zqskJcTDeIrRhfgKdiAsxzYUanJgMJIRjYtl9Kcg1V/Ip2o2wL8v3w=="], + + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.3.35", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zQUFkHx4gZpu0uo2IspvPnKsz8bsdXd5bC33xwjtoAI1cpLerDyqo4v2zIahEp+FdKZjyVsLHtfJiQiA1Qka3A=="], + + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.3.35", "", { "os": "darwin", "cpu": "x64" }, "sha512-oOSkSGWtALovaw22lNevKD434OQTPf8X+dVPvPMrJXJpJ34dWDlFWpLntoc+arvKLNZ7LQmTuk8rR1hkrAY7cw=="], + + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.3.35", "", { "os": "linux", "cpu": "arm" }, "sha512-Yie8k00O6O8BCATS/xeKStquV4OYSskUGRDXBQVDw1FrE23PHaSeHCgg4q6iNZjJzXCOJbaTCKnYoIDn9DMf7A=="], + + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.3.35", "", { "os": "linux", "cpu": "arm64" }, "sha512-Zlv3WHa/4x2p51HSvjUWXHfSe1Gl2prqImUZJc8NZOlj75BFzVuR0auhQ+LbwvIQ3gaA1LODX9lyS9wXL3yjxA=="], + + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.3.35", "", { "os": "linux", "cpu": "arm64" }, "sha512-u6tCYsrSyZ8U+4jLMA/O82veBfLy2aUpn51WxQaeH7wqZGy9TGSJXoO8vWxARQ6b72vjsnKDJHP4MD8hFwcctg=="], + + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.3.35", "", { "os": "linux", "cpu": "x64" }, "sha512-Dtxf2IbeH7XlNhP1Qt2/MvUPkpEbn7hhGfpSRs4ot8D3Vf5QEX4S/QtC1OsFWuciiYgHAT1Ybjt4xZic9DSkmA=="], + + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.3.35", "", { "os": "linux", "cpu": "x64" }, "sha512-4XavNJ60GprjpTiESCu5daJUnmErixPAqDitJSMu4TV32LNIE8G00S9pDLXinDTW1rgcGtQdq1NLkNRmwwovtg=="], + + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.3.35", "", { "os": "win32", "cpu": "arm64" }, "sha512-dNGfKCUSX2M4qVyaS80Lyos0FkXyHRCvrdQ2Y4Hrg3FVokiuw3yY6fLohpUfQ5ws3n2A39dh7jGDeh34+l0sGA=="], + + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.3.35", "", { "os": "win32", "cpu": "ia32" }, "sha512-ChuPSrDR+JBf7S7dEKPicnG8A3bM0uWPsW2vG+V2wH4iNfNxKVemESHosmYVeEZXqMpomNMvLyeHep1rjRsc0Q=="], + + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.3.35", "", { "os": "win32", "cpu": "x64" }, "sha512-/RvphT4WfuGfIK84Ha0dovdPrKB1bW/mc+dtdmhv2E3EGkNc5FoueNwYmXWRimxnU7X0X7IkcRhyKB4G5DeAmg=="], + + "@types/fs-extra": ["@types/fs-extra@11.0.4", "", { "dependencies": { "@types/jsonfile": "*", "@types/node": "*" } }, "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ=="], + + "@types/jsonfile": ["@types/jsonfile@6.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ=="], + + "@types/minimist": ["@types/minimist@1.2.5", "", {}, "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag=="], + + "@types/node": ["@types/node@18.19.8", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-g1pZtPhsvGVTwmeVoexWZLTQaOvXwoSq//pTL0DHeNzUDrFnir4fgETdhjhIxjVnN+hKOuh98+E1eMLnUXstFg=="], + + "@types/ps-tree": ["@types/ps-tree@1.1.6", "", {}, "sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ=="], + + "@types/which": ["@types/which@3.0.3", "", {}, "sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g=="], + + "ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="], + + "ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "benchmark": ["benchmark@2.1.4", "", { "dependencies": { "lodash": "^4.17.4", "platform": "^1.3.3" } }, "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ=="], + + "braces": ["braces@3.0.2", "", { "dependencies": { "fill-range": "^7.0.1" } }, "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="], + + "browserslist": ["browserslist@4.21.5", "", { "dependencies": { "caniuse-lite": "^1.0.30001449", "electron-to-chromium": "^1.4.284", "node-releases": "^2.0.8", "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" } }, "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001456", "", {}, "sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA=="], + + "chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="], + + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + + "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], + + "debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], + + "electron-to-chromium": ["electron-to-chromium@1.4.302", "", {}, "sha512-Uk7C+7aPBryUR1Fwvk9VmipBcN9fVsqBO57jV2ZjTm+IZ6BMNqu7EDVEg2HxCNufk6QcWlFsBkhQyQroB2VWKw=="], + + "emoji-regex": ["emoji-regex@10.3.0", "", {}, "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw=="], + + "esbuild": ["esbuild@0.14.54", "", { "dependencies": { "@esbuild/linux-loong64": "0.14.54", "esbuild-android-64": "0.14.54", "esbuild-android-arm64": "0.14.54", "esbuild-darwin-64": "0.14.54", "esbuild-darwin-arm64": "0.14.54", "esbuild-freebsd-64": "0.14.54", "esbuild-freebsd-arm64": "0.14.54", "esbuild-linux-32": "0.14.54", "esbuild-linux-64": "0.14.54", "esbuild-linux-arm": "0.14.54", "esbuild-linux-arm64": "0.14.54", "esbuild-linux-mips64le": "0.14.54", "esbuild-linux-ppc64le": "0.14.54", "esbuild-linux-riscv64": "0.14.54", "esbuild-linux-s390x": "0.14.54", "esbuild-netbsd-64": "0.14.54", "esbuild-openbsd-64": "0.14.54", "esbuild-sunos-64": "0.14.54", "esbuild-windows-32": "0.14.54", "esbuild-windows-64": "0.14.54", "esbuild-windows-arm64": "0.14.54" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA=="], + + "esbuild-android-64": ["esbuild-android-64@0.14.54", "", { "os": "android", "cpu": "x64" }, "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ=="], + + "esbuild-android-arm64": ["esbuild-android-arm64@0.14.54", "", { "os": "android", "cpu": "arm64" }, "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg=="], + + "esbuild-darwin-64": ["esbuild-darwin-64@0.14.54", "", { "os": "darwin", "cpu": "x64" }, "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug=="], + + "esbuild-darwin-arm64": ["esbuild-darwin-arm64@0.14.54", "", { "os": "darwin", "cpu": "arm64" }, "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw=="], + + "esbuild-freebsd-64": ["esbuild-freebsd-64@0.14.54", "", { "os": "freebsd", "cpu": "x64" }, "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg=="], + + "esbuild-freebsd-arm64": ["esbuild-freebsd-arm64@0.14.54", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q=="], + + "esbuild-linux-32": ["esbuild-linux-32@0.14.54", "", { "os": "linux", "cpu": "ia32" }, "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw=="], + + "esbuild-linux-64": ["esbuild-linux-64@0.14.54", "", { "os": "linux", "cpu": "x64" }, "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg=="], + + "esbuild-linux-arm": ["esbuild-linux-arm@0.14.54", "", { "os": "linux", "cpu": "arm" }, "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw=="], + + "esbuild-linux-arm64": ["esbuild-linux-arm64@0.14.54", "", { "os": "linux", "cpu": "arm64" }, "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig=="], + + "esbuild-linux-mips64le": ["esbuild-linux-mips64le@0.14.54", "", { "os": "linux", "cpu": "none" }, "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw=="], + + "esbuild-linux-ppc64le": ["esbuild-linux-ppc64le@0.14.54", "", { "os": "linux", "cpu": "ppc64" }, "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ=="], + + "esbuild-linux-riscv64": ["esbuild-linux-riscv64@0.14.54", "", { "os": "linux", "cpu": "none" }, "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg=="], + + "esbuild-linux-s390x": ["esbuild-linux-s390x@0.14.54", "", { "os": "linux", "cpu": "s390x" }, "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA=="], + + "esbuild-netbsd-64": ["esbuild-netbsd-64@0.14.54", "", { "os": "none", "cpu": "x64" }, "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w=="], + + "esbuild-openbsd-64": ["esbuild-openbsd-64@0.14.54", "", { "os": "openbsd", "cpu": "x64" }, "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw=="], + + "esbuild-sunos-64": ["esbuild-sunos-64@0.14.54", "", { "os": "sunos", "cpu": "x64" }, "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw=="], + + "esbuild-windows-32": ["esbuild-windows-32@0.14.54", "", { "os": "win32", "cpu": "ia32" }, "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w=="], + + "esbuild-windows-64": ["esbuild-windows-64@0.14.54", "", { "os": "win32", "cpu": "x64" }, "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ=="], + + "esbuild-windows-arm64": ["esbuild-windows-arm64@0.14.54", "", { "os": "win32", "cpu": "arm64" }, "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg=="], + + "escalade": ["escalade@3.1.1", "", {}, "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="], + + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "event-stream": ["event-stream@3.3.4", "", { "dependencies": { "duplexer": "~0.1.1", "from": "~0", "map-stream": "~0.1.0", "pause-stream": "0.0.11", "split": "0.3", "stream-combiner": "~0.0.4", "through": "~2.3.1" } }, "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g=="], + + "eventemitter3": ["eventemitter3@5.0.0", "", {}, "sha512-riuVbElZZNXLeLEoprfNYoDSwTBRR44X3mnhdI1YcnENpWTCsTTVZ2zFuqQcpoyqPQIUXdiPEU0ECAq0KQRaHg=="], + + "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="], + + "fastq": ["fastq@1.15.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw=="], + + "fdir": ["fdir@6.1.0", "", { "peerDependencies": { "picomatch": "2.x" } }, "sha512-274qhz5PxNnA/fybOu6apTCUnM0GnO3QazB6VH+oag/7DQskdYq8lm07ZSm90kEQuWYH5GvjAxGruuHrEr0bcg=="], + + "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], + + "fill-range": ["fill-range@7.0.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="], + + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], + + "from": ["from@0.1.7", "", {}, "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g=="], + + "fs-extra": ["fs-extra@11.2.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw=="], + + "fx": ["fx@31.0.0", "", { "bin": { "fx": "index.js" } }, "sha512-OoeYSPKqNKmfnH4s+rGYI0c8OZmqqOOXsUtqy0YyHqQQoQSDiDs3m3M9uXKx5OQR+jDx7/FhYqpO3kl/As/xgg=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-east-asian-width": ["get-east-asian-width@1.2.0", "", {}, "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA=="], + + "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "globby": ["globby@13.2.2", "", { "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" } }, "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], + + "ignore": ["ignore@5.3.0", "", {}, "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg=="], + + "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "jsesc": ["jsesc@2.5.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "map-stream": ["map-stream@0.1.0", "", {}, "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.5", "", { "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="], + + "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mitata": ["mitata@1.0.25", "", {}, "sha512-0v5qZtVW5vwj9FDvYfraR31BMDcRLkhSFWPTLaxx/Z3/EvScfVtAAWtMI2ArIbBcwh7P86dXh0lQWKiXQPlwYA=="], + + "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + + "node-fetch": ["node-fetch@3.3.1", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow=="], + + "node-releases": ["node-releases@2.0.10", "", {}, "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w=="], + + "npm-run-path": ["npm-run-path@5.2.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg=="], + + "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pause-stream": ["pause-stream@0.0.11", "", { "dependencies": { "through": "~2.3" } }, "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A=="], + + "picocolors": ["picocolors@1.0.0", "", {}, "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "platform": ["platform@1.3.6", "", {}, "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="], + + "ps-tree": ["ps-tree@1.2.0", "", { "dependencies": { "event-stream": "=3.3.4" }, "bin": { "ps-tree": "./bin/ps-tree.js" } }, "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], + + "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], + + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "semver": ["semver@6.3.0", "", { "bin": { "semver": "./bin/semver.js" } }, "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], + + "slash": ["slash@4.0.0", "", {}, "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew=="], + + "split": ["split@0.3.3", "", { "dependencies": { "through": "2" } }, "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA=="], + + "stream-combiner": ["stream-combiner@0.0.4", "", { "dependencies": { "duplexer": "~0.1.1" } }, "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw=="], + + "string-width": ["string-width@7.1.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw=="], + + "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], + + "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="], + + "to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "update-browserslist-db": ["update-browserslist-db@1.0.10", "", { "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "browserslist-lint": "cli.js" } }, "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ=="], + + "web-streams-polyfill": ["web-streams-polyfill@3.3.2", "", {}, "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ=="], + + "webpod": ["webpod@0.0.2", "", { "bin": { "webpod": "dist/index.js" } }, "sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg=="], + + "which": ["which@3.0.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yaml": ["yaml@2.3.4", "", {}, "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA=="], + + "zx": ["zx@7.2.3", "", { "dependencies": { "@types/fs-extra": "^11.0.1", "@types/minimist": "^1.2.2", "@types/node": "^18.16.3", "@types/ps-tree": "^1.1.2", "@types/which": "^3.0.0", "chalk": "^5.2.0", "fs-extra": "^11.1.1", "fx": "*", "globby": "^13.1.4", "minimist": "^1.2.8", "node-fetch": "3.3.1", "ps-tree": "^1.2.0", "webpod": "^0", "which": "^3.0.0", "yaml": "^2.2.2" }, "bin": { "zx": "build/cli.js" } }, "sha512-QODu38nLlYXg/B/Gw7ZKiZrvPkEsjPN3LQ5JFXM7h0JvwhEdPNNl+4Ao1y4+o3CLNiDUNcwzQYZ4/Ko7kKzCMA=="], + + "@babel/generator/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.2", "", { "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } }, "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A=="], + + "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + } +} diff --git a/bench/bun.lockb b/bench/bun.lockb deleted file mode 100755 index 679ce8aba1..0000000000 Binary files a/bench/bun.lockb and /dev/null differ diff --git a/bench/copyfile/node.mitata.mjs b/bench/copyfile/node.mitata.mjs index 379150487f..de0e76beab 100644 --- a/bench/copyfile/node.mitata.mjs +++ b/bench/copyfile/node.mitata.mjs @@ -1,5 +1,5 @@ -import { copyFileSync, writeFileSync, readFileSync, statSync } from "node:fs"; -import { bench, run } from "mitata"; +import { copyFileSync, statSync, writeFileSync } from "node:fs"; +import { bench, run } from "../runner.mjs"; function runner(ready) { for (let size of [1, 10, 100, 1000, 10000, 100000, 1000000, 10000000]) { diff --git a/bench/crypto/asymmetricCipher.js b/bench/crypto/asymmetricCipher.js new file mode 100644 index 0000000000..7fa92b20e0 --- /dev/null +++ b/bench/crypto/asymmetricCipher.js @@ -0,0 +1,24 @@ +import { bench, run } from "../runner.mjs"; +const crypto = require("node:crypto"); + +const keyPair = crypto.generateKeyPairSync("rsa", { + modulusLength: 2048, + publicKeyEncoding: { + type: "spki", + format: "pem", + }, + privateKeyEncoding: { + type: "pkcs8", + format: "pem", + }, +}); + +// Max message size for 2048-bit RSA keys +const plaintext = crypto.getRandomValues(Buffer.alloc(214)); + +bench("RSA_PKCS1_OAEP_PADDING round-trip", () => { + const ciphertext = crypto.publicEncrypt(keyPair.publicKey, plaintext); + crypto.privateDecrypt(keyPair.privateKey, ciphertext); +}); + +await run(); diff --git a/bench/crypto/asymmetricSign.js b/bench/crypto/asymmetricSign.js new file mode 100644 index 0000000000..e00634963e --- /dev/null +++ b/bench/crypto/asymmetricSign.js @@ -0,0 +1,24 @@ +import { bench, run } from "../runner.mjs"; +const crypto = require("node:crypto"); + +const keyPair = crypto.generateKeyPairSync("rsa", { + modulusLength: 2048, + publicKeyEncoding: { + type: "spki", + format: "pem", + }, + privateKeyEncoding: { + type: "pkcs8", + format: "pem", + }, +}); + +// Max message size for 2048-bit RSA keys +const plaintext = crypto.getRandomValues(Buffer.alloc(245)); + +bench("RSA sign RSA_PKCS1_PADDING round-trip", () => { + const sig = crypto.privateEncrypt(keyPair.privateKey, plaintext); + crypto.publicDecrypt(keyPair.publicKey, sig); +}); + +await run(); diff --git a/bench/deepEqual/map.js b/bench/deepEqual/map.js new file mode 100644 index 0000000000..3d89d61eea --- /dev/null +++ b/bench/deepEqual/map.js @@ -0,0 +1,27 @@ +import { expect } from "bun:test"; +import { bench, run } from "../runner.mjs"; + +const MAP_SIZE = 10_000; + +function* genPairs(count) { + for (let i = 0; i < MAP_SIZE; i++) { + yield ["k" + i, "v" + i]; + } +} + +class CustomMap extends Map { + abc = 123; + constructor(iterable) { + super(iterable); + } +} + +const a = new Map(genPairs()); +const b = new Map(genPairs()); +bench("deepEqual Map", () => expect(a).toEqual(b)); + +const x = new CustomMap(genPairs()); +const y = new CustomMap(genPairs()); +bench("deepEqual CustomMap", () => expect(x).toEqual(y)); + +await run(); diff --git a/bench/deepEqual/set.js b/bench/deepEqual/set.js new file mode 100644 index 0000000000..1f16d09e9c --- /dev/null +++ b/bench/deepEqual/set.js @@ -0,0 +1,27 @@ +import { expect } from "bun:test"; +import { bench, run } from "../runner.mjs"; + +const SET_SIZE = 10_000; + +function* genValues(count) { + for (let i = 0; i < SET_SIZE; i++) { + yield "v" + i; + } +} + +class CustomSet extends Set { + abc = 123; + constructor(iterable) { + super(iterable); + } +} + +const a = new Set(genValues()); +const b = new Set(genValues()); +bench("deepEqual Set", () => expect(a).toEqual(b)); + +const x = new CustomSet(genValues()); +const y = new CustomSet(genValues()); +bench("deepEqual CustomSet", () => expect(x).toEqual(y)); + +await run(); diff --git a/bench/emitter/implementations.mjs b/bench/emitter/implementations.mjs index 2050ac38e0..abf025645f 100644 --- a/bench/emitter/implementations.mjs +++ b/bench/emitter/implementations.mjs @@ -1,6 +1,5 @@ -import EventEmitter3 from "eventemitter3"; -import { group } from "mitata"; import EventEmitterNative from "node:events"; +import { group } from "../runner.mjs"; export const implementations = [ { diff --git a/bench/emitter/microbench.mjs b/bench/emitter/microbench.mjs index eae59d4c19..4f3ebb465d 100644 --- a/bench/emitter/microbench.mjs +++ b/bench/emitter/microbench.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "mitata"; +import { bench, run } from "../runner.mjs"; import { groupForEmitter } from "./implementations.mjs"; var id = 0; diff --git a/bench/emitter/microbench_once.mjs b/bench/emitter/microbench_once.mjs index b24fb21031..fa5ca9496a 100644 --- a/bench/emitter/microbench_once.mjs +++ b/bench/emitter/microbench_once.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "mitata"; +import { bench, run } from "../runner.mjs"; import { groupForEmitter } from "./implementations.mjs"; var id = 0; diff --git a/bench/emitter/realworld_stream.mjs b/bench/emitter/realworld_stream.mjs index 1b2d19945b..6d2428df24 100644 --- a/bench/emitter/realworld_stream.mjs +++ b/bench/emitter/realworld_stream.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "mitata"; +import { bench, run } from "../runner.mjs"; import { groupForEmitter } from "./implementations.mjs"; // Pseudo RNG is derived from https://stackoverflow.com/a/424445 diff --git a/bench/expect-to-equal/bun.lock b/bench/expect-to-equal/bun.lock new file mode 100644 index 0000000000..581a173974 --- /dev/null +++ b/bench/expect-to-equal/bun.lock @@ -0,0 +1,669 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "expect-to-equal", + "devDependencies": { + "jest": "^29.3.1", + "vitest": "^0.25.3", + }, + }, + }, + "packages": { + "@ampproject/remapping": ["@ampproject/remapping@2.2.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w=="], + + "@babel/code-frame": ["@babel/code-frame@7.18.6", "", { "dependencies": { "@babel/highlight": "^7.18.6" } }, "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q=="], + + "@babel/compat-data": ["@babel/compat-data@7.20.14", "", {}, "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw=="], + + "@babel/core": ["@babel/core@7.20.12", "", { "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-module-transforms": "^7.20.11", "@babel/helpers": "^7.20.7", "@babel/parser": "^7.20.7", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.12", "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", "semver": "^6.3.0" } }, "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg=="], + + "@babel/generator": ["@babel/generator@7.20.14", "", { "dependencies": { "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" } }, "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.20.7", "", { "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ=="], + + "@babel/helper-environment-visitor": ["@babel/helper-environment-visitor@7.18.9", "", {}, "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg=="], + + "@babel/helper-function-name": ["@babel/helper-function-name@7.19.0", "", { "dependencies": { "@babel/template": "^7.18.10", "@babel/types": "^7.19.0" } }, "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w=="], + + "@babel/helper-hoist-variables": ["@babel/helper-hoist-variables@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.20.11", "", { "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.10", "@babel/types": "^7.20.7" } }, "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.20.2", "", {}, "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ=="], + + "@babel/helper-simple-access": ["@babel/helper-simple-access@7.20.2", "", { "dependencies": { "@babel/types": "^7.20.2" } }, "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA=="], + + "@babel/helper-split-export-declaration": ["@babel/helper-split-export-declaration@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.19.4", "", {}, "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.19.1", "", {}, "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.18.6", "", {}, "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw=="], + + "@babel/helpers": ["@babel/helpers@7.20.13", "", { "dependencies": { "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.13", "@babel/types": "^7.20.7" } }, "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg=="], + + "@babel/highlight": ["@babel/highlight@7.18.6", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g=="], + + "@babel/parser": ["@babel/parser@7.20.15", "", { "bin": "./bin/babel-parser.js" }, "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg=="], + + "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], + + "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="], + + "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], + + "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], + + "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.18.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q=="], + + "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], + + "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], + + "@babel/plugin-syntax-numeric-separator": ["@babel/plugin-syntax-numeric-separator@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="], + + "@babel/plugin-syntax-object-rest-spread": ["@babel/plugin-syntax-object-rest-spread@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="], + + "@babel/plugin-syntax-optional-catch-binding": ["@babel/plugin-syntax-optional-catch-binding@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="], + + "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="], + + "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.20.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.19.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ=="], + + "@babel/template": ["@babel/template@7.20.7", "", { "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7" } }, "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw=="], + + "@babel/traverse": ["@babel/traverse@7.20.13", "", { "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/parser": "^7.20.13", "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" } }, "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ=="], + + "@babel/types": ["@babel/types@7.20.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg=="], + + "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.16.17", "", { "os": "android", "cpu": "arm" }, "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.16.17", "", { "os": "android", "cpu": "arm64" }, "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.16.17", "", { "os": "android", "cpu": "x64" }, "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.16.17", "", { "os": "darwin", "cpu": "arm64" }, "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.16.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.16.17", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.16.17", "", { "os": "freebsd", "cpu": "x64" }, "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.16.17", "", { "os": "linux", "cpu": "arm" }, "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.16.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.16.17", "", { "os": "linux", "cpu": "ia32" }, "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.16.17", "", { "os": "linux", "cpu": "none" }, "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.16.17", "", { "os": "linux", "cpu": "none" }, "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.16.17", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.16.17", "", { "os": "linux", "cpu": "none" }, "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.16.17", "", { "os": "linux", "cpu": "s390x" }, "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.16.17", "", { "os": "linux", "cpu": "x64" }, "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.16.17", "", { "os": "none", "cpu": "x64" }, "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.16.17", "", { "os": "openbsd", "cpu": "x64" }, "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.16.17", "", { "os": "sunos", "cpu": "x64" }, "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.16.17", "", { "os": "win32", "cpu": "arm64" }, "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.16.17", "", { "os": "win32", "cpu": "ia32" }, "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.16.17", "", { "os": "win32", "cpu": "x64" }, "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q=="], + + "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], + + "@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="], + + "@jest/console": ["@jest/console@29.4.3", "", { "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3", "slash": "^3.0.0" } }, "sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A=="], + + "@jest/core": ["@jest/core@29.4.3", "", { "dependencies": { "@jest/console": "^29.4.3", "@jest/reporters": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.4.3", "jest-config": "^29.4.3", "jest-haste-map": "^29.4.3", "jest-message-util": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-resolve-dependencies": "^29.4.3", "jest-runner": "^29.4.3", "jest-runtime": "^29.4.3", "jest-snapshot": "^29.4.3", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "jest-watcher": "^29.4.3", "micromatch": "^4.0.4", "pretty-format": "^29.4.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ=="], + + "@jest/environment": ["@jest/environment@29.4.3", "", { "dependencies": { "@jest/fake-timers": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "jest-mock": "^29.4.3" } }, "sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA=="], + + "@jest/expect": ["@jest/expect@29.4.3", "", { "dependencies": { "expect": "^29.4.3", "jest-snapshot": "^29.4.3" } }, "sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ=="], + + "@jest/expect-utils": ["@jest/expect-utils@29.4.3", "", { "dependencies": { "jest-get-type": "^29.4.3" } }, "sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ=="], + + "@jest/fake-timers": ["@jest/fake-timers@29.4.3", "", { "dependencies": { "@jest/types": "^29.4.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.4.3", "jest-mock": "^29.4.3", "jest-util": "^29.4.3" } }, "sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw=="], + + "@jest/globals": ["@jest/globals@29.4.3", "", { "dependencies": { "@jest/environment": "^29.4.3", "@jest/expect": "^29.4.3", "@jest/types": "^29.4.3", "jest-mock": "^29.4.3" } }, "sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA=="], + + "@jest/reporters": ["@jest/reporters@29.4.3", "", { "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg=="], + + "@jest/schemas": ["@jest/schemas@29.4.3", "", { "dependencies": { "@sinclair/typebox": "^0.25.16" } }, "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg=="], + + "@jest/source-map": ["@jest/source-map@29.4.3", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.15", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w=="], + + "@jest/test-result": ["@jest/test-result@29.4.3", "", { "dependencies": { "@jest/console": "^29.4.3", "@jest/types": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA=="], + + "@jest/test-sequencer": ["@jest/test-sequencer@29.4.3", "", { "dependencies": { "@jest/test-result": "^29.4.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "slash": "^3.0.0" } }, "sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw=="], + + "@jest/transform": ["@jest/transform@29.4.3", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg=="], + + "@jest/types": ["@jest/types@29.4.3", "", { "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.2", "", { "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } }, "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.0", "", {}, "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.1.2", "", {}, "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.14", "", {}, "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.17", "", { "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.25.23", "", {}, "sha512-VEB8ygeP42CFLWyAJhN5OklpxUliqdNEUcXb4xZ/CINqtYGTjL5ukluKdKzQ0iWdUxyQ7B0539PAUhHKrCNWSQ=="], + + "@sinonjs/commons": ["@sinonjs/commons@2.0.0", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg=="], + + "@sinonjs/fake-timers": ["@sinonjs/fake-timers@10.0.2", "", { "dependencies": { "@sinonjs/commons": "^2.0.0" } }, "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw=="], + + "@types/babel__core": ["@types/babel__core@7.20.0", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ=="], + + "@types/babel__generator": ["@types/babel__generator@7.6.4", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg=="], + + "@types/babel__template": ["@types/babel__template@7.4.1", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.18.3", "", { "dependencies": { "@babel/types": "^7.3.0" } }, "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w=="], + + "@types/chai": ["@types/chai@4.3.4", "", {}, "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw=="], + + "@types/chai-subset": ["@types/chai-subset@1.3.3", "", { "dependencies": { "@types/chai": "*" } }, "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw=="], + + "@types/graceful-fs": ["@types/graceful-fs@4.1.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw=="], + + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.4", "", {}, "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.0", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.1", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw=="], + + "@types/node": ["@types/node@18.14.0", "", {}, "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A=="], + + "@types/prettier": ["@types/prettier@2.7.2", "", {}, "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg=="], + + "@types/stack-utils": ["@types/stack-utils@2.0.1", "", {}, "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw=="], + + "@types/yargs": ["@types/yargs@17.0.22", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g=="], + + "@types/yargs-parser": ["@types/yargs-parser@20.2.2", "", {}, "sha512-sUWMriymrSqTvxCmCkf+7k392TNDcMJBHI1/rysWJxKnWAan/Zk4gZ/GEieSRo4EqIEPpbGU3Sd/0KTRoIA3pA=="], + + "acorn": ["acorn@8.8.2", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw=="], + + "acorn-walk": ["acorn-walk@8.2.0", "", {}, "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA=="], + + "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "assertion-error": ["assertion-error@1.1.0", "", {}, "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="], + + "babel-jest": ["babel-jest@29.4.3", "", { "dependencies": { "@jest/transform": "^29.4.3", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.4.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw=="], + + "babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], + + "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@29.4.3", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q=="], + + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.0.1", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ=="], + + "babel-preset-jest": ["babel-preset-jest@29.4.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.4.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.2", "", { "dependencies": { "fill-range": "^7.0.1" } }, "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="], + + "browserslist": ["browserslist@4.21.5", "", { "dependencies": { "caniuse-lite": "^1.0.30001449", "electron-to-chromium": "^1.4.284", "node-releases": "^2.0.8", "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" } }, "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w=="], + + "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001456", "", {}, "sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA=="], + + "chai": ["chai@4.3.7", "", { "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" } }, "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], + + "check-error": ["check-error@1.0.2", "", {}, "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA=="], + + "ci-info": ["ci-info@3.8.0", "", {}, "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw=="], + + "cjs-module-lexer": ["cjs-module-lexer@1.2.2", "", {}, "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="], + + "collect-v8-coverage": ["collect-v8-coverage@1.0.1", "", {}, "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], + + "debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], + + "dedent": ["dedent@0.7.0", "", {}, "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA=="], + + "deep-eql": ["deep-eql@4.1.3", "", { "dependencies": { "type-detect": "^4.0.0" } }, "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw=="], + + "deepmerge": ["deepmerge@4.3.0", "", {}, "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og=="], + + "detect-newline": ["detect-newline@3.1.0", "", {}, "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="], + + "diff-sequences": ["diff-sequences@29.4.3", "", {}, "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA=="], + + "electron-to-chromium": ["electron-to-chromium@1.4.302", "", {}, "sha512-Uk7C+7aPBryUR1Fwvk9VmipBcN9fVsqBO57jV2ZjTm+IZ6BMNqu7EDVEg2HxCNufk6QcWlFsBkhQyQroB2VWKw=="], + + "emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "esbuild": ["esbuild@0.16.17", "", { "dependencies": { "@esbuild/android-arm": "0.16.17", "@esbuild/android-arm64": "0.16.17", "@esbuild/android-x64": "0.16.17", "@esbuild/darwin-arm64": "0.16.17", "@esbuild/darwin-x64": "0.16.17", "@esbuild/freebsd-arm64": "0.16.17", "@esbuild/freebsd-x64": "0.16.17", "@esbuild/linux-arm": "0.16.17", "@esbuild/linux-arm64": "0.16.17", "@esbuild/linux-ia32": "0.16.17", "@esbuild/linux-loong64": "0.16.17", "@esbuild/linux-mips64el": "0.16.17", "@esbuild/linux-ppc64": "0.16.17", "@esbuild/linux-riscv64": "0.16.17", "@esbuild/linux-s390x": "0.16.17", "@esbuild/linux-x64": "0.16.17", "@esbuild/netbsd-x64": "0.16.17", "@esbuild/openbsd-x64": "0.16.17", "@esbuild/sunos-x64": "0.16.17", "@esbuild/win32-arm64": "0.16.17", "@esbuild/win32-ia32": "0.16.17", "@esbuild/win32-x64": "0.16.17" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg=="], + + "escalade": ["escalade@3.1.1", "", {}, "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="], + + "escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "exit": ["exit@0.1.2", "", {}, "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ=="], + + "expect": ["expect@29.4.3", "", { "dependencies": { "@jest/expect-utils": "^29.4.3", "jest-get-type": "^29.4.3", "jest-matcher-utils": "^29.4.3", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3" } }, "sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], + + "fill-range": ["fill-range@7.0.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="], + + "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], + + "function-bind": ["function-bind@1.1.1", "", {}, "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-func-name": ["get-func-name@2.0.0", "", {}, "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig=="], + + "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], + + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], + + "has": ["has@1.0.3", "", { "dependencies": { "function-bind": "^1.1.1" } }, "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + + "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], + + "import-local": ["import-local@3.1.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-core-module": ["is-core-module@2.11.0", "", { "dependencies": { "has": "^1.0.3" } }, "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-fn": ["is-generator-fn@2.1.0", "", {}, "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.0", "", {}, "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw=="], + + "istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], + + "istanbul-lib-report": ["istanbul-lib-report@3.0.0", "", { "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" } }, "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw=="], + + "istanbul-lib-source-maps": ["istanbul-lib-source-maps@4.0.1", "", { "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" } }, "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw=="], + + "istanbul-reports": ["istanbul-reports@3.1.5", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w=="], + + "jest": ["jest@29.4.3", "", { "dependencies": { "@jest/core": "^29.4.3", "@jest/types": "^29.4.3", "import-local": "^3.0.2", "jest-cli": "^29.4.3" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA=="], + + "jest-changed-files": ["jest-changed-files@29.4.3", "", { "dependencies": { "execa": "^5.0.0", "p-limit": "^3.1.0" } }, "sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ=="], + + "jest-circus": ["jest-circus@29.4.3", "", { "dependencies": { "@jest/environment": "^29.4.3", "@jest/expect": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.4.3", "jest-matcher-utils": "^29.4.3", "jest-message-util": "^29.4.3", "jest-runtime": "^29.4.3", "jest-snapshot": "^29.4.3", "jest-util": "^29.4.3", "p-limit": "^3.1.0", "pretty-format": "^29.4.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw=="], + + "jest-cli": ["jest-cli@29.4.3", "", { "dependencies": { "@jest/core": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/types": "^29.4.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", "jest-config": "^29.4.3", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "prompts": "^2.0.1", "yargs": "^17.3.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg=="], + + "jest-config": ["jest-config@29.4.3", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.4.3", "@jest/types": "^29.4.3", "babel-jest": "^29.4.3", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-circus": "^29.4.3", "jest-environment-node": "^29.4.3", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-runner": "^29.4.3", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.4.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "peerDependencies": { "@types/node": "*", "ts-node": ">=9.0.0" }, "optionalPeers": ["ts-node"] }, "sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ=="], + + "jest-diff": ["jest-diff@29.4.3", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", "pretty-format": "^29.4.3" } }, "sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA=="], + + "jest-docblock": ["jest-docblock@29.4.3", "", { "dependencies": { "detect-newline": "^3.0.0" } }, "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg=="], + + "jest-each": ["jest-each@29.4.3", "", { "dependencies": { "@jest/types": "^29.4.3", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "jest-util": "^29.4.3", "pretty-format": "^29.4.3" } }, "sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q=="], + + "jest-environment-node": ["jest-environment-node@29.4.3", "", { "dependencies": { "@jest/environment": "^29.4.3", "@jest/fake-timers": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "jest-mock": "^29.4.3", "jest-util": "^29.4.3" } }, "sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg=="], + + "jest-get-type": ["jest-get-type@29.4.3", "", {}, "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg=="], + + "jest-haste-map": ["jest-haste-map@29.4.3", "", { "dependencies": { "@jest/types": "^29.4.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ=="], + + "jest-leak-detector": ["jest-leak-detector@29.4.3", "", { "dependencies": { "jest-get-type": "^29.4.3", "pretty-format": "^29.4.3" } }, "sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA=="], + + "jest-matcher-utils": ["jest-matcher-utils@29.4.3", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.4.3", "jest-get-type": "^29.4.3", "pretty-format": "^29.4.3" } }, "sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg=="], + + "jest-message-util": ["jest-message-util@29.4.3", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.4.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.4.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw=="], + + "jest-mock": ["jest-mock@29.4.3", "", { "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "jest-util": "^29.4.3" } }, "sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg=="], + + "jest-pnp-resolver": ["jest-pnp-resolver@1.2.3", "", { "peerDependencies": { "jest-resolve": "*" } }, "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w=="], + + "jest-regex-util": ["jest-regex-util@29.4.3", "", {}, "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg=="], + + "jest-resolve": ["jest-resolve@29.4.3", "", { "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw=="], + + "jest-resolve-dependencies": ["jest-resolve-dependencies@29.4.3", "", { "dependencies": { "jest-regex-util": "^29.4.3", "jest-snapshot": "^29.4.3" } }, "sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw=="], + + "jest-runner": ["jest-runner@29.4.3", "", { "dependencies": { "@jest/console": "^29.4.3", "@jest/environment": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", "jest-environment-node": "^29.4.3", "jest-haste-map": "^29.4.3", "jest-leak-detector": "^29.4.3", "jest-message-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-runtime": "^29.4.3", "jest-util": "^29.4.3", "jest-watcher": "^29.4.3", "jest-worker": "^29.4.3", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA=="], + + "jest-runtime": ["jest-runtime@29.4.3", "", { "dependencies": { "@jest/environment": "^29.4.3", "@jest/fake-timers": "^29.4.3", "@jest/globals": "^29.4.3", "@jest/source-map": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-message-util": "^29.4.3", "jest-mock": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-snapshot": "^29.4.3", "jest-util": "^29.4.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q=="], + + "jest-snapshot": ["jest-snapshot@29.4.3", "", { "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.3", "@types/babel__traverse": "^7.0.6", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.4.3", "graceful-fs": "^4.2.9", "jest-diff": "^29.4.3", "jest-get-type": "^29.4.3", "jest-haste-map": "^29.4.3", "jest-matcher-utils": "^29.4.3", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3", "natural-compare": "^1.4.0", "pretty-format": "^29.4.3", "semver": "^7.3.5" } }, "sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw=="], + + "jest-util": ["jest-util@29.4.3", "", { "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q=="], + + "jest-validate": ["jest-validate@29.4.3", "", { "dependencies": { "@jest/types": "^29.4.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", "pretty-format": "^29.4.3" } }, "sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw=="], + + "jest-watcher": ["jest-watcher@29.4.3", "", { "dependencies": { "@jest/test-result": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.4.3", "string-length": "^4.0.1" } }, "sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA=="], + + "jest-worker": ["jest-worker@29.4.3", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "jsesc": ["jsesc@2.5.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "local-pkg": ["local-pkg@0.4.3", "", {}, "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g=="], + + "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "loupe": ["loupe@2.3.6", "", { "dependencies": { "get-func-name": "^2.0.0" } }, "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA=="], + + "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], + + "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "micromatch": ["micromatch@4.0.5", "", { "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "nanoid": ["nanoid@3.3.4", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], + + "node-releases": ["node-releases@2.0.10", "", {}, "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "pathval": ["pathval@1.1.1", "", {}, "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ=="], + + "picocolors": ["picocolors@1.0.0", "", {}, "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pirates": ["pirates@4.0.5", "", {}, "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ=="], + + "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + + "postcss": ["postcss@8.4.21", "", { "dependencies": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg=="], + + "pretty-format": ["pretty-format@29.4.3", "", { "dependencies": { "@jest/schemas": "^29.4.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA=="], + + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], + + "react-is": ["react-is@18.2.0", "", {}, "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "resolve": ["resolve@1.22.1", "", { "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw=="], + + "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "resolve.exports": ["resolve.exports@2.0.0", "", {}, "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg=="], + + "rollup": ["rollup@3.17.0", "", { "dependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-0zZQ0J4p0ZtTla6l8sheDTUyNfGZQDpU5h0nPHf6xtUXIzKK70LmB2IRR0wLnzaL8a02fjmsJy+XCncbSwOpjg=="], + + "semver": ["semver@7.3.8", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-js": ["source-map-js@1.0.2", "", {}, "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="], + + "source-map-support": ["source-map-support@0.5.13", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], + + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "strip-literal": ["strip-literal@1.0.1", "", { "dependencies": { "acorn": "^8.8.2" } }, "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "tinybench": ["tinybench@2.3.1", "", {}, "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA=="], + + "tinypool": ["tinypool@0.3.1", "", {}, "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ=="], + + "tinyspy": ["tinyspy@1.1.1", "", {}, "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g=="], + + "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], + + "to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], + + "type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + + "update-browserslist-db": ["update-browserslist-db@1.0.10", "", { "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "browserslist-lint": "cli.js" } }, "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ=="], + + "v8-to-istanbul": ["v8-to-istanbul@9.1.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0" } }, "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA=="], + + "vite": ["vite@4.1.2", "", { "dependencies": { "esbuild": "^0.16.14", "fsevents": "~2.3.2", "postcss": "^8.4.21", "resolve": "^1.22.1", "rollup": "^3.10.0" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", "sass": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["less", "sass", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-MWDb9Rfy3DI8omDQySbMK93nQqStwbsQWejXRY2EBzEWKmLAXWb1mkI9Yw2IJrc+oCvPCI1Os5xSSIBYY6DEAw=="], + + "vitest": ["vitest@0.25.8", "", { "dependencies": { "@types/chai": "^4.3.4", "@types/chai-subset": "^1.3.3", "@types/node": "*", "acorn": "^8.8.1", "acorn-walk": "^8.2.0", "chai": "^4.3.7", "debug": "^4.3.4", "local-pkg": "^0.4.2", "source-map": "^0.6.1", "strip-literal": "^1.0.0", "tinybench": "^2.3.1", "tinypool": "^0.3.0", "tinyspy": "^1.0.2", "vite": "^3.0.0 || ^4.0.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@vitest/browser": "*", "@vitest/ui": "*", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-X75TApG2wZTJn299E/TIYevr4E9/nBo1sUtZzn0Ci5oK8qnpZAZyhwg0qCeMSakGIWtc6oRwcQFyFfW14aOFWg=="], + + "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "write-file-atomic": ["write-file-atomic@4.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yargs": ["yargs@17.7.0", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "@ampproject/remapping/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.1.1", "", { "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w=="], + + "@babel/core/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@babel/core/semver": ["semver@6.3.0", "", { "bin": { "semver": "./bin/semver.js" } }, "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.0", "", { "bin": { "semver": "./bin/semver.js" } }, "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="], + + "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "@types/chai-subset/@types/chai": ["@types/chai@2.0.4", "", {}, "sha512-DNUVOufLw3znPcZaEvjAER3F1KScpGSrp3n8eIE5R7rdjTJE2w4orUiVY3KHBzvGCx0++ZlymkAzjroa76NPRA=="], + + "istanbul-lib-instrument/semver": ["semver@6.3.0", "", { "bin": { "semver": "./bin/semver.js" } }, "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="], + + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "make-dir/semver": ["semver@6.3.0", "", { "bin": { "semver": "./bin/semver.js" } }, "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="], + + "p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "test-exclude/minimatch": ["minimatch@3.0.8", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q=="], + + "v8-to-istanbul/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + } +} diff --git a/bench/expect-to-equal/bun.lockb b/bench/expect-to-equal/bun.lockb deleted file mode 100755 index a56b820270..0000000000 Binary files a/bench/expect-to-equal/bun.lockb and /dev/null differ diff --git a/bench/expect-to-equal/expect-to-equal.test.js b/bench/expect-to-equal/expect-to-equal.test.js index e8361596f5..52a904382f 100644 --- a/bench/expect-to-equal/expect-to-equal.test.js +++ b/bench/expect-to-equal/expect-to-equal.test.js @@ -1,5 +1,5 @@ // bun:test automatically rewrites this import to bun:test when run in bun -import { test, expect } from "@jest/globals"; +import { expect, test } from "@jest/globals"; const N = parseInt(process.env.RUN_COUNT || "10000", 10); if (!Number.isSafeInteger(N)) { diff --git a/bench/expect-to-equal/expect-to-equal.vitest.test.js b/bench/expect-to-equal/expect-to-equal.vitest.test.js index aea945180b..d02b56e3e8 100644 --- a/bench/expect-to-equal/expect-to-equal.vitest.test.js +++ b/bench/expect-to-equal/expect-to-equal.vitest.test.js @@ -1,4 +1,4 @@ -import { test, expect } from "vitest"; +import { expect, test } from "vitest"; const N = parseInt(process.env.RUN_COUNT || "10000", 10); if (!Number.isSafeInteger(N)) { diff --git a/src/cli/gitignore-for-init b/bench/express/.gitignore similarity index 100% rename from src/cli/gitignore-for-init rename to bench/express/.gitignore diff --git a/bench/express/README.md b/bench/express/README.md new file mode 100644 index 0000000000..90e729ed73 --- /dev/null +++ b/bench/express/README.md @@ -0,0 +1,37 @@ +# express benchmark + +This benchmarks a hello world express server. + +To install dependencies: + +```bash +bun install +``` + +To run in Bun: + +```sh +bun ./express.mjs +``` + +To run in Node: + +```sh +node ./express.mjs +``` + +To run in Deno: + +```sh +deno run -A ./express.mjs +``` + +To benchmark each runtime: + +```bash +oha http://localhost:3000 -n 500000 -H "Accept-Encoding: identity" +``` + +We recommend using `oha` or `bombardier` for benchmarking. We do not recommend using `ab`, as it uses HTTP/1.0 which stopped being used by web browsers in the early 2000s. We also do not recommend using autocannon, as the node:http client is not performant enough to measure the throughput of Bun's HTTP server. + +Note the `Accept-Encoding: identity` header exists to prevent Deno's HTTP server from compressing the response. diff --git a/bench/express/bun.lockb b/bench/express/bun.lockb new file mode 100755 index 0000000000..58a43e991f Binary files /dev/null and b/bench/express/bun.lockb differ diff --git a/bench/express/express.mjs b/bench/express/express.mjs new file mode 100644 index 0000000000..b5d1375a40 --- /dev/null +++ b/bench/express/express.mjs @@ -0,0 +1,14 @@ +// See the README.md for more information +import express from "express"; + +const app = express(); +const port = process.env.PORT || 3000; +let i = 0; + +app.get("/", (req, res) => { + res.send("Hello World! (request number: " + i++ + ")"); +}); + +app.listen(port, () => { + console.log(`Express server listening on port ${port}`); +}); diff --git a/bench/express/package.json b/bench/express/package.json new file mode 100644 index 0000000000..1d1467f55f --- /dev/null +++ b/bench/express/package.json @@ -0,0 +1,14 @@ +{ + "name": "express", + "module": "index.ts", + "type": "module", + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "express": "5" + } +} \ No newline at end of file diff --git a/src/cli/tsconfig-for-init.json b/bench/express/tsconfig.json similarity index 100% rename from src/cli/tsconfig-for-init.json rename to bench/express/tsconfig.json diff --git a/bench/fetch/bun.js b/bench/fetch/bun.js index 96e7275a85..1241aa7d4f 100644 --- a/bench/fetch/bun.js +++ b/bench/fetch/bun.js @@ -1,4 +1,4 @@ -import { bench, run } from "mitata"; +import { bench, run } from "../runner.mjs"; const count = 100; diff --git a/bench/fetch/node.mjs b/bench/fetch/node.mjs index 96e7275a85..1241aa7d4f 100644 --- a/bench/fetch/node.mjs +++ b/bench/fetch/node.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "mitata"; +import { bench, run } from "../runner.mjs"; const count = 100; diff --git a/bench/ffi/bun.js b/bench/ffi/bun.js index 6e83702ee0..5ef13e234a 100644 --- a/bench/ffi/bun.js +++ b/bench/ffi/bun.js @@ -1,5 +1,5 @@ -import { ptr, dlopen, CString, toBuffer } from "bun:ffi"; -import { run, bench, group } from "mitata"; +import { CString, dlopen, ptr } from "bun:ffi"; +import { bench, group, run } from "../runner.mjs"; const { napiNoop, napiHash, napiString } = require(import.meta.dir + "/src/ffi_napi_bench.node"); diff --git a/bench/ffi/deno.js b/bench/ffi/deno.js index 63ba6358c8..a1e7ae0ee4 100644 --- a/bench/ffi/deno.js +++ b/bench/ffi/deno.js @@ -1,4 +1,4 @@ -import { run, bench, group } from "../node_modules/mitata/src/cli.mjs"; +import { bench, group, run } from "../runner.mjs"; const extension = "darwin" !== Deno.build.os ? "so" : "dylib"; const path = new URL("src/target/release/libffi_napi_bench." + extension, import.meta.url).pathname; diff --git a/bench/ffi/node.mjs b/bench/ffi/node.mjs index 8c2d069717..c6c9f67c3d 100644 --- a/bench/ffi/node.mjs +++ b/bench/ffi/node.mjs @@ -1,5 +1,5 @@ -import { run, bench, group } from "mitata"; import { createRequire } from "node:module"; +import { bench, group, run } from "../runner.mjs"; const require = createRequire(import.meta.url); const { napiNoop, napiHash, napiString } = require("./src/ffi_napi_bench.node"); diff --git a/bench/ffi/package.json b/bench/ffi/package.json index b7de8e9dd9..3bef4583fd 100644 --- a/bench/ffi/package.json +++ b/bench/ffi/package.json @@ -1,11 +1,11 @@ { "name": "bench", "scripts": { - "bench:bun": "$BUN bun.js", - "bench:node": "$NODE node.mjs", + "bench:bun": "bun bun.js", + "bench:node": "node node.mjs", "deps": "cd src && bun run deps", "build": "cd src && bun run build", - "bench:deno": "$DENO run -A --unstable deno.js", + "bench:deno": "deno run -A --unstable deno.js", "bench": "bun run bench:bun && bun run bench:node && bun run bench:deno" } } diff --git a/bench/ffi/src/bun.lock b/bench/ffi/src/bun.lock new file mode 100644 index 0000000000..c496ad6dba --- /dev/null +++ b/bench/ffi/src/bun.lock @@ -0,0 +1,19 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "bench", + "dependencies": { + "@napi-rs/cli": "^2.10.1", + "@node-rs/helper": "^1.3.3", + }, + }, + }, + "packages": { + "@napi-rs/cli": ["@napi-rs/cli@2.14.8", "", { "bin": { "napi": "scripts/index.js" } }, "sha512-IvA3s8BqohMdUbOkFn7+23u1dhIJZCkA8Xps7DD4SLdCMbcbUF6MUuKiqxuqmVHBFTaxU25sU56WdX3efqGgPw=="], + + "@napi-rs/triples": ["@napi-rs/triples@1.1.0", "", {}, "sha512-XQr74QaLeMiqhStEhLn1im9EOMnkypp7MZOwQhGzqp2Weu5eQJbpPxWxixxlYRKWPOmJjsk6qYfYH9kq43yc2w=="], + + "@node-rs/helper": ["@node-rs/helper@1.3.3", "", { "dependencies": { "@napi-rs/triples": "^1.1.0" } }, "sha512-p4OdfQObGN9YFy5WZaGwlPYICQSe7xZYyXB0sxREmvj1HzGKp5bPg2PlfgfMZEfnjIA882B9ZrnagYzZihIwjA=="], + } +} diff --git a/bench/ffi/src/bun.lockb b/bench/ffi/src/bun.lockb deleted file mode 100755 index 0b1e2969be..0000000000 Binary files a/bench/ffi/src/bun.lockb and /dev/null differ diff --git a/bench/glob/braces.mjs b/bench/glob/braces.mjs index c81aeb9d98..fa67614259 100644 --- a/bench/glob/braces.mjs +++ b/bench/glob/braces.mjs @@ -1,5 +1,5 @@ import braces from "braces"; -import { group, bench, run } from "mitata"; +import { bench, group, run } from "../runner.mjs"; // const iterations = 1000; const iterations = 100; @@ -10,15 +10,16 @@ const veryComplexPattern = "{a,b,HI{c,e,LMAO{d,f}Q}}{1,2,{3,4},5}"; console.log(braces(complexPattern, { expand: true })); function benchPattern(pattern, name) { - group({ name: `${name} pattern: "${pattern}"`, summary: true }, () => { + const _name = `${name} pattern: "${pattern}"`; + group({ name: _name, summary: true }, () => { if (typeof Bun !== "undefined") - bench("Bun", () => { + bench(`Bun (${_name})`, () => { for (let i = 0; i < iterations; i++) { Bun.$.braces(pattern); } }); - bench("micromatch/braces", () => { + bench(`micromatch/braces ${_name}`, () => { for (let i = 0; i < iterations; i++) { braces(pattern, { expand: true }); } diff --git a/bench/glob/match.mjs b/bench/glob/match.mjs index 66150daf25..178edeae8e 100644 --- a/bench/glob/match.mjs +++ b/bench/glob/match.mjs @@ -1,19 +1,27 @@ -import micromatch from "micromatch"; -import { bench, run } from "mitata"; +import { Glob } from "bun"; +import { bench, run } from "../runner.mjs"; -const Glob = typeof Bun !== "undefined" ? Bun.Glob : undefined; -const doMatch = typeof Bun === "undefined" ? micromatch.isMatch : (a, b) => new Glob(b).match(a); -bench((Glob ? "Bun.Glob - " : "micromatch - ") + "**/*.js", () => { - doMatch("foo/bar.js", "**/*.js"); -}); +function benchPattern(name, glob, pattern) { + bench(name, () => { + new Glob(glob).match(pattern); + }) +} + +benchPattern("max-depth" , "1{2,3{4,5{6,7{8,9{a,b{c,d{e,f{g,h{i,j{k,l}}}}}}}}}}m", "13579bdfhjlm"); +benchPattern("non-ascii", "😎/¢£.{ts,tsx,js,jsx}", "😎/¢£.jsx"); +benchPattern("utf8", "フォルダ/**/*", "フォルダ/aaa.js"); +benchPattern("non-ascii+max-depth" , "1{2,3{4,5{6,7{8,😎{a,b{c,d{e,f{g,h{i,j{k,l}}}}}}}}}}m", "1357😎bdfhjlm"); +benchPattern("pretty-average", "test/{foo/**,bar}/baz", "test/bar/baz"); +benchPattern("pretty-average-2", "a/**/c/*.md", "a/bb.bb/aa/b.b/aa/c/xyz.md"); +benchPattern("pretty-average-3", "a/b/**/c{d,e}/**/xyz.md", "a/b/cd/xyz.md"); +benchPattern("pretty-average-4", "foo/bar/**/one/**/*.*", "foo/bar/baz/one/two/three/image.png"); +benchPattern("long-pretty-average", "some/**/needle.{js,tsx,mdx,ts,jsx,txt}", "some/a/bigger/path/to/the/crazy/needle.txt"); +benchPattern("brackets-lots", "f[^eiu][^eiu][^eiu][^eiu][^eiu]r", "foo-bar"); -bench((Glob ? "Bun.Glob - " : "micromatch - ") + "*.js", () => { - doMatch("bar.js", "*.js"); -}); await run({ - avg: true, - min_max: true, - percentiles: true, -}); + min_max: true, + percentiles: true, + avg: true, +}) diff --git a/bench/glob/micromatch.mjs b/bench/glob/micromatch.mjs new file mode 100644 index 0000000000..c81a972c41 --- /dev/null +++ b/bench/glob/micromatch.mjs @@ -0,0 +1,19 @@ +import micromatch from "micromatch"; +import { bench, run } from "../runner.mjs"; + +const Glob = typeof Bun !== "undefined" ? Bun.Glob : undefined; +const doMatch = typeof Bun === "undefined" ? micromatch.isMatch : (a, b) => new Glob(b).match(a); + +bench((Glob ? "Bun.Glob - " : "micromatch - ") + "**/*.js", () => { + doMatch("foo/bar.js", "**/*.js"); +}); + +bench((Glob ? "Bun.Glob - " : "micromatch - ") + "*.js", () => { + doMatch("bar.js", "*.js"); +}); + +await run({ + avg: true, + min_max: true, + percentiles: true, +}); diff --git a/bench/glob/scan.mjs b/bench/glob/scan.mjs index 0d500af668..b5292eba1e 100644 --- a/bench/glob/scan.mjs +++ b/bench/glob/scan.mjs @@ -1,6 +1,6 @@ -import { run, bench, group } from "mitata"; import fg from "fast-glob"; import { fdir } from "fdir"; +import { bench, group, run } from "../runner.mjs"; const normalPattern = "*.ts"; const recursivePattern = "**/*.ts"; diff --git a/bench/grpc-server/benchmark.proto b/bench/grpc-server/benchmark.proto new file mode 100644 index 0000000000..cdbbd32400 --- /dev/null +++ b/bench/grpc-server/benchmark.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; +package benchmark; + +service BenchmarkService { + rpc Ping(Request) returns (Response); +} + +message Request { + string message = 1; +} + +message Response { + string message = 1; +} \ No newline at end of file diff --git a/bench/grpc-server/cert.pem b/bench/grpc-server/cert.pem new file mode 100644 index 0000000000..df1f536127 --- /dev/null +++ b/bench/grpc-server/cert.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFxjCCA66gAwIBAgIUUaQCzOcxcFBP0KwoQfNqD/FoI44wDQYJKoZIhvcNAQEL +BQAwYjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1TYW4gRnJh +bmNpc2NvMQwwCgYDVQQKDANCdW4xDDAKBgNVBAsMA0J1bjESMBAGA1UEAwwJbG9j +YWxob3N0MB4XDTI0MTAxNjAwMDExNloXDTM0MTAxNDAwMDExNlowYjELMAkGA1UE +BhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1TYW4gRnJhbmNpc2NvMQwwCgYD +VQQKDANCdW4xDDAKBgNVBAsMA0J1bjESMBAGA1UEAwwJbG9jYWxob3N0MIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp2s1CWRRV3bkjUxyBefcRCiZj8v6 +LIIWOb/kFJOo1PQsmQtOOWfY/kNEATPhLtEVolMzsQtaKV+u/Jnp6vU6cCU0qfQ/ +cha/s0XaSn9zkJSXjmNOPDOXoeJ5wmSUvWETRvDgeYXCg84zTwRnD1pXIsKxHtia +SYkTC29skSn0+63GW2Ebzkbn3jcYbk3gfkRO/qw8EDh/4/TcS2SjoHl96E1QcfBX +InXrPGoHQhuqJV60rmmkVws0lTIZIq0g2p7iFDCg5TG1asakX7+CrEM/q+oyo3e8 +RwMfc+9pqFEqyvXGIQSulS+CVKKbpAFMg07UGYe1t0s5iCwfLQ9apaKL31t/3Vkr +uVKgy5FrPLnRXkFXDZ1v+43AZBmdLrKODzsqHEbt2JmV0V6JVUkE4kbeJr/nlkhQ +x6yXloYY3VKbnCb1L3HmMInrK1QSpxlOb8RllTd33oBwd1FKEvH2gza0j9hqq8uQ +hWVN7tlamkgtBteZ8Y9fd3MdxD9iZOx4dVtCX1+sgJFdaL2ZgE0asojn46yT8Uqw +5d0M9vqmWc5AqG7c4UWWRrfB1MfOq/X8GtImmKyhEgizIPdWFeF1cNjhPffJv4yR +Y4Rj33OBTCM+9h8ZSw/fKo55yRXyz3bjrW2Mg8Dtq+6TcRd5gSLCaTN6jX8E9y7G +TobnA9MnKHhSIhsCAwEAAaN0MHIwHQYDVR0OBBYEFEJU6/9ELCp1CAxYJ5FJJxpV +FSRmMB8GA1UdIwQYMBaAFEJU6/9ELCp1CAxYJ5FJJxpVFSRmMA8GA1UdEwEB/wQF +MAMBAf8wHwYDVR0RBBgwFoIJbG9jYWxob3N0ggkxMjcuMC4wLjEwDQYJKoZIhvcN +AQELBQADggIBACyOPdVwfJg1aUNANy78+cm6eoInM9NDdXGWHMqCJwYF6qJTQV11 +jYwYrl+OWOi3CEC+ogXl+uJX4tSS5d+rBTXEb73cLpogxP+xuxr4cBHhtgpGRpY0 +GqWCFUTexHxXMrYhHQxf3uv79PNauw/dd1Baby1OjF3zSKRzFsv4KId97cAgT/9H +HfUo2ym5jmhNFj5rhUavO3Pw1++1eeDeDAkS6T59buzx0h9760WD20oBdgjt42cb +P6xg9OwV7ALQSwJ8YPEXpkl7u+6jy0j5ceYmXh76tAyA+hDYOJrY0opBjSPmXH99 +p3W63gvk/AdfeAdbFHp6en0b04x4EIogOGZxBP35rzBvsQpqavBE3PBpUIyrQs5p +OBUncRrcjEDL6WKh6RJIjZnvpHPrEqOqyxaeWRc4+85ZrVArJHGMc8I+zs9uCFjo +Cjfde3d317kCszUTxo0l3azyBpr007PMIUoBF2VJEAyQp2Tz/yu0CbEscNJO/wCn +Sb1A6ojaQcgQe2hsaJz/mS+OOjHHaDbCp9iltP2CS63PYleEx4q1Bn8KVRy2zYTB +n74y4YaD8Q+hSA6zU741pzqK2SFCpBQnSz757ocr6WspQ47iOonX2giGZS/3KVeK +qNzU14+h0b8HaBqZmOvjF+S4G0HDpRwxPzDWgc7dEIWlzHH+ZCqjBFwL +-----END CERTIFICATE----- diff --git a/bench/grpc-server/index.js b/bench/grpc-server/index.js new file mode 100644 index 0000000000..07edf3a4d6 --- /dev/null +++ b/bench/grpc-server/index.js @@ -0,0 +1,31 @@ +const grpc = require("@grpc/grpc-js"); +const protoLoader = require("@grpc/proto-loader"); +const packageDefinition = protoLoader.loadSync("benchmark.proto", {}); +const proto = grpc.loadPackageDefinition(packageDefinition).benchmark; +const fs = require("fs"); + +function ping(call, callback) { + callback(null, { message: "Hello, World" }); +} + +function main() { + const server = new grpc.Server(); + server.addService(proto.BenchmarkService.service, { ping: ping }); + const tls = !!process.env.TLS && (process.env.TLS === "1" || process.env.TLS === "true"); + const port = process.env.PORT || 50051; + const host = process.env.HOST || "localhost"; + let credentials; + if (tls) { + const ca = fs.readFileSync("./cert.pem"); + const key = fs.readFileSync("./key.pem"); + const cert = fs.readFileSync("./cert.pem"); + credentials = grpc.ServerCredentials.createSsl(ca, [{ private_key: key, cert_chain: cert }]); + } else { + credentials = grpc.ServerCredentials.createInsecure(); + } + server.bindAsync(`${host}:${port}`, credentials, () => { + console.log(`Server running at ${tls ? "https" : "http"}://${host}:${port}`); + }); +} + +main(); diff --git a/bench/grpc-server/key.pem b/bench/grpc-server/key.pem new file mode 100644 index 0000000000..fb87dccfd2 --- /dev/null +++ b/bench/grpc-server/key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCnazUJZFFXduSN +THIF59xEKJmPy/osghY5v+QUk6jU9CyZC045Z9j+Q0QBM+Eu0RWiUzOxC1opX678 +menq9TpwJTSp9D9yFr+zRdpKf3OQlJeOY048M5eh4nnCZJS9YRNG8OB5hcKDzjNP +BGcPWlciwrEe2JpJiRMLb2yRKfT7rcZbYRvORufeNxhuTeB+RE7+rDwQOH/j9NxL +ZKOgeX3oTVBx8Fcides8agdCG6olXrSuaaRXCzSVMhkirSDanuIUMKDlMbVqxqRf +v4KsQz+r6jKjd7xHAx9z72moUSrK9cYhBK6VL4JUopukAUyDTtQZh7W3SzmILB8t +D1qloovfW3/dWSu5UqDLkWs8udFeQVcNnW/7jcBkGZ0uso4POyocRu3YmZXRXolV +SQTiRt4mv+eWSFDHrJeWhhjdUpucJvUvceYwiesrVBKnGU5vxGWVN3fegHB3UUoS +8faDNrSP2Gqry5CFZU3u2VqaSC0G15nxj193cx3EP2Jk7Hh1W0JfX6yAkV1ovZmA +TRqyiOfjrJPxSrDl3Qz2+qZZzkCobtzhRZZGt8HUx86r9fwa0iaYrKESCLMg91YV +4XVw2OE998m/jJFjhGPfc4FMIz72HxlLD98qjnnJFfLPduOtbYyDwO2r7pNxF3mB +IsJpM3qNfwT3LsZOhucD0ycoeFIiGwIDAQABAoICAE+YYrDCZwHEXsjmzVcNcuVc +wBVjjt9WQabXGmLGCQClzgY9H8WfH8VSyaQgvDB762MvV2YW1ZjSCunBazrvuAbV +SYJ7wyZEtoNO9IdyrMjSPHPPtsRcavzmJalMFIMtAfM6Vh6wf1gW0sIAf9cGxmKa +WYcmx8OqTcmkAePKJNT7O1D6jDO39kjpvM3EbLTbWQsva6bylasVIR8fC8QhvsCQ +8WwaLfMOSPaCGk1Nxcjai+BYDW/sveUo2lZoJTSLUUT0EaqlxXCsXD3BWSj5F+5t +/AFHzdWdIHkIHB2P6V5xFu9fwHjhC3+dh42jqHLNKX2xza0FMKcTAwdzQ094RjL3 +cOGIsa0Vdt7Mks5eLCRxz0xI3kyrbF0/CopxT0pVWZwUzPk1G+Z3HesWkVtQpg7u +RYzsoNKKc5mhc/V+vG290WAcNB4E3m85DgKQr4ib+J/rCy5/SnJYgg4QXsEyNlQ5 +ESBtRmuPfnrPIxqrDKZ7ZsJv8XFWydXTOfJxeKR1T1S02iYna+z1FnNu+t0ELTr9 +uhmkuqmV8RJVTub1P2EJPdiku/61UwNLyyZMgFjATDxB0hHIj1FP1HbfhEYbkYNc +Dl7a7egJ4KFYWpQ+7MzOmc0OKq1HuJ9H4FhoYpbVq1OQosZ6G3d9afKSZa6dFdK0 +8ujvdQBR0NlAhc/LAr6BAoIBAQDfD3h9P4i5L8NCdocovCi3Eo0kcNQ3QuvnWrrs +B/9CLoWhJrcLV85d0dEX6lSYl9BWW02ilVB+Qvom2wS2td1CBUgDxovX4tCZCuXt +otYL/yWWOA7IG0Fjt6YEERQD/tRfKnn8hVBlk5cDTXXxHRGVMku4CHsN3ILtITQS +VnVsTrGoWd6mFFA9X9Qu4zR9wKtjGEuL7BT8ixxtXLa2tMjdc4UL140yAgmMemJS +TzC6EURe2OnhIzVe9yyLKcqw0prkGHg/Lau5lA1CAh67ZMY4EjO3cuda8R+O7vyO +z2afeaTORzzdEbSZPG+8oqIN1/RjRCbl3RXYN8ibSwOzp6X7AoIBAQDAJEVta98J +P2/36rXrkl6WrRfYqUPy6vgo/lPuRpp+BQ7ldgmH4+ZrJW5Mxa5hktVujk/C2kAO +auzhzNlsxR+c/KwtsL1JXwBn8CT1bR0qvi+URmvGQn9GOKrLLy+6cfphuZWuc4/r +hAgXzEjzPcJJJfxA1i2soKPbiFiCGHxot68P4uJSM2sU6QjNIxEjPbTJjEg894pD +GJoiRRVHgnzzxL3cqrK90Zn6MAl9f2tYihfddsENeZb5t84LBppxBSGouE3ZH8uD +Sufs4DSj1ptocbDbX+0kRNqfjTI5ivDxlS+ZKBe05PVTUmGBAWLamfCe89IW3/z+ +Rfkh4ZBPtlphAoIBADwjSqPR7kWnN+iCVjxIRl3dNYpelQh1FW7hikW6fjpUmphw +/KalPLEUsV/WQIqHW5b8tLihsvrnidPR9rpf29BB5kGGVQuWThEE3CquXTEM0BBo ++qs+lemRiMPN6uyM1qr1o7/OHXfVS8CLMMIZyTTFQ57RQoPhMLdH3WcYQj46FTHD +UQDLtzpkzKr7fJpuyIZF9ZA6zQmtY7OkbGpj4Ue7LmKb8ahK3lIuaLWyPfvcTeeY +aa3WNTxuPWcjlE8J6NKYOksmQAcfgFeMhMaXC83wMltCMlfVbGG30wWZqxxRynoG +wMUFUgCCR8m+uxwqXewpYqdUbOBHYeFkXxIfn+MCggEAR5p8wQ1NHd4lNOekCfkP +BOnWlChoKRPFjUlSL97h3gq2hW6amKimitF1LGkS1kvo+/1O3heFfZn9UxyK/kzr +vg4vgAt4Tup3dUR6EXgrQW2Ev6YKreTEF4Awre2UxM+K9nY5wLxSKvuWJIA9w2AF +kkr0mZj3hniK99n02e6UFlY1iB8OJoIA6tb5L7FcxpxNTjrYBNhfDygQ8Kp8Bp0r +QZDVDHIUkEaXMjRKpRkiAOndgOurgAEK8V69C0DXtzypUX31jO+bYP8+NPlMxK3K +Vn7f4LD75+M88e6lg+oyZmUpStM1GnWksvtlWLUSiNKLaEEGzv2EA6JB+I1dwUb8 +oQKCAQEAlmisUyn1/lpNnEzKsfUnRs53WxS2e1br5vJ5+pet3cjXT2btfp6J5/mf +Tfqv5mZfTjYxydG0Kl3afI/SnhTcRS2/s4svrktZYLOLM2PAGYdCV6j1stXl4ObO +eIfjzB3y1Zc2dEcWTylJ/lABoNGMPWFJQ67q8WS37pUHQPseJ++LmZFvlRyBgZBl +VLqiHHiZ2ax+yC1ZxY4RECtEiYFplspNldNe+bP/lzTJftsUDe1FqRT/SvEam+1f +kb//sbHkJ+l4BEv0Us3SIGwJ0BblhxLYO34IFVpheY4UQBy/nRaeUUdVR9r8JtYD +z/cCLOrUJfealezimyd8SKPWPeHhrA== +-----END PRIVATE KEY----- diff --git a/bench/grpc-server/package.json b/bench/grpc-server/package.json new file mode 100644 index 0000000000..191a6ad719 --- /dev/null +++ b/bench/grpc-server/package.json @@ -0,0 +1,15 @@ +{ + "name": "bench", + "scripts": { + "deps": "exit 0", + "build": "exit 0", + "bun:server": "TLS=1 PORT=50051 bun ./index.js", + "node:server": "TLS=1 PORT=50051 node ./index.js", + "bench": "ghz --cacert ./cert.pem --proto ./benchmark.proto --call benchmark.BenchmarkService.Ping -d '{\"message\": \"Hello\"}' --total=100000 localhost:50051", + "bench:insecure": "ghz --insecure --proto ./benchmark.proto --call benchmark.BenchmarkService.Ping -d '{\"message\": \"Hello\"}' --total=100000 localhost:50051" + }, + "dependencies": { + "@grpc/grpc-js": "1.12.0", + "@grpc/proto-loader": "0.7.10" + } +} diff --git a/bench/gzip/bun.js b/bench/gzip/bun.js index 6b69ae1fbb..6b7b66cb66 100644 --- a/bench/gzip/bun.js +++ b/bench/gzip/bun.js @@ -1,5 +1,5 @@ -import { run, bench, group } from "mitata"; -import { gzipSync, gunzipSync } from "bun"; +import { gunzipSync, gzipSync } from "bun"; +import { bench, group, run } from "../runner.mjs"; const data = await Bun.file(require.resolve("@babel/standalone/babel.min.js")).arrayBuffer(); diff --git a/bench/gzip/bun.lock b/bench/gzip/bun.lock new file mode 100644 index 0000000000..6b706c3f4c --- /dev/null +++ b/bench/gzip/bun.lock @@ -0,0 +1,14 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "bench", + "dependencies": { + "@babel/standalone": "7.24.10", + }, + }, + }, + "packages": { + "@babel/standalone": ["@babel/standalone@7.24.10", "", {}, "sha512-nGC37EKfmelpyCXto1pw6SBkD5ZQRdMbL6WISi28xWit9dtiy9dChU1WgEfzturUTxrmOGkMDRrCydFMA7uOaQ=="], + } +} diff --git a/bench/gzip/bun.lockb b/bench/gzip/bun.lockb deleted file mode 100755 index 96feac4287..0000000000 Binary files a/bench/gzip/bun.lockb and /dev/null differ diff --git a/bench/gzip/deno.js b/bench/gzip/deno.js index 66c858e55b..fa425e917a 100644 --- a/bench/gzip/deno.js +++ b/bench/gzip/deno.js @@ -1,4 +1,4 @@ -import { run, bench } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; const data = new TextEncoder().encode("Hello World!".repeat(9999)); diff --git a/bench/gzip/node.mjs b/bench/gzip/node.mjs index d7a1abade7..f4c867ce58 100644 --- a/bench/gzip/node.mjs +++ b/bench/gzip/node.mjs @@ -1,7 +1,7 @@ -import { run, bench } from "mitata"; -import { gzipSync, gunzipSync } from "zlib"; -import { createRequire } from "module"; import { readFileSync } from "fs"; +import { createRequire } from "module"; +import { gunzipSync, gzipSync } from "zlib"; +import { bench, run } from "../runner.mjs"; const require = createRequire(import.meta.url); const data = readFileSync(require.resolve("@babel/standalone/babel.min.js")); diff --git a/bench/gzip/package.json b/bench/gzip/package.json index 49e6c3a890..a6a6cd4652 100644 --- a/bench/gzip/package.json +++ b/bench/gzip/package.json @@ -3,9 +3,9 @@ "scripts": { "deps": "exit 0", "build": "exit 0", - "bench:bun": "$BUN bun.js", - "bench:node": "$NODE node.mjs", - "bench:deno": "$DENO run -A --unstable deno.js", + "bench:bun": "bun bun.js", + "bench:node": "node node.mjs", + "bench:deno": "deno run -A --unstable deno.js", "bench": "bun run bench:bun && bun run bench:node && bun run bench:deno" }, "dependencies": { diff --git a/bench/hot-module-reloading/css-stress-test/bun.lock b/bench/hot-module-reloading/css-stress-test/bun.lock new file mode 100644 index 0000000000..50d59bdb5c --- /dev/null +++ b/bench/hot-module-reloading/css-stress-test/bun.lock @@ -0,0 +1,2434 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "simple-react", + "dependencies": { + "@emotion/core": "latest", + "@emotion/css": "latest", + "@emotion/react": "latest", + "@vitejs/plugin-react-refresh": "^1.3.3", + "antd": "^4.16.1", + "bun-framework-next": "latest", + "left-pad": "^1.3.0", + "next": "^12", + "parcel": "2.0.0-beta.3", + "path-browserify": "^1.0.1", + "percentile": "^1.5.0", + "puppeteer": "^10.4.0", + "puppeteer-video-recorder": "^1.0.5", + "react": "^17.0.2", + "react-bootstrap": "^1.6.1", + "react-dom": "^17.0.2", + "react-form": "^4.0.1", + "react-hook-form": "^7.8.3", + "url": "^0.11.0", + "wipwipwipwip-next-donotuse": "4.0.0", + }, + "devDependencies": { + "@microsoft/fetch-event-source": "^2.0.1", + "@snowpack/plugin-react-refresh": "^2.5.0", + "typescript": "^4.3.4", + }, + }, + }, + "packages": { + "@ampproject/remapping": ["@ampproject/remapping@2.2.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w=="], + + "@ant-design/colors": ["@ant-design/colors@6.0.0", "", { "dependencies": { "@ctrl/tinycolor": "^3.4.0" } }, "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ=="], + + "@ant-design/icons": ["@ant-design/icons@4.8.0", "", { "dependencies": { "@ant-design/colors": "^6.0.0", "@ant-design/icons-svg": "^4.2.1", "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", "rc-util": "^5.9.4" }, "peerDependencies": { "react": ">=16.0.0", "react-dom": ">=16.0.0" } }, "sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg=="], + + "@ant-design/icons-svg": ["@ant-design/icons-svg@4.2.1", "", {}, "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw=="], + + "@ant-design/react-slick": ["@ant-design/react-slick@0.29.2", "", { "dependencies": { "@babel/runtime": "^7.10.4", "classnames": "^2.2.5", "json2mq": "^0.2.0", "lodash": "^4.17.21", "resize-observer-polyfill": "^1.5.1" }, "peerDependencies": { "react": ">=16.9.0" } }, "sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA=="], + + "@babel/code-frame": ["@babel/code-frame@7.18.6", "", { "dependencies": { "@babel/highlight": "^7.18.6" } }, "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q=="], + + "@babel/compat-data": ["@babel/compat-data@7.20.14", "", {}, "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw=="], + + "@babel/core": ["@babel/core@7.20.12", "", { "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-module-transforms": "^7.20.11", "@babel/helpers": "^7.20.7", "@babel/parser": "^7.20.7", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.12", "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", "semver": "^6.3.0" } }, "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg=="], + + "@babel/generator": ["@babel/generator@7.20.14", "", { "dependencies": { "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" } }, "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.20.7", "", { "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ=="], + + "@babel/helper-environment-visitor": ["@babel/helper-environment-visitor@7.18.9", "", {}, "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg=="], + + "@babel/helper-function-name": ["@babel/helper-function-name@7.19.0", "", { "dependencies": { "@babel/template": "^7.18.10", "@babel/types": "^7.19.0" } }, "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w=="], + + "@babel/helper-hoist-variables": ["@babel/helper-hoist-variables@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.20.11", "", { "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.10", "@babel/types": "^7.20.7" } }, "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.20.2", "", {}, "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ=="], + + "@babel/helper-simple-access": ["@babel/helper-simple-access@7.20.2", "", { "dependencies": { "@babel/types": "^7.20.2" } }, "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA=="], + + "@babel/helper-split-export-declaration": ["@babel/helper-split-export-declaration@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.19.4", "", {}, "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.19.1", "", {}, "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.18.6", "", {}, "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw=="], + + "@babel/helpers": ["@babel/helpers@7.20.13", "", { "dependencies": { "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.13", "@babel/types": "^7.20.7" } }, "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg=="], + + "@babel/highlight": ["@babel/highlight@7.18.6", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g=="], + + "@babel/parser": ["@babel/parser@7.20.15", "", { "bin": "./bin/babel-parser.js" }, "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg=="], + + "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], + + "@babel/plugin-syntax-flow": ["@babel/plugin-syntax-flow@7.18.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A=="], + + "@babel/plugin-transform-flow-strip-types": ["@babel/plugin-transform-flow-strip-types@7.19.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.19.0", "@babel/plugin-syntax-flow": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.18.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.19.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.19.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ=="], + + "@babel/runtime": ["@babel/runtime@7.20.13", "", { "dependencies": { "regenerator-runtime": "^0.13.11" } }, "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA=="], + + "@babel/template": ["@babel/template@7.20.7", "", { "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7" } }, "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw=="], + + "@babel/traverse": ["@babel/traverse@7.20.13", "", { "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/parser": "^7.20.13", "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" } }, "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ=="], + + "@babel/types": ["@babel/types@7.20.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg=="], + + "@ctrl/tinycolor": ["@ctrl/tinycolor@3.6.0", "", {}, "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ=="], + + "@emotion/babel-plugin": ["@emotion/babel-plugin@11.10.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.0", "@emotion/memoize": "^0.8.0", "@emotion/serialize": "^1.1.1", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", "stylis": "4.1.3" } }, "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ=="], + + "@emotion/cache": ["@emotion/cache@11.10.5", "", { "dependencies": { "@emotion/memoize": "^0.8.0", "@emotion/sheet": "^1.2.1", "@emotion/utils": "^1.2.0", "@emotion/weak-memoize": "^0.3.0", "stylis": "4.1.3" } }, "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA=="], + + "@emotion/core": ["@emotion/core@11.0.0", "", {}, "sha512-w4sE3AmHmyG6RDKf6mIbtHpgJUSJ2uGvPQb8VXFL7hFjMPibE8IiehG8cMX3Ztm4svfCQV6KqusQbeIOkurBcA=="], + + "@emotion/css": ["@emotion/css@11.10.6", "", { "dependencies": { "@emotion/babel-plugin": "^11.10.6", "@emotion/cache": "^11.10.5", "@emotion/serialize": "^1.1.1", "@emotion/sheet": "^1.2.1", "@emotion/utils": "^1.2.0" } }, "sha512-88Sr+3heKAKpj9PCqq5A1hAmAkoSIvwEq1O2TwDij7fUtsJpdkV4jMTISSTouFeRvsGvXIpuSuDQ4C1YdfNGXw=="], + + "@emotion/hash": ["@emotion/hash@0.9.0", "", {}, "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ=="], + + "@emotion/memoize": ["@emotion/memoize@0.8.0", "", {}, "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA=="], + + "@emotion/react": ["@emotion/react@11.10.6", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.10.6", "@emotion/cache": "^11.10.5", "@emotion/serialize": "^1.1.1", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", "@emotion/utils": "^1.2.0", "@emotion/weak-memoize": "^0.3.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw=="], + + "@emotion/serialize": ["@emotion/serialize@1.1.1", "", { "dependencies": { "@emotion/hash": "^0.9.0", "@emotion/memoize": "^0.8.0", "@emotion/unitless": "^0.8.0", "@emotion/utils": "^1.2.0", "csstype": "^3.0.2" } }, "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA=="], + + "@emotion/sheet": ["@emotion/sheet@1.2.1", "", {}, "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA=="], + + "@emotion/unitless": ["@emotion/unitless@0.8.0", "", {}, "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw=="], + + "@emotion/use-insertion-effect-with-fallbacks": ["@emotion/use-insertion-effect-with-fallbacks@1.0.0", "", { "peerDependencies": { "react": ">=16.8.0" } }, "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A=="], + + "@emotion/utils": ["@emotion/utils@1.2.0", "", {}, "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw=="], + + "@emotion/weak-memoize": ["@emotion/weak-memoize@0.3.0", "", {}, "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg=="], + + "@iarna/toml": ["@iarna/toml@2.2.5", "", {}, "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.1.1", "", { "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.0", "", {}, "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.1.2", "", {}, "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.2", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.14", "", {}, "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.17", "", { "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g=="], + + "@microsoft/fetch-event-source": ["@microsoft/fetch-event-source@2.0.1", "", {}, "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA=="], + + "@next/env": ["@next/env@12.3.4", "", {}, "sha512-H/69Lc5Q02dq3o+dxxy5O/oNxFsZpdL6WREtOOtOM1B/weonIwDXkekr1KV5DPVPr12IHFPrMrcJQ6bgPMfn7A=="], + + "@next/swc-android-arm-eabi": ["@next/swc-android-arm-eabi@12.3.4", "", { "os": "android", "cpu": "arm" }, "sha512-cM42Cw6V4Bz/2+j/xIzO8nK/Q3Ly+VSlZJTa1vHzsocJRYz8KT6MrreXaci2++SIZCF1rVRCDgAg5PpqRibdIA=="], + + "@next/swc-android-arm64": ["@next/swc-android-arm64@12.3.4", "", { "os": "android", "cpu": "arm64" }, "sha512-5jf0dTBjL+rabWjGj3eghpLUxCukRhBcEJgwLedewEA/LJk2HyqCvGIwj5rH+iwmq1llCWbOky2dO3pVljrapg=="], + + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@12.3.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DqsSTd3FRjQUR6ao0E1e2OlOcrF5br+uegcEGPVonKYJpcr0MJrtYmPxd4v5T6UCJZ+XzydF7eQo5wdGvSZAyA=="], + + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@12.3.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-PPF7tbWD4k0dJ2EcUSnOsaOJ5rhT3rlEt/3LhZUGiYNL8KvoqczFrETlUx0cUYaXe11dRA3F80Hpt727QIwByQ=="], + + "@next/swc-freebsd-x64": ["@next/swc-freebsd-x64@12.3.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KM9JXRXi/U2PUM928z7l4tnfQ9u8bTco/jb939pdFUHqc28V43Ohd31MmZD1QzEK4aFlMRaIBQOWQZh4D/E5lQ=="], + + "@next/swc-linux-arm-gnueabihf": ["@next/swc-linux-arm-gnueabihf@12.3.4", "", { "os": "linux", "cpu": "arm" }, "sha512-3zqD3pO+z5CZyxtKDTnOJ2XgFFRUBciOox6EWkoZvJfc9zcidNAQxuwonUeNts6Xbm8Wtm5YGIRC0x+12YH7kw=="], + + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@12.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-kiX0vgJGMZVv+oo1QuObaYulXNvdH/IINmvdZnVzMO/jic/B8EEIGlZ8Bgvw8LCjH3zNVPO3mGrdMvnEEPEhKA=="], + + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@12.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-EETZPa1juczrKLWk5okoW2hv7D7WvonU+Cf2CgsSoxgsYbUCZ1voOpL4JZTOb6IbKMDo6ja+SbY0vzXZBUMvkQ=="], + + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@12.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-4csPbRbfZbuWOk3ATyWcvVFdD9/Rsdq5YHKvRuEni68OCLkfy4f+4I9OBpyK1SKJ00Cih16NJbHE+k+ljPPpag=="], + + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@12.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-YeBmI+63Ro75SUiL/QXEVXQ19T++58aI/IINOyhpsRL1LKdyfK/35iilraZEFz9bLQrwy1LYAR5lK200A9Gjbg=="], + + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@12.3.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-Sd0qFUJv8Tj0PukAYbCCDbmXcMkbIuhnTeHm9m4ZGjCf6kt7E/RMs55Pd3R5ePjOkN7dJEuxYBehawTR/aPDSQ=="], + + "@next/swc-win32-ia32-msvc": ["@next/swc-win32-ia32-msvc@12.3.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-rt/vv/vg/ZGGkrkKcuJ0LyliRdbskQU+91bje+PgoYmxTZf/tYs6IfbmgudBJk6gH3QnjHWbkphDdRQrseRefQ=="], + + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@12.3.4", "", { "os": "win32", "cpu": "x64" }, "sha512-DQ20JEfTBZAgF8QCjYfJhv2/279M6onxFjdG/+5B0Cyj00/EdBxiWb2eGGFgQhrBbNv/lsvzFbbi0Ptf8Vw/bg=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@parcel/babel-ast-utils": ["@parcel/babel-ast-utils@2.0.0-beta.3", "", { "dependencies": { "@babel/parser": "^7.0.0", "@parcel/source-map": "2.0.0-rc.1.0", "@parcel/utils": "2.0.0-beta.3", "astring": "^1.6.2" } }, "sha512-C8hXpZsgYP2UjskNmx8a25EScPWKVo06MDKXGPa9a4DoFDNBAO+H5WXAd7IOkdYnAmac7j+Bii1MdcUoH4ipUw=="], + + "@parcel/bundler-default": ["@parcel/bundler-default@2.0.0-beta.3", "", { "dependencies": { "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/plugin": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "nullthrows": "^1.1.1" } }, "sha512-uHD1es4RlKFZPc8fFbiO2g5Lnxt/ccIh9KlsCBjdtxPhioJuKMSdh+CFNx0JJXfQT6rgpNhbNMqqa+eDOVU8yQ=="], + + "@parcel/cache": ["@parcel/cache@2.0.0-beta.3", "", { "dependencies": { "@parcel/logger": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3" }, "peerDependencies": { "@parcel/core": "^2.0.0-alpha.3.1" } }, "sha512-FD5NWBRXeKsuP4jXsWlDOTQriFJzU1flRoYoKPeuUGLKfM9WZ+RV37NOXvIeR6mrAnytXDx1q+fsxlA7/0AlEQ=="], + + "@parcel/codeframe": ["@parcel/codeframe@2.0.0-beta.3", "", { "dependencies": { "chalk": "^4.1.0", "emphasize": "^4.2.0", "slice-ansi": "^4.0.0", "string-width": "^4.2.0" } }, "sha512-IpOnHqnWD9Fcn1suGLwPMvs5wsLaL3M0PHvNKScMZgUelPtgpUPalDyyA2ImgO5Vllon4tTeLLt7246Pvyy5OQ=="], + + "@parcel/config-default": ["@parcel/config-default@2.0.0-beta.3", "", { "dependencies": { "@parcel/bundler-default": "2.0.0-beta.3", "@parcel/namer-default": "2.0.0-beta.3", "@parcel/optimizer-cssnano": "2.0.0-beta.3", "@parcel/optimizer-htmlnano": "2.0.0-beta.3", "@parcel/optimizer-terser": "2.0.0-beta.3", "@parcel/packager-css": "2.0.0-beta.3", "@parcel/packager-html": "2.0.0-beta.3", "@parcel/packager-js": "2.0.0-beta.3", "@parcel/packager-raw": "2.0.0-beta.3", "@parcel/reporter-dev-server": "2.0.0-beta.3", "@parcel/resolver-default": "2.0.0-beta.3", "@parcel/runtime-browser-hmr": "2.0.0-beta.3", "@parcel/runtime-js": "2.0.0-beta.3", "@parcel/runtime-react-refresh": "2.0.0-beta.3", "@parcel/transformer-babel": "2.0.0-beta.3", "@parcel/transformer-css": "2.0.0-beta.3", "@parcel/transformer-html": "2.0.0-beta.3", "@parcel/transformer-js": "2.0.0-beta.3", "@parcel/transformer-json": "2.0.0-beta.3", "@parcel/transformer-postcss": "2.0.0-beta.3", "@parcel/transformer-posthtml": "2.0.0-beta.3", "@parcel/transformer-raw": "2.0.0-beta.3", "@parcel/transformer-react-refresh-wrap": "2.0.0-beta.3" }, "peerDependencies": { "@parcel/core": "^2.0.0-alpha.3.1" } }, "sha512-uVBhKsP2aEG7TX7TtykZ/8n1Fe1VnrPBygPnT6FQoU4to8kWeM3lm0MRNXotJ1WYJr5yLkiugVTzxXqim8lwuw=="], + + "@parcel/core": ["@parcel/core@2.0.0-beta.3", "", { "dependencies": { "@parcel/cache": "2.0.0-beta.3", "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/events": "2.0.0-beta.3", "@parcel/fs": "2.0.0-beta.3", "@parcel/logger": "2.0.0-beta.3", "@parcel/package-manager": "2.0.0-beta.3", "@parcel/plugin": "2.0.0-beta.3", "@parcel/source-map": "2.0.0-rc.1.0", "@parcel/types": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "@parcel/workers": "2.0.0-beta.3", "abortcontroller-polyfill": "^1.1.9", "base-x": "^3.0.8", "browserslist": "^4.6.6", "clone": "^2.1.1", "dotenv": "^7.0.0", "dotenv-expand": "^5.1.0", "json-source-map": "^0.6.1", "json5": "^1.0.1", "micromatch": "^4.0.2", "nullthrows": "^1.1.1", "querystring": "^0.2.0", "semver": "^5.4.1" } }, "sha512-yUtnowQ3YkwgeWngaD0wiTFsW+EGuIqat5Afujvq5Q/XJczxpQFfhqVkHRiz39V0OXvUINaCZieaHlU6HQI6Fw=="], + + "@parcel/diagnostic": ["@parcel/diagnostic@2.0.0-beta.3", "", { "dependencies": { "json-source-map": "^0.6.1", "nullthrows": "^1.1.1" } }, "sha512-g+KYJglJ5fmq/hiP0RKZCfrNzEnH24SqhvPPS9OnVizcyCnWsj8rBK++J5h6iEsHfFCXjspr7J2457y4X9o7aA=="], + + "@parcel/events": ["@parcel/events@2.0.0-beta.3", "", {}, "sha512-UTCjozKoRNa+gFYkjId6t9GoLcQrMkLtD+uS9gVsHYnEgAkWdWn0qdi2CN1Vt/Pl/+gdd4A/vfcyD8f7xIQx4g=="], + + "@parcel/fs": ["@parcel/fs@2.0.0-beta.3", "", { "dependencies": { "@parcel/fs-search": "2.0.0-beta.3", "@parcel/fs-write-stream-atomic": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "@parcel/watcher": "2.0.0-alpha.10", "@parcel/workers": "2.0.0-beta.3", "graceful-fs": "^4.2.4", "mkdirp": "^0.5.1", "ncp": "^2.0.0", "nullthrows": "^1.1.1", "rimraf": "^3.0.2" }, "peerDependencies": { "@parcel/core": "^2.0.0-alpha.3.1" } }, "sha512-76YdRmqkRldr6MdyETrID6Y+0hXraQ4BTFJixewfdTmrDwHN7RHN/IOw8GxtDJ7XDX9skHnvT/NLYnnbs45PKw=="], + + "@parcel/fs-search": ["@parcel/fs-search@2.0.0-beta.3", "", { "dependencies": { "detect-libc": "^1.0.3" } }, "sha512-DId5pEv+vMiMwIT9XhcXR2Cq7Y8nypZCo89vXK8gnqfUsKMKGPuQRbKneS00co8ulflMl4qrprlmjzOQhAPyqQ=="], + + "@parcel/fs-write-stream-atomic": ["@parcel/fs-write-stream-atomic@2.0.0-beta.3", "", { "dependencies": { "graceful-fs": "^4.1.2", "iferr": "^1.0.2", "imurmurhash": "^0.1.4", "readable-stream": "1 || 2" } }, "sha512-gU6N845XLvHtOd93FO9WwW0Ld2NArdaMrH+m1hLztnaxcsGkk7TUE2ObeJyJXPdG+ZvOwFh/viewPXXGDA+byA=="], + + "@parcel/logger": ["@parcel/logger@2.0.0-beta.3", "", { "dependencies": { "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/events": "2.0.0-beta.3" } }, "sha512-6JDsgYjKneXC8dlwgiZqRQ7yo3hnxOan1C3E0XEcpncM6keYLHTSxBYIFxs8xXN33gTq7kZgm7KMraHe91pbnw=="], + + "@parcel/markdown-ansi": ["@parcel/markdown-ansi@2.0.0-beta.3", "", { "dependencies": { "chalk": "^4.1.0" } }, "sha512-j7UsvR145jF+F+p7eVKXkhfwEKKMRMgdZr4HE+6obnHjQZu6J/UHNcSRU8xbLmXyV6qGv7LUdztHrHZGYg19eA=="], + + "@parcel/namer-default": ["@parcel/namer-default@2.0.0-beta.3", "", { "dependencies": { "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/plugin": "2.0.0-beta.3", "nullthrows": "^1.1.1" } }, "sha512-TbldmO5M2kHvBFabVkJjl463qQrAPtszxm0xyZSQ5wtp+IguO4h1I1ms3OrsjZLSFEiZ4DqOMvc6qtW32Qyoxg=="], + + "@parcel/node-libs-browser": ["@parcel/node-libs-browser@2.0.0-beta.3", "", { "dependencies": { "assert": "^2.0.0", "browserify-zlib": "^0.2.0", "buffer": "^5.5.0", "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.12.0", "domain-browser": "^3.5.0", "events": "^3.1.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "^1.0.0", "process": "^0.11.10", "punycode": "^1.4.1", "querystring-es3": "^0.2.1", "readable-stream": "^3.6.0", "stream-http": "^3.1.0", "string_decoder": "^1.3.0", "timers-browserify": "^2.0.11", "tty-browserify": "^0.0.1", "url": "^0.11.0", "util": "^0.12.3", "vm-browserify": "^1.1.2" } }, "sha512-lyhIiZaZ5EPPaFz7WG4P/Sxj6VE0GQoucZV2vPyJXmGxbO7SUgpT2FLuIM7jHeqt89gJv6Hyfu5K1vdF69UHTw=="], + + "@parcel/node-resolver-core": ["@parcel/node-resolver-core@2.0.0-beta.3", "", { "dependencies": { "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/node-libs-browser": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "micromatch": "^3.0.4", "nullthrows": "^1.1.1", "querystring": "^0.2.0" } }, "sha512-iuI8GOfS7vJBLH1boqhcVjgLPmFqZ70a3WkgUSEGzCsVvAx9d907pKnF5CufKVrgi6U+2tjMgfci5dKlneleNw=="], + + "@parcel/optimizer-cssnano": ["@parcel/optimizer-cssnano@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/source-map": "2.0.0-rc.1.0", "cssnano": "^4.1.10", "postcss": "^8.0.5" } }, "sha512-BcEqC+f430Ed3zeAFHY2k6ZZaMtqbOFuPcZ7DPRzdk0C3MDnt/csPuXLz6zx7UAKBizxUr5kuetCIdAE300kIw=="], + + "@parcel/optimizer-htmlnano": ["@parcel/optimizer-htmlnano@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "htmlnano": "^0.2.2", "nullthrows": "^1.1.1", "posthtml": "^0.15.1" } }, "sha512-RJv17A9CYOm9KiebRSokOX54W4d5d83gOE31Tbn1GzmIzFVIRha0a6jrXBK+kxkikk3/jdrzkSI0bBom12pGQw=="], + + "@parcel/optimizer-terser": ["@parcel/optimizer-terser@2.0.0-beta.3", "", { "dependencies": { "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/plugin": "2.0.0-beta.3", "@parcel/source-map": "2.0.0-rc.1.0", "@parcel/utils": "2.0.0-beta.3", "nullthrows": "^1.1.1", "terser": "^5.2.0" } }, "sha512-vq21XlmxbRoa6vscGTyexU6IEYeBnQl8ZYf27fki3L+hRL98qtn1uI0GC0963B+DYpl3YngTAp0o6XSCQj4hrg=="], + + "@parcel/package-manager": ["@parcel/package-manager@2.0.0-beta.3", "", { "dependencies": { "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/fs": "2.0.0-beta.3", "@parcel/logger": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "@parcel/workers": "2.0.0-beta.3", "command-exists": "^1.2.6", "cross-spawn": "^6.0.4", "nullthrows": "^1.1.1", "semver": "^5.4.1", "split2": "^3.1.1" }, "peerDependencies": { "@parcel/core": "^2.0.0-alpha.3.1" } }, "sha512-PsA4kL0JnUXg2EY5C223wR6BhGwFpq8kioerKm33L+JmsbqQruzeMgB/OD5SPx7XVtslB0dWv6yeoOI/nv6l4w=="], + + "@parcel/packager-css": ["@parcel/packager-css@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/source-map": "2.0.0-rc.1.0", "@parcel/utils": "2.0.0-beta.3", "nullthrows": "^1.1.1", "postcss": "^8.2.1" } }, "sha512-UDS0KtjnvenCoCDz/6B37nSO67E/1zOLmLSxVszdxjJWqpsNwIw4wHbBosPAeqc/m456jV+gB34vnorU7AD9vg=="], + + "@parcel/packager-html": ["@parcel/packager-html@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/types": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "nullthrows": "^1.1.1", "posthtml": "^0.15.1" } }, "sha512-Edvn17Gq92V3KGVnPgnKoTP5IwVe0Y3fGMim9reUeXg2ysSYLTnlFZ/Jnbx9O/LxK5cwZuHPRLu7iFQNAUuuNg=="], + + "@parcel/packager-js": ["@parcel/packager-js@2.0.0-beta.3", "", { "dependencies": { "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/plugin": "2.0.0-beta.3", "@parcel/source-map": "2.0.0-rc.1.0", "@parcel/utils": "2.0.0-beta.3", "globals": "^13.2.0", "nullthrows": "^1.1.1" } }, "sha512-zq1rp4JLb31c5nJdbXTw0eXWEoQTqGku1mbeSTt5DImTBqRNWBD5sdR0sNbqbUbC1VH9akvjvVQXgx5nQGRYKw=="], + + "@parcel/packager-raw": ["@parcel/packager-raw@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3" } }, "sha512-oJ+25lW58oBOHctumosHj9jvSn16qOgv5GlOckgLrZuJ5S1xcGGM3qDdbFUGBd0bWGvP8JOlDLCLCf1hFJUA/Q=="], + + "@parcel/plugin": ["@parcel/plugin@2.0.0-beta.3", "", { "dependencies": { "@parcel/types": "2.0.0-beta.3" } }, "sha512-BeJBftoRTgkJP4TfEMIDyvGAT3fW4/D6R14b6rTdn6/M4feAXwLlxGdadTyR5z2JlsaY/JdVr3l0pUInYbFcZw=="], + + "@parcel/reporter-cli": ["@parcel/reporter-cli@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/types": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "chalk": "^4.1.0", "filesize": "^6.1.0", "nullthrows": "^1.1.1", "ora": "^5.2.0", "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "term-size": "^2.2.1" } }, "sha512-PxSkK6feTf1p5ec7hlD2kegCA4EoiAXfyyxf32XGo7HRbto+xKiYLK+e3C52n4znowO1pRdtI0ck+YCQeppS4Q=="], + + "@parcel/reporter-dev-server": ["@parcel/reporter-dev-server@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "connect": "^3.7.0", "ejs": "^2.6.1", "http-proxy-middleware": "^1.0.0", "nullthrows": "^1.1.1", "serve-handler": "^6.0.0", "ws": "^7.0.0" } }, "sha512-tYBYO6fcaqOlyEJV1iPiqBgWM1J8suA7PD8aSsQr0PjHHb81XMKELkDc802YlJMPtdmiwELVAiY2iS6qa8ooFg=="], + + "@parcel/resolver-default": ["@parcel/resolver-default@2.0.0-beta.3", "", { "dependencies": { "@parcel/node-resolver-core": "2.0.0-beta.3", "@parcel/plugin": "2.0.0-beta.3" } }, "sha512-EvqcH/1qJZQoPU80upVYqqJ3U9sxiACz97wFKm1S7gqQRQH1acxOHstRGe/iqgTMFh6KHoydY+QXRiudqJr7nQ=="], + + "@parcel/runtime-browser-hmr": ["@parcel/runtime-browser-hmr@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3" } }, "sha512-T4ZGEd4bcz6zE+mIOxfXb/u/1wVbLOkHPs3ydXWAe7nOQXF+BC4yZXGC0vePJ4HX2X+QNg//cA0owMOshHE83Q=="], + + "@parcel/runtime-js": ["@parcel/runtime-js@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "nullthrows": "^1.1.1" } }, "sha512-JkWlfkO7E76ayksFTdk9Ek633YvBqHoMJ8UwvEJMjUn42v8hLZQUHKAFoUZRYqzjZOub0BVdGwrvbuf1dV90ig=="], + + "@parcel/runtime-react-refresh": ["@parcel/runtime-react-refresh@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "react-refresh": "^0.9.0" } }, "sha512-99VdouRuDM1IekY0b3onCHd9zrkM93Gl9xZgBWwJpdC/jcrvdNxgSb0PwQg19YVfjCn5MM/ou7yybE8xL3aU3A=="], + + "@parcel/source-map": ["@parcel/source-map@2.0.0-rc.1.0", "", { "dependencies": { "detect-libc": "^1.0.3", "globby": "^11.0.3" } }, "sha512-X+1Eef2eVLqGbUSBjP6n2tNnqQv0HyLu6j324hPSqqA8JeHk3X1M5V6FzUe9W2RbCF1Y49VvlXRfC6BqMrZyEw=="], + + "@parcel/transformer-babel": ["@parcel/transformer-babel@2.0.0-beta.3", "", { "dependencies": { "@babel/core": "^7.12.0", "@babel/generator": "^7.9.0", "@babel/helper-compilation-targets": "^7.8.4", "@babel/plugin-transform-flow-strip-types": "^7.0.0", "@babel/traverse": "^7.0.0", "@parcel/babel-ast-utils": "2.0.0-beta.3", "@parcel/plugin": "2.0.0-beta.3", "@parcel/source-map": "2.0.0-rc.1.0", "@parcel/utils": "2.0.0-beta.3", "browserslist": "^4.6.6", "core-js": "^3.2.1", "nullthrows": "^1.1.1", "semver": "^5.7.0" } }, "sha512-yvpQ51ih1G1sgQjkgQuB+pAXnbaJmIbm1iKRGyTwc6Ucmz0PIGmrwRM4NBu3KccOl1/1BthRZTMsKvuuaLZL8w=="], + + "@parcel/transformer-css": ["@parcel/transformer-css@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/source-map": "2.0.0-rc.1.0", "@parcel/utils": "2.0.0-beta.3", "nullthrows": "^1.1.1", "postcss": "^8.2.1", "postcss-value-parser": "^4.1.0", "semver": "^5.4.1" } }, "sha512-1v76u4VuWAQ51HqAuxq+5Tw4spzZAtrUIC0n/CNQt9i15tx9Q61zlhsB2YNYMqJG/shyMTZb9ioNl1t9KD6iaA=="], + + "@parcel/transformer-html": ["@parcel/transformer-html@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "nullthrows": "^1.1.1", "posthtml": "^0.15.1", "posthtml-parser": "^0.6.0", "posthtml-render": "^1.4.0", "semver": "^5.4.1" } }, "sha512-QIH1eTXjG1qKuWak6xw3iU/GK7HOltTO84InJUSLaaUxYbgh1DeXhsKloJmWgdZZx4eZOopf58JUM7OoEcFwtg=="], + + "@parcel/transformer-js": ["@parcel/transformer-js@2.0.0-beta.3", "", { "dependencies": { "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/plugin": "2.0.0-beta.3", "@parcel/source-map": "2.0.0-rc.1.0", "@parcel/utils": "2.0.0-beta.3", "@swc/helpers": "^0.2.11", "browserslist": "^4.6.6", "detect-libc": "^1.0.3", "micromatch": "^4.0.2", "nullthrows": "^1.1.1", "semver": "^5.4.1" } }, "sha512-lRDc9HqB7o/EpMTYMfymyfp3kS2o8EGQlpPOVQGeTGCnEChNxX5qwbMchXU/I03bKYGgpgn3rMx+CJja2UEZhw=="], + + "@parcel/transformer-json": ["@parcel/transformer-json@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "json5": "^2.1.0" } }, "sha512-kig1K1CaSVJG7TaULwyVQKnWqjqNzFEwFweVRVgs1sG+uGrySJkJTiVW1B4wquNTT9pJwQMXtdQs5alyyhEweA=="], + + "@parcel/transformer-postcss": ["@parcel/transformer-postcss@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "clone": "^2.1.1", "css-modules-loader-core": "^1.1.0", "nullthrows": "^1.1.1", "postcss-modules": "^3.2.2", "postcss-value-parser": "^4.1.0", "semver": "^5.4.1" } }, "sha512-zl5GlcdSBc3DyrX1StafT5qJNhpJiWHntMSKaIOta8SL7/1olvUV7AuQeRvC1OmNFfdVSHQO+T/vnByER3EklQ=="], + + "@parcel/transformer-posthtml": ["@parcel/transformer-posthtml@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "nullthrows": "^1.1.1", "posthtml": "^0.15.1", "posthtml-parser": "^0.6.0", "posthtml-render": "^1.4.0", "semver": "^5.4.1" } }, "sha512-xl5m0PQ5cTCf77Mys5e17gGqXcJ2YANwrplgtOhv12W/RVMHpZhQLHycar3OZ3gC9qkAuA2qFZj7ArO78vEMPg=="], + + "@parcel/transformer-raw": ["@parcel/transformer-raw@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3" } }, "sha512-LjeqMZIp363Cz2JqV2Z02sCX4dDZGwqTU5YnENQ+YyOmchJjvOJxgb/0XaDnQkjwoe5LVqoZkDXYvTAg/GScNg=="], + + "@parcel/transformer-react-refresh-wrap": ["@parcel/transformer-react-refresh-wrap@2.0.0-beta.3", "", { "dependencies": { "@parcel/plugin": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "react-refresh": "^0.9.0" } }, "sha512-K53j6YmIpP5K/0sONNlBUkCXoQK+6KfNzB8uViaCCkDwhSA+u3ukvpRur71ReEsiVaL0z8yqzD37Ekyl448QvA=="], + + "@parcel/types": ["@parcel/types@2.0.0-beta.3", "", {}, "sha512-5o/6KmYVU68+4IhauELMDz/kwkcoMGAB7veUX5hmH4nVNw6T05ZUHF0Te1OILASdAj67+XRAqeSA/+aWOhW/AA=="], + + "@parcel/utils": ["@parcel/utils@2.0.0-beta.3", "", { "dependencies": { "@iarna/toml": "^2.2.0", "@parcel/codeframe": "2.0.0-beta.3", "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/logger": "2.0.0-beta.3", "@parcel/markdown-ansi": "2.0.0-beta.3", "@parcel/source-map": "2.0.0-rc.1.0", "ansi-html": "^0.0.7", "chalk": "^4.1.0", "clone": "^2.1.1", "fast-glob": "3.1.1", "fastest-levenshtein": "^1.0.8", "is-glob": "^4.0.0", "is-url": "^1.2.2", "json5": "^1.0.1", "lru-cache": "^6.0.0", "micromatch": "^4.0.2", "node-forge": "^0.10.0", "nullthrows": "^1.1.1", "open": "^7.0.3" } }, "sha512-a5DKWcEkOj/BKrftXoJV+CvFQn5Axmmmx3kk1J9QM+4sTclD7pdyN3r2L7sLIFkGOtpk55E7IgCDMtj3LpGm6w=="], + + "@parcel/watcher": ["@parcel/watcher@2.0.0-alpha.10", "", { "dependencies": { "node-addon-api": "^3.0.2", "node-gyp-build": "^4.2.3" } }, "sha512-8uA7Tmx/1XvmUdGzksg0+oN7uj24pXFFnKJqZr3L3mgYjdrL7CMs3PRIHv1k3LUz/hNRsb/p3qxztSkWz1IGZA=="], + + "@parcel/workers": ["@parcel/workers@2.0.0-beta.3", "", { "dependencies": { "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/logger": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "chrome-trace-event": "^1.0.2", "nullthrows": "^1.1.1" }, "peerDependencies": { "@parcel/core": "^2.0.0-alpha.3.1" } }, "sha512-EEs0qmTj7FzcwhETFJ0wE/zGYK1xQH1sOACu1slFS9QVPpUGvGGHs9Kc1PGNiEkbTD1xMReRXETc6vf90IymCg=="], + + "@popperjs/core": ["@popperjs/core@2.11.6", "", {}, "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw=="], + + "@rc-component/portal": ["@rc-component/portal@1.0.0-10", "", { "dependencies": { "@babel/runtime": "^7.18.0", "classnames": "^2.3.2", "rc-util": "^5.8.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-Y4JgfSZtUZaM8C5ZYFtbJVOkRrR4QVIThd/VbPMRPDI5Mv6xnOAkjg50UbB8uYH7pclCqIBoc17djbAzo12r3w=="], + + "@restart/context": ["@restart/context@2.1.4", "", { "peerDependencies": { "react": ">=16.3.2" } }, "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q=="], + + "@restart/hooks": ["@restart/hooks@0.4.9", "", { "dependencies": { "dequal": "^2.0.2" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-3BekqcwB6Umeya+16XPooARn4qEPW6vNvwYnlofIYe6h9qG1/VeD7UvShCWx11eFz5ELYmwIEshz+MkPX3wjcQ=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@4.2.1", "", { "dependencies": { "estree-walker": "^2.0.1", "picomatch": "^2.2.2" } }, "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ=="], + + "@snowpack/plugin-react-refresh": ["@snowpack/plugin-react-refresh@2.5.0", "", { "dependencies": { "@babel/core": "^7.0.0", "@babel/plugin-syntax-class-properties": "^7.10.0", "react-refresh": "^0.9.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-3rYkwayAA+65IIYLXMEFqQwtBGbII9IidMJo1yXuj35kTEg9TdZrofoqcHaSts2sv2Nz0TD6v7BWRPdvCU0uIw=="], + + "@swc/helpers": ["@swc/helpers@0.4.11", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw=="], + + "@types/http-proxy": ["@types/http-proxy@1.17.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw=="], + + "@types/invariant": ["@types/invariant@2.2.35", "", {}, "sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg=="], + + "@types/node": ["@types/node@18.14.0", "", {}, "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A=="], + + "@types/parse-json": ["@types/parse-json@4.0.0", "", {}, "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="], + + "@types/prop-types": ["@types/prop-types@15.7.5", "", {}, "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="], + + "@types/q": ["@types/q@1.5.5", "", {}, "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ=="], + + "@types/react": ["@types/react@18.0.28", "", { "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew=="], + + "@types/react-transition-group": ["@types/react-transition-group@4.4.5", "", { "dependencies": { "@types/react": "*" } }, "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA=="], + + "@types/scheduler": ["@types/scheduler@0.16.2", "", {}, "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="], + + "@types/warning": ["@types/warning@3.0.0", "", {}, "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA=="], + + "@types/yauzl": ["@types/yauzl@2.10.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw=="], + + "@vitejs/plugin-react-refresh": ["@vitejs/plugin-react-refresh@1.3.6", "", { "dependencies": { "@babel/core": "^7.14.8", "@babel/plugin-transform-react-jsx-self": "^7.14.5", "@babel/plugin-transform-react-jsx-source": "^7.14.5", "@rollup/pluginutils": "^4.1.1", "react-refresh": "^0.10.0" } }, "sha512-iNR/UqhUOmFFxiezt0em9CgmiJBdWR+5jGxB2FihaoJfqGt76kiwaKoVOJVU5NYcDWMdN06LbyN2VIGIoYdsEA=="], + + "abab": ["abab@2.0.6", "", {}, "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="], + + "abortcontroller-polyfill": ["abortcontroller-polyfill@1.7.5", "", {}, "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ=="], + + "acorn": ["acorn@8.8.2", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw=="], + + "acorn-globals": ["acorn-globals@4.3.4", "", { "dependencies": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" } }, "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A=="], + + "acorn-walk": ["acorn-walk@6.2.0", "", {}, "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA=="], + + "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "alphanum-sort": ["alphanum-sort@1.0.2", "", {}, "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ=="], + + "ansi-html": ["ansi-html@0.0.7", "", { "bin": { "ansi-html": "./bin/ansi-html" } }, "sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "antd": ["antd@4.24.8", "", { "dependencies": { "@ant-design/colors": "^6.0.0", "@ant-design/icons": "^4.7.0", "@ant-design/react-slick": "~0.29.1", "@babel/runtime": "^7.18.3", "@ctrl/tinycolor": "^3.4.0", "classnames": "^2.2.6", "copy-to-clipboard": "^3.2.0", "lodash": "^4.17.21", "moment": "^2.29.2", "rc-cascader": "~3.7.0", "rc-checkbox": "~2.3.0", "rc-collapse": "~3.4.2", "rc-dialog": "~9.0.2", "rc-drawer": "~6.1.0", "rc-dropdown": "~4.0.0", "rc-field-form": "~1.27.0", "rc-image": "~5.13.0", "rc-input": "~0.1.4", "rc-input-number": "~7.3.9", "rc-mentions": "~1.13.1", "rc-menu": "~9.8.0", "rc-motion": "^2.6.1", "rc-notification": "~4.6.0", "rc-pagination": "~3.2.0", "rc-picker": "~2.7.0", "rc-progress": "~3.4.1", "rc-rate": "~2.9.0", "rc-resize-observer": "^1.2.0", "rc-segmented": "~2.1.0", "rc-select": "~14.1.13", "rc-slider": "~10.0.0", "rc-steps": "~5.0.0-alpha.2", "rc-switch": "~3.2.0", "rc-table": "~7.26.0", "rc-tabs": "~12.5.6", "rc-textarea": "~0.4.5", "rc-tooltip": "~5.2.0", "rc-tree": "~5.7.0", "rc-tree-select": "~5.5.0", "rc-trigger": "^5.2.10", "rc-upload": "~4.3.0", "rc-util": "^5.22.5", "scroll-into-view-if-needed": "^2.2.25" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-wrNy2Hi27uM3948okG3n2GwzQKBFUn1Qn5mn2I/ALcR28rC6cTjHYOuA248Zl9ECzz3jo4TY2R0SIa+5GZ/zGA=="], + + "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "arr-diff": ["arr-diff@4.0.0", "", {}, "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA=="], + + "arr-flatten": ["arr-flatten@1.1.0", "", {}, "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="], + + "arr-union": ["arr-union@3.1.0", "", {}, "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q=="], + + "array-equal": ["array-equal@1.0.0", "", {}, "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA=="], + + "array-tree-filter": ["array-tree-filter@2.1.0", "", {}, "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "array-unique": ["array-unique@0.3.2", "", {}, "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ=="], + + "array.prototype.reduce": ["array.prototype.reduce@1.0.5", "", { "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" } }, "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q=="], + + "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], + + "asn1.js": ["asn1.js@5.4.1", "", { "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "safer-buffer": "^2.1.0" } }, "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA=="], + + "assert": ["assert@2.0.0", "", { "dependencies": { "es6-object-assign": "^1.1.0", "is-nan": "^1.2.1", "object-is": "^1.0.1", "util": "^0.12.0" } }, "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A=="], + + "assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="], + + "assign-symbols": ["assign-symbols@1.0.0", "", {}, "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw=="], + + "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], + + "astring": ["astring@1.8.4", "", { "bin": { "astring": "bin/astring" } }, "sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw=="], + + "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], + + "async-validator": ["async-validator@4.2.5", "", {}, "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "atob": ["atob@2.1.2", "", { "bin": { "atob": "bin/atob.js" } }, "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.5", "", {}, "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw=="], + + "aws-sign2": ["aws-sign2@0.7.0", "", {}, "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="], + + "aws4": ["aws4@1.12.0", "", {}, "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="], + + "babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base": ["base@0.11.2", "", { "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", "define-property": "^1.0.0", "isobject": "^3.0.1", "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" } }, "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg=="], + + "base-x": ["base-x@3.0.9", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="], + + "big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="], + + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "bn.js": ["bn.js@5.2.1", "", {}, "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.2", "", { "dependencies": { "fill-range": "^7.0.1" } }, "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="], + + "brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="], + + "browser-process-hrtime": ["browser-process-hrtime@1.0.0", "", {}, "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="], + + "browserify-aes": ["browserify-aes@1.2.0", "", { "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA=="], + + "browserify-cipher": ["browserify-cipher@1.0.1", "", { "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", "evp_bytestokey": "^1.0.0" } }, "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w=="], + + "browserify-des": ["browserify-des@1.0.2", "", { "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A=="], + + "browserify-rsa": ["browserify-rsa@4.1.0", "", { "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" } }, "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog=="], + + "browserify-sign": ["browserify-sign@4.2.1", "", { "dependencies": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "elliptic": "^6.5.3", "inherits": "^2.0.4", "parse-asn1": "^5.1.5", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" } }, "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg=="], + + "browserify-zlib": ["browserify-zlib@0.2.0", "", { "dependencies": { "pako": "~1.0.5" } }, "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA=="], + + "browserslist": ["browserslist@4.21.5", "", { "dependencies": { "caniuse-lite": "^1.0.30001449", "electron-to-chromium": "^1.4.284", "node-releases": "^2.0.8", "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" } }, "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w=="], + + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "buffer-xor": ["buffer-xor@1.0.3", "", {}, "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ=="], + + "builtin-status-codes": ["builtin-status-codes@3.0.0", "", {}, "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ=="], + + "bun-framework-next": ["bun-framework-next@12.2.5", "", { "dependencies": { "react-is": "*" }, "peerDependencies": { "next": "~12.2.3" } }, "sha512-2sbt+qLxdv6FKIDMwi6dWeTQj6GwF0j0IAKTGk977TIUZMEBqr93Nb2DSIj0FPBF0ZCCO/lGYD3j3ulmmD0GAQ=="], + + "bytes": ["bytes@3.0.0", "", {}, "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="], + + "cache-base": ["cache-base@1.0.1", "", { "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", "get-value": "^2.0.6", "has-value": "^1.0.0", "isobject": "^3.0.1", "set-value": "^2.0.0", "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" } }, "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ=="], + + "call-bind": ["call-bind@1.0.2", "", { "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA=="], + + "caller-callsite": ["caller-callsite@2.0.0", "", { "dependencies": { "callsites": "^2.0.0" } }, "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ=="], + + "caller-path": ["caller-path@2.0.0", "", { "dependencies": { "caller-callsite": "^2.0.0" } }, "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001456", "", {}, "sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA=="], + + "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "child-process": ["child-process@1.0.2", "", {}, "sha512-e45+JmjvkV2XQsJ9rUJghiYJ7/9Uk8fyYi1UwfP071VmGKBu/oD1OIwuD0+jSwjMtQkV0a0FVpPTEW+XGlbSdw=="], + + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "chrome-trace-event": ["chrome-trace-event@1.0.3", "", {}, "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg=="], + + "cipher-base": ["cipher-base@1.0.4", "", { "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q=="], + + "class-utils": ["class-utils@0.3.6", "", { "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" } }, "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg=="], + + "classnames": ["classnames@2.3.2", "", {}, "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="], + + "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], + + "cli-spinners": ["cli-spinners@2.7.0", "", {}, "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw=="], + + "clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="], + + "coa": ["coa@2.0.2", "", { "dependencies": { "@types/q": "^1.5.1", "chalk": "^2.4.1", "q": "^1.1.2" } }, "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA=="], + + "collection-visit": ["collection-visit@1.0.0", "", { "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw=="], + + "color": ["color@3.2.1", "", { "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" } }, "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "command-exists": ["command-exists@1.2.9", "", {}, "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w=="], + + "commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "component-emitter": ["component-emitter@1.3.0", "", {}, "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="], + + "compute-scroll-into-view": ["compute-scroll-into-view@1.0.20", "", {}, "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "connect": ["connect@3.7.0", "", { "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.0.1" } }, "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ=="], + + "console-browserify": ["console-browserify@1.2.0", "", {}, "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="], + + "constants-browserify": ["constants-browserify@1.0.0", "", {}, "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ=="], + + "content-disposition": ["content-disposition@0.5.2", "", {}, "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA=="], + + "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "copy-descriptor": ["copy-descriptor@0.1.1", "", {}, "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw=="], + + "copy-to-clipboard": ["copy-to-clipboard@3.3.3", "", { "dependencies": { "toggle-selection": "^1.0.6" } }, "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA=="], + + "core-js": ["core-js@3.28.0", "", {}, "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], + + "create-ecdh": ["create-ecdh@4.0.4", "", { "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" } }, "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A=="], + + "create-hash": ["create-hash@1.2.0", "", { "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }, "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg=="], + + "create-hmac": ["create-hmac@1.1.7", "", { "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", "inherits": "^2.0.1", "ripemd160": "^2.0.0", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg=="], + + "cross-spawn": ["cross-spawn@6.0.5", "", { "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ=="], + + "crypto-browserify": ["crypto-browserify@3.12.0", "", { "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", "create-ecdh": "^4.0.0", "create-hash": "^1.1.0", "create-hmac": "^1.1.0", "diffie-hellman": "^5.0.0", "inherits": "^2.0.1", "pbkdf2": "^3.0.3", "public-encrypt": "^4.0.0", "randombytes": "^2.0.0", "randomfill": "^1.0.3" } }, "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg=="], + + "css-color-names": ["css-color-names@0.0.4", "", {}, "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q=="], + + "css-declaration-sorter": ["css-declaration-sorter@4.0.1", "", { "dependencies": { "postcss": "^7.0.1", "timsort": "^0.3.0" } }, "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA=="], + + "css-modules-loader-core": ["css-modules-loader-core@1.1.0", "", { "dependencies": { "icss-replace-symbols": "1.1.0", "postcss": "6.0.1", "postcss-modules-extract-imports": "1.1.0", "postcss-modules-local-by-default": "1.2.0", "postcss-modules-scope": "1.1.0", "postcss-modules-values": "1.3.0" } }, "sha512-XWOBwgy5nwBn76aA+6ybUGL/3JBnCtBX9Ay9/OWIpzKYWlVHMazvJ+WtHumfi+xxdPF440cWK7JCYtt8xDifew=="], + + "css-select": ["css-select@2.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^3.2.1", "domutils": "^1.7.0", "nth-check": "^1.0.2" } }, "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ=="], + + "css-select-base-adapter": ["css-select-base-adapter@0.1.1", "", {}, "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="], + + "css-selector-tokenizer": ["css-selector-tokenizer@0.7.3", "", { "dependencies": { "cssesc": "^3.0.0", "fastparse": "^1.1.2" } }, "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg=="], + + "css-tree": ["css-tree@1.0.0-alpha.37", "", { "dependencies": { "mdn-data": "2.0.4", "source-map": "^0.6.1" } }, "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg=="], + + "css-what": ["css-what@3.4.2", "", {}, "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "cssnano": ["cssnano@4.1.11", "", { "dependencies": { "cosmiconfig": "^5.0.0", "cssnano-preset-default": "^4.0.8", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" } }, "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g=="], + + "cssnano-preset-default": ["cssnano-preset-default@4.0.8", "", { "dependencies": { "css-declaration-sorter": "^4.0.1", "cssnano-util-raw-cache": "^4.0.1", "postcss": "^7.0.0", "postcss-calc": "^7.0.1", "postcss-colormin": "^4.0.3", "postcss-convert-values": "^4.0.1", "postcss-discard-comments": "^4.0.2", "postcss-discard-duplicates": "^4.0.2", "postcss-discard-empty": "^4.0.1", "postcss-discard-overridden": "^4.0.1", "postcss-merge-longhand": "^4.0.11", "postcss-merge-rules": "^4.0.3", "postcss-minify-font-values": "^4.0.2", "postcss-minify-gradients": "^4.0.2", "postcss-minify-params": "^4.0.2", "postcss-minify-selectors": "^4.0.2", "postcss-normalize-charset": "^4.0.1", "postcss-normalize-display-values": "^4.0.2", "postcss-normalize-positions": "^4.0.2", "postcss-normalize-repeat-style": "^4.0.2", "postcss-normalize-string": "^4.0.2", "postcss-normalize-timing-functions": "^4.0.2", "postcss-normalize-unicode": "^4.0.1", "postcss-normalize-url": "^4.0.1", "postcss-normalize-whitespace": "^4.0.2", "postcss-ordered-values": "^4.1.2", "postcss-reduce-initial": "^4.0.3", "postcss-reduce-transforms": "^4.0.2", "postcss-svgo": "^4.0.3", "postcss-unique-selectors": "^4.0.1" } }, "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ=="], + + "cssnano-util-get-arguments": ["cssnano-util-get-arguments@4.0.0", "", {}, "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw=="], + + "cssnano-util-get-match": ["cssnano-util-get-match@4.0.0", "", {}, "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw=="], + + "cssnano-util-raw-cache": ["cssnano-util-raw-cache@4.0.1", "", { "dependencies": { "postcss": "^7.0.0" } }, "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA=="], + + "cssnano-util-same-parent": ["cssnano-util-same-parent@4.0.1", "", {}, "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q=="], + + "csso": ["csso@4.2.0", "", { "dependencies": { "css-tree": "^1.1.2" } }, "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA=="], + + "cssom": ["cssom@0.3.8", "", {}, "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="], + + "cssstyle": ["cssstyle@1.4.0", "", { "dependencies": { "cssom": "0.3.x" } }, "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA=="], + + "csstype": ["csstype@3.1.1", "", {}, "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="], + + "dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="], + + "data-urls": ["data-urls@1.1.0", "", { "dependencies": { "abab": "^2.0.0", "whatwg-mimetype": "^2.2.0", "whatwg-url": "^7.0.0" } }, "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ=="], + + "date-fns": ["date-fns@2.29.3", "", {}, "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA=="], + + "dayjs": ["dayjs@1.11.7", "", {}, "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="], + + "debug": ["debug@4.3.1", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ=="], + + "decode-uri-component": ["decode-uri-component@0.2.2", "", {}, "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], + + "define-properties": ["define-properties@1.2.0", "", { "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA=="], + + "define-property": ["define-property@2.0.2", "", { "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" } }, "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "des.js": ["des.js@1.0.1", "", { "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA=="], + + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + + "devtools-protocol": ["devtools-protocol@0.0.901419", "", {}, "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ=="], + + "diffie-hellman": ["diffie-hellman@5.0.3", "", { "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" } }, "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "dom-align": ["dom-align@1.12.4", "", {}, "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw=="], + + "dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="], + + "dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], + + "domain-browser": ["domain-browser@3.5.0", "", {}, "sha512-zrzUu6auyZWRexjCEPJnfWc30Hupxh2lJZOJAF3qa2bCuD4O/55t0FvQt3ZMhEw++gjNkwdkOVZh8yA32w/Vfw=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domexception": ["domexception@1.0.1", "", { "dependencies": { "webidl-conversions": "^4.0.2" } }, "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug=="], + + "domhandler": ["domhandler@3.3.0", "", { "dependencies": { "domelementtype": "^2.0.1" } }, "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA=="], + + "domutils": ["domutils@2.8.0", "", { "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="], + + "dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="], + + "dotenv": ["dotenv@7.0.0", "", {}, "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g=="], + + "dotenv-expand": ["dotenv-expand@5.1.0", "", {}, "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="], + + "ecc-jsbn": ["ecc-jsbn@0.1.2", "", { "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "ejs": ["ejs@2.7.4", "", {}, "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA=="], + + "electron-to-chromium": ["electron-to-chromium@1.4.302", "", {}, "sha512-Uk7C+7aPBryUR1Fwvk9VmipBcN9fVsqBO57jV2ZjTm+IZ6BMNqu7EDVEg2HxCNufk6QcWlFsBkhQyQroB2VWKw=="], + + "elliptic": ["elliptic@6.5.4", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="], + + "emphasize": ["emphasize@4.2.0", "", { "dependencies": { "chalk": "^4.0.0", "highlight.js": "~10.4.0", "lowlight": "~1.17.0" } }, "sha512-yGKvcFUHlBsUPwlxTlzKLR8+zhpbitkFOMCUxN8fTJng9bdH3WNzUGkhdaGdjndSUgqmMPBN7umfwnUdLz5Axg=="], + + "encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], + + "entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "es-abstract": ["es-abstract@1.21.1", "", { "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.4", "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.9" } }, "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg=="], + + "es-array-method-boxes-properly": ["es-array-method-boxes-properly@1.0.0", "", {}, "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "has-tostringtag": "^1.0.0" } }, "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg=="], + + "es-to-primitive": ["es-to-primitive@1.2.1", "", { "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="], + + "es6-object-assign": ["es6-object-assign@1.1.0", "", {}, "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw=="], + + "escalade": ["escalade@3.1.1", "", {}, "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "escodegen": ["escodegen@1.14.3", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "evp_bytestokey": ["evp_bytestokey@1.0.3", "", { "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="], + + "expand-brackets": ["expand-brackets@2.1.4", "", { "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "posix-character-classes": "^0.1.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" } }, "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extend-shallow": ["extend-shallow@3.0.2", "", { "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q=="], + + "extglob": ["extglob@2.0.4", "", { "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", "expand-brackets": "^2.1.4", "extend-shallow": "^2.0.1", "fragment-cache": "^0.2.1", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" } }, "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw=="], + + "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "@types/yauzl": "^2.9.1", "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], + + "extsprintf": ["extsprintf@1.3.0", "", {}, "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.1.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.0", "merge2": "^1.3.0", "micromatch": "^4.0.2" } }, "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fast-url-parser": ["fast-url-parser@1.1.3", "", { "dependencies": { "punycode": "^1.3.2" } }, "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ=="], + + "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], + + "fastparse": ["fastparse@1.1.2", "", {}, "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="], + + "fastq": ["fastq@1.15.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw=="], + + "fault": ["fault@1.0.4", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA=="], + + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + + "filesize": ["filesize@6.4.0", "", {}, "sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ=="], + + "fill-range": ["fill-range@7.0.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="], + + "finalhandler": ["finalhandler@1.1.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="], + + "find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="], + + "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "follow-redirects": ["follow-redirects@1.15.2", "", {}, "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="], + + "for-each": ["for-each@0.3.3", "", { "dependencies": { "is-callable": "^1.1.3" } }, "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw=="], + + "for-in": ["for-in@1.0.2", "", {}, "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ=="], + + "forever-agent": ["forever-agent@0.6.1", "", {}, "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="], + + "form-data": ["form-data@2.3.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="], + + "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], + + "fragment-cache": ["fragment-cache@0.2.1", "", { "dependencies": { "map-cache": "^0.2.2" } }, "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA=="], + + "fs": ["fs@0.0.1-security", "", {}, "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w=="], + + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "function-bind": ["function-bind@1.1.1", "", {}, "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="], + + "function.prototype.name": ["function.prototype.name@1.1.5", "", { "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.0", "functions-have-names": "^1.2.2" } }, "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "generic-names": ["generic-names@2.0.1", "", { "dependencies": { "loader-utils": "^1.1.0" } }, "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-intrinsic": ["get-intrinsic@1.2.0", "", { "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.3" } }, "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q=="], + + "get-port": ["get-port@4.2.0", "", {}, "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw=="], + + "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "get-symbol-description": ["get-symbol-description@1.0.0", "", { "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" } }, "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw=="], + + "get-value": ["get-value@2.0.6", "", {}, "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA=="], + + "getpass": ["getpass@0.1.7", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "globalthis": ["globalthis@1.0.3", "", { "dependencies": { "define-properties": "^1.1.3" } }, "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA=="], + + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "gopd": ["gopd@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3" } }, "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="], + + "graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], + + "har-schema": ["har-schema@2.0.0", "", {}, "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="], + + "har-validator": ["har-validator@5.1.5", "", { "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w=="], + + "has": ["has@1.0.3", "", { "dependencies": { "function-bind": "^1.1.1" } }, "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="], + + "has-ansi": ["has-ansi@2.0.0", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg=="], + + "has-bigints": ["has-bigints@1.0.2", "", {}, "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.1.1" } }, "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ=="], + + "has-proto": ["has-proto@1.0.1", "", {}, "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="], + + "has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="], + + "has-tostringtag": ["has-tostringtag@1.0.0", "", { "dependencies": { "has-symbols": "^1.0.2" } }, "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ=="], + + "has-value": ["has-value@1.0.0", "", { "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" } }, "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw=="], + + "has-values": ["has-values@1.0.0", "", { "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" } }, "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ=="], + + "hash-base": ["hash-base@3.1.0", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" } }, "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA=="], + + "hash.js": ["hash.js@1.1.7", "", { "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="], + + "hex-color-regex": ["hex-color-regex@1.1.0", "", {}, "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="], + + "highlight.js": ["highlight.js@10.4.1", "", {}, "sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg=="], + + "hmac-drbg": ["hmac-drbg@1.0.1", "", { "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg=="], + + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], + + "hsl-regex": ["hsl-regex@1.0.0", "", {}, "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A=="], + + "hsla-regex": ["hsla-regex@1.0.0", "", {}, "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA=="], + + "html-encoding-sniffer": ["html-encoding-sniffer@1.0.2", "", { "dependencies": { "whatwg-encoding": "^1.0.1" } }, "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw=="], + + "html-tags": ["html-tags@1.2.0", "", {}, "sha512-uVteDXUCs08M7QJx0eY6ue7qQztwIfknap81vAtNob2sdEPKa8PjPinx0vxbs2JONPamovZjMvKZWNW44/PBKg=="], + + "htmlnano": ["htmlnano@0.2.9", "", { "dependencies": { "cssnano": "^4.1.11", "posthtml": "^0.15.1", "purgecss": "^2.3.0", "relateurl": "^0.2.7", "srcset": "^3.0.0", "svgo": "^1.3.2", "terser": "^5.6.1", "timsort": "^0.3.0", "uncss": "^0.17.3" } }, "sha512-jWTtP3dCd7R8x/tt9DK3pvpcQd7HDMcRPUqPxr/i9989q2k5RHIhmlRDFeyQ/LSd8IKrteG8Ce5g0Ig4eGIipg=="], + + "htmlparser2": ["htmlparser2@5.0.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^3.3.0", "domutils": "^2.4.2", "entities": "^2.0.0" } }, "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ=="], + + "http-proxy": ["http-proxy@1.18.1", "", { "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } }, "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="], + + "http-proxy-middleware": ["http-proxy-middleware@1.3.1", "", { "dependencies": { "@types/http-proxy": "^1.17.5", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" } }, "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg=="], + + "http-signature": ["http-signature@1.2.0", "", { "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ=="], + + "https-browserify": ["https-browserify@1.0.0", "", {}, "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg=="], + + "https-proxy-agent": ["https-proxy-agent@5.0.0", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA=="], + + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "icss-replace-symbols": ["icss-replace-symbols@1.1.0", "", {}, "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg=="], + + "icss-utils": ["icss-utils@4.1.1", "", { "dependencies": { "postcss": "^7.0.14" } }, "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "iferr": ["iferr@1.0.2", "", {}, "sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg=="], + + "ignore": ["ignore@5.2.4", "", {}, "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ=="], + + "import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "indexes-of": ["indexes-of@1.0.1", "", {}, "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "internal-slot": ["internal-slot@1.0.5", "", { "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } }, "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ=="], + + "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], + + "is-absolute-url": ["is-absolute-url@3.0.3", "", {}, "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q=="], + + "is-accessor-descriptor": ["is-accessor-descriptor@1.0.0", "", { "dependencies": { "kind-of": "^6.0.0" } }, "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ=="], + + "is-arguments": ["is-arguments@1.1.1", "", { "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA=="], + + "is-array-buffer": ["is-array-buffer@3.0.1", "", { "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-typed-array": "^1.1.10" } }, "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-bigint": ["is-bigint@1.0.4", "", { "dependencies": { "has-bigints": "^1.0.1" } }, "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg=="], + + "is-boolean-object": ["is-boolean-object@1.1.2", "", { "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA=="], + + "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-color-stop": ["is-color-stop@1.1.0", "", { "dependencies": { "css-color-names": "^0.0.4", "hex-color-regex": "^1.1.0", "hsl-regex": "^1.0.0", "hsla-regex": "^1.0.0", "rgb-regex": "^1.0.1", "rgba-regex": "^1.0.0" } }, "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA=="], + + "is-core-module": ["is-core-module@2.11.0", "", { "dependencies": { "has": "^1.0.3" } }, "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw=="], + + "is-data-descriptor": ["is-data-descriptor@1.0.0", "", { "dependencies": { "kind-of": "^6.0.0" } }, "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ=="], + + "is-date-object": ["is-date-object@1.0.5", "", { "dependencies": { "has-tostringtag": "^1.0.0" } }, "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ=="], + + "is-descriptor": ["is-descriptor@1.0.2", "", { "dependencies": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } }, "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg=="], + + "is-directory": ["is-directory@0.3.1", "", {}, "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "is-extendable": ["is-extendable@1.0.1", "", { "dependencies": { "is-plain-object": "^2.0.4" } }, "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-function": ["is-generator-function@1.0.10", "", { "dependencies": { "has-tostringtag": "^1.0.0" } }, "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-html": ["is-html@1.1.0", "", { "dependencies": { "html-tags": "^1.0.0" } }, "sha512-eoGsQVAAyvLFRKnbt4jo7Il56agsH5I04pDymPoxRp/tnna5yiIpdNzvKPOy5G1Ff0zY/jfN2hClb7ju+sOrdA=="], + + "is-interactive": ["is-interactive@1.0.0", "", {}, "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="], + + "is-nan": ["is-nan@1.3.2", "", { "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w=="], + + "is-negative-zero": ["is-negative-zero@2.0.2", "", {}, "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.0.7", "", { "dependencies": { "has-tostringtag": "^1.0.0" } }, "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ=="], + + "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], + + "is-plain-obj": ["is-plain-obj@3.0.0", "", {}, "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA=="], + + "is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + + "is-regex": ["is-regex@1.1.4", "", { "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg=="], + + "is-resolvable": ["is-resolvable@1.1.0", "", {}, "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.2", "", { "dependencies": { "call-bind": "^1.0.2" } }, "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA=="], + + "is-string": ["is-string@1.0.7", "", { "dependencies": { "has-tostringtag": "^1.0.0" } }, "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg=="], + + "is-symbol": ["is-symbol@1.0.4", "", { "dependencies": { "has-symbols": "^1.0.2" } }, "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg=="], + + "is-typed-array": ["is-typed-array@1.1.10", "", { "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" } }, "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A=="], + + "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], + + "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], + + "is-url": ["is-url@1.2.4", "", {}, "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="], + + "is-weakref": ["is-weakref@1.0.2", "", { "dependencies": { "call-bind": "^1.0.2" } }, "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ=="], + + "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], + + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], + + "isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "jsbn": ["jsbn@0.1.1", "", {}, "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="], + + "jsdom": ["jsdom@14.1.0", "", { "dependencies": { "abab": "^2.0.0", "acorn": "^6.0.4", "acorn-globals": "^4.3.0", "array-equal": "^1.0.0", "cssom": "^0.3.4", "cssstyle": "^1.1.1", "data-urls": "^1.1.0", "domexception": "^1.0.1", "escodegen": "^1.11.0", "html-encoding-sniffer": "^1.0.2", "nwsapi": "^2.1.3", "parse5": "5.1.0", "pn": "^1.1.0", "request": "^2.88.0", "request-promise-native": "^1.0.5", "saxes": "^3.1.9", "symbol-tree": "^3.2.2", "tough-cookie": "^2.5.0", "w3c-hr-time": "^1.0.1", "w3c-xmlserializer": "^1.1.2", "webidl-conversions": "^4.0.2", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^7.0.0", "ws": "^6.1.2", "xml-name-validator": "^3.0.0" } }, "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng=="], + + "jsesc": ["jsesc@2.5.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="], + + "json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-source-map": ["json-source-map@0.6.1", "", {}, "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "json2mq": ["json2mq@0.2.0", "", { "dependencies": { "string-convert": "^0.2.0" } }, "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsprim": ["jsprim@1.4.2", "", { "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.4.0", "verror": "1.10.0" } }, "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw=="], + + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + + "left-pad": ["left-pad@1.3.0", "", {}, "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA=="], + + "levn": ["levn@0.3.0", "", { "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "loader-utils": ["loader-utils@1.4.2", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" } }, "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg=="], + + "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], + + "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="], + + "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="], + + "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lowlight": ["lowlight@1.17.0", "", { "dependencies": { "fault": "^1.0.0", "highlight.js": "~10.4.0" } }, "sha512-vmtBgYKD+QVNy7tIa7ulz5d//Il9R4MooOVh4nkOf9R9Cb/Dk5TXMSTieg/vDulkBkIWj59/BIlyFQxT9X1oAQ=="], + + "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "map-cache": ["map-cache@0.2.2", "", {}, "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg=="], + + "map-visit": ["map-visit@1.0.0", "", { "dependencies": { "object-visit": "^1.0.0" } }, "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w=="], + + "md5.js": ["md5.js@1.3.5", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="], + + "mdn-data": ["mdn-data@2.0.4", "", {}, "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.5", "", { "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="], + + "miller-rabin": ["miller-rabin@4.0.1", "", { "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" }, "bin": { "miller-rabin": "bin/miller-rabin" } }, "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA=="], + + "mime-db": ["mime-db@1.33.0", "", {}, "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="], + + "mime-types": ["mime-types@2.1.18", "", { "dependencies": { "mime-db": "~1.33.0" } }, "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], + + "minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mixin-deep": ["mixin-deep@1.3.2", "", { "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" } }, "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA=="], + + "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "moment": ["moment@2.29.4", "", {}, "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="], + + "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "nanoid": ["nanoid@3.3.4", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="], + + "nanomatch": ["nanomatch@1.2.13", "", { "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" } }, "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA=="], + + "ncp": ["ncp@2.0.0", "", { "bin": { "ncp": "./bin/ncp" } }, "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA=="], + + "next": ["next@12.3.4", "", { "dependencies": { "@next/env": "12.3.4", "@next/swc-android-arm-eabi": "12.3.4", "@next/swc-android-arm64": "12.3.4", "@next/swc-darwin-arm64": "12.3.4", "@next/swc-darwin-x64": "12.3.4", "@next/swc-freebsd-x64": "12.3.4", "@next/swc-linux-arm-gnueabihf": "12.3.4", "@next/swc-linux-arm64-gnu": "12.3.4", "@next/swc-linux-arm64-musl": "12.3.4", "@next/swc-linux-x64-gnu": "12.3.4", "@next/swc-linux-x64-musl": "12.3.4", "@next/swc-win32-arm64-msvc": "12.3.4", "@next/swc-win32-ia32-msvc": "12.3.4", "@next/swc-win32-x64-msvc": "12.3.4", "@swc/helpers": "0.4.11", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", "styled-jsx": "5.0.7", "use-sync-external-store": "1.2.0" }, "peerDependencies": { "fibers": ">= 3.1.0", "node-sass": "^6.0.0 || ^7.0.0", "react": "^17.0.2 || ^18.0.0-0", "react-dom": "^17.0.2 || ^18.0.0-0", "sass": "^1.3.0" }, "optionalPeers": ["fibers", "node-sass", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-VcyMJUtLZBGzLKo3oMxrEF0stxh8HwuW976pAzlHhI3t8qJ4SROjCrSh1T24bhrbjw55wfZXAbXPGwPt5FLRfQ=="], + + "nice-try": ["nice-try@1.0.5", "", {}, "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="], + + "node-addon-api": ["node-addon-api@3.2.1", "", {}, "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="], + + "node-fetch": ["node-fetch@2.6.1", "", {}, "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="], + + "node-forge": ["node-forge@0.10.0", "", {}, "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA=="], + + "node-gyp-build": ["node-gyp-build@4.6.0", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ=="], + + "node-releases": ["node-releases@2.0.10", "", {}, "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w=="], + + "normalize-url": ["normalize-url@3.3.0", "", {}, "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="], + + "nth-check": ["nth-check@1.0.2", "", { "dependencies": { "boolbase": "~1.0.0" } }, "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg=="], + + "nullthrows": ["nullthrows@1.1.1", "", {}, "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw=="], + + "nwsapi": ["nwsapi@2.2.2", "", {}, "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw=="], + + "oauth-sign": ["oauth-sign@0.9.0", "", {}, "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-copy": ["object-copy@0.1.0", "", { "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" } }, "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ=="], + + "object-inspect": ["object-inspect@1.12.3", "", {}, "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="], + + "object-is": ["object-is@1.1.5", "", { "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object-visit": ["object-visit@1.0.1", "", { "dependencies": { "isobject": "^3.0.0" } }, "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA=="], + + "object.assign": ["object.assign@4.1.4", "", { "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ=="], + + "object.getownpropertydescriptors": ["object.getownpropertydescriptors@2.1.5", "", { "dependencies": { "array.prototype.reduce": "^1.0.5", "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw=="], + + "object.pick": ["object.pick@1.3.0", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ=="], + + "object.values": ["object.values@1.1.6", "", { "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw=="], + + "on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + + "optionator": ["optionator@0.8.3", "", { "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "word-wrap": "~1.2.3" } }, "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA=="], + + "ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], + + "os-browserify": ["os-browserify@0.3.0", "", {}, "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A=="], + + "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + + "parcel": ["parcel@2.0.0-beta.3", "", { "dependencies": { "@parcel/config-default": "2.0.0-beta.3", "@parcel/core": "2.0.0-beta.3", "@parcel/diagnostic": "2.0.0-beta.3", "@parcel/events": "2.0.0-beta.3", "@parcel/fs": "2.0.0-beta.3", "@parcel/logger": "2.0.0-beta.3", "@parcel/package-manager": "2.0.0-beta.3", "@parcel/reporter-cli": "2.0.0-beta.3", "@parcel/reporter-dev-server": "2.0.0-beta.3", "@parcel/utils": "2.0.0-beta.3", "chalk": "^4.1.0", "commander": "^7.0.0", "get-port": "^4.2.0", "v8-compile-cache": "^2.0.0" }, "bin": { "parcel": "lib/bin.js" } }, "sha512-85lYzs87O7jedNhuKj21fqA4Kq0dDXFHNOqxvKnIxltlPLXPXFiGwR2EcjTmF8Trv82KoeKWuWLtUVSzjZ79nQ=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-asn1": ["parse-asn1@5.1.6", "", { "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" } }, "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "parse5": ["parse5@5.1.0", "", {}, "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "pascalcase": ["pascalcase@0.1.1", "", {}, "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw=="], + + "path": ["path@0.12.7", "", { "dependencies": { "process": "^0.11.1", "util": "^0.10.3" } }, "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q=="], + + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-is-inside": ["path-is-inside@1.0.2", "", {}, "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w=="], + + "path-key": ["path-key@2.0.1", "", {}, "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-to-regexp": ["path-to-regexp@2.2.1", "", {}, "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pbkdf2": ["pbkdf2@3.1.2", "", { "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", "ripemd160": "^2.0.1", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA=="], + + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + + "percentile": ["percentile@1.6.0", "", {}, "sha512-8vSyjdzwxGDHHwH+cSGch3A9Uj2On3UpgOWxWXMKwUvoAbnujx6DaqmV1duWXNiH/oEWpyVd6nSQccix6DM3Ng=="], + + "performance-now": ["performance-now@2.1.0", "", {}, "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="], + + "picocolors": ["picocolors@1.0.0", "", {}, "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + + "pn": ["pn@1.1.0", "", {}, "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="], + + "posix-character-classes": ["posix-character-classes@0.1.1", "", {}, "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg=="], + + "postcss": ["postcss@8.4.14", "", { "dependencies": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig=="], + + "postcss-calc": ["postcss-calc@7.0.5", "", { "dependencies": { "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.0.2" } }, "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg=="], + + "postcss-colormin": ["postcss-colormin@4.0.3", "", { "dependencies": { "browserslist": "^4.0.0", "color": "^3.0.0", "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw=="], + + "postcss-convert-values": ["postcss-convert-values@4.0.1", "", { "dependencies": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ=="], + + "postcss-discard-comments": ["postcss-discard-comments@4.0.2", "", { "dependencies": { "postcss": "^7.0.0" } }, "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg=="], + + "postcss-discard-duplicates": ["postcss-discard-duplicates@4.0.2", "", { "dependencies": { "postcss": "^7.0.0" } }, "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ=="], + + "postcss-discard-empty": ["postcss-discard-empty@4.0.1", "", { "dependencies": { "postcss": "^7.0.0" } }, "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w=="], + + "postcss-discard-overridden": ["postcss-discard-overridden@4.0.1", "", { "dependencies": { "postcss": "^7.0.0" } }, "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg=="], + + "postcss-merge-longhand": ["postcss-merge-longhand@4.0.11", "", { "dependencies": { "css-color-names": "0.0.4", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "stylehacks": "^4.0.0" } }, "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw=="], + + "postcss-merge-rules": ["postcss-merge-rules@4.0.3", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", "cssnano-util-same-parent": "^4.0.0", "postcss": "^7.0.0", "postcss-selector-parser": "^3.0.0", "vendors": "^1.0.0" } }, "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ=="], + + "postcss-minify-font-values": ["postcss-minify-font-values@4.0.2", "", { "dependencies": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg=="], + + "postcss-minify-gradients": ["postcss-minify-gradients@4.0.2", "", { "dependencies": { "cssnano-util-get-arguments": "^4.0.0", "is-color-stop": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q=="], + + "postcss-minify-params": ["postcss-minify-params@4.0.2", "", { "dependencies": { "alphanum-sort": "^1.0.0", "browserslist": "^4.0.0", "cssnano-util-get-arguments": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "uniqs": "^2.0.0" } }, "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg=="], + + "postcss-minify-selectors": ["postcss-minify-selectors@4.0.2", "", { "dependencies": { "alphanum-sort": "^1.0.0", "has": "^1.0.0", "postcss": "^7.0.0", "postcss-selector-parser": "^3.0.0" } }, "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g=="], + + "postcss-modules": ["postcss-modules@3.2.2", "", { "dependencies": { "generic-names": "^2.0.1", "icss-replace-symbols": "^1.1.0", "lodash.camelcase": "^4.3.0", "postcss": "^7.0.32", "postcss-modules-extract-imports": "^2.0.0", "postcss-modules-local-by-default": "^3.0.2", "postcss-modules-scope": "^2.2.0", "postcss-modules-values": "^3.0.0", "string-hash": "^1.1.1" } }, "sha512-JQ8IAqHELxC0N6tyCg2UF40pACY5oiL6UpiqqcIFRWqgDYO8B0jnxzoQ0EOpPrWXvcpu6BSbQU/3vSiq7w8Nhw=="], + + "postcss-modules-extract-imports": ["postcss-modules-extract-imports@1.1.0", "", { "dependencies": { "postcss": "^6.0.1" } }, "sha512-zF9+UIEvtpeqMGxhpeT9XaIevQSrBBCz9fi7SwfkmjVacsSj8DY5eFVgn+wY8I9vvdDDwK5xC8Myq4UkoLFIkA=="], + + "postcss-modules-local-by-default": ["postcss-modules-local-by-default@1.2.0", "", { "dependencies": { "css-selector-tokenizer": "^0.7.0", "postcss": "^6.0.1" } }, "sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA=="], + + "postcss-modules-scope": ["postcss-modules-scope@1.1.0", "", { "dependencies": { "css-selector-tokenizer": "^0.7.0", "postcss": "^6.0.1" } }, "sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw=="], + + "postcss-modules-values": ["postcss-modules-values@1.3.0", "", { "dependencies": { "icss-replace-symbols": "^1.1.0", "postcss": "^6.0.1" } }, "sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA=="], + + "postcss-normalize-charset": ["postcss-normalize-charset@4.0.1", "", { "dependencies": { "postcss": "^7.0.0" } }, "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g=="], + + "postcss-normalize-display-values": ["postcss-normalize-display-values@4.0.2", "", { "dependencies": { "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ=="], + + "postcss-normalize-positions": ["postcss-normalize-positions@4.0.2", "", { "dependencies": { "cssnano-util-get-arguments": "^4.0.0", "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA=="], + + "postcss-normalize-repeat-style": ["postcss-normalize-repeat-style@4.0.2", "", { "dependencies": { "cssnano-util-get-arguments": "^4.0.0", "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q=="], + + "postcss-normalize-string": ["postcss-normalize-string@4.0.2", "", { "dependencies": { "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA=="], + + "postcss-normalize-timing-functions": ["postcss-normalize-timing-functions@4.0.2", "", { "dependencies": { "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A=="], + + "postcss-normalize-unicode": ["postcss-normalize-unicode@4.0.1", "", { "dependencies": { "browserslist": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg=="], + + "postcss-normalize-url": ["postcss-normalize-url@4.0.1", "", { "dependencies": { "is-absolute-url": "^2.0.0", "normalize-url": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA=="], + + "postcss-normalize-whitespace": ["postcss-normalize-whitespace@4.0.2", "", { "dependencies": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA=="], + + "postcss-ordered-values": ["postcss-ordered-values@4.1.2", "", { "dependencies": { "cssnano-util-get-arguments": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw=="], + + "postcss-reduce-initial": ["postcss-reduce-initial@4.0.3", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", "has": "^1.0.0", "postcss": "^7.0.0" } }, "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA=="], + + "postcss-reduce-transforms": ["postcss-reduce-transforms@4.0.2", "", { "dependencies": { "cssnano-util-get-match": "^4.0.0", "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } }, "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.0.11", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g=="], + + "postcss-svgo": ["postcss-svgo@4.0.3", "", { "dependencies": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" } }, "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw=="], + + "postcss-unique-selectors": ["postcss-unique-selectors@4.0.1", "", { "dependencies": { "alphanum-sort": "^1.0.0", "postcss": "^7.0.0", "uniqs": "^2.0.0" } }, "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "posthtml": ["posthtml@0.15.2", "", { "dependencies": { "posthtml-parser": "^0.7.2", "posthtml-render": "^1.3.1" } }, "sha512-YugEJ5ze/0DLRIVBjCpDwANWL4pPj1kHJ/2llY8xuInr0nbkon3qTiMPe5LQa+cCwNjxS7nAZZTp+1M+6mT4Zg=="], + + "posthtml-parser": ["posthtml-parser@0.6.0", "", { "dependencies": { "htmlparser2": "^5.0.1" } }, "sha512-5ffwKQNgtVHdhZniWxu+1ryvaZv5l25HPLUV6W5xy5nYVWMXtvjtwRnbSpfbKFvbyl7XI+d4AqkjmonkREqnXA=="], + + "posthtml-render": ["posthtml-render@1.4.0", "", {}, "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw=="], + + "prelude-ls": ["prelude-ls@1.1.2", "", {}, "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "progress": ["progress@2.0.1", "", {}, "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "prop-types-extra": ["prop-types-extra@1.1.1", "", { "dependencies": { "react-is": "^16.3.2", "warning": "^4.0.0" }, "peerDependencies": { "react": ">=0.14.0" } }, "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "psl": ["psl@1.9.0", "", {}, "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="], + + "public-encrypt": ["public-encrypt@4.0.3", "", { "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q=="], + + "pump": ["pump@3.0.0", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="], + + "punycode": ["punycode@1.3.2", "", {}, "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="], + + "puppeteer": ["puppeteer@10.4.0", "", { "dependencies": { "debug": "4.3.1", "devtools-protocol": "0.0.901419", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.0", "node-fetch": "2.6.1", "pkg-dir": "4.2.0", "progress": "2.0.1", "proxy-from-env": "1.1.0", "rimraf": "3.0.2", "tar-fs": "2.0.0", "unbzip2-stream": "1.3.3", "ws": "7.4.6" } }, "sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w=="], + + "puppeteer-mass-screenshots": ["puppeteer-mass-screenshots@1.0.15", "", { "dependencies": { "fs": "0.0.1-security", "path": "^0.12.7" } }, "sha512-QasQ6pxkXocZTyVkgIx2uXM5VOTUhXvHw44TJNgoQ2I/pj+DOKqXI0TD5VUOiKAWkjJhCtsJaL9ImQFBJrPWPg=="], + + "puppeteer-video-recorder": ["puppeteer-video-recorder@1.0.5", "", { "dependencies": { "child-process": "^1.0.2", "fs": "0.0.1-security", "path": "^0.12.7", "puppeteer-mass-screenshots": "^1.0.14" } }, "sha512-bulReIiRpf8j9davQwtMcUePW++znA1kpXfA1LP3P+nvpCHW7vuUToXuYXXXYyDQBkaAF7NWroEuoIjW8IENKA=="], + + "purgecss": ["purgecss@2.3.0", "", { "dependencies": { "commander": "^5.0.0", "glob": "^7.0.0", "postcss": "7.0.32", "postcss-selector-parser": "^6.0.2" }, "bin": { "purgecss": "bin/purgecss" } }, "sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ=="], + + "q": ["q@1.5.1", "", {}, "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw=="], + + "qs": ["qs@6.5.3", "", {}, "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="], + + "querystring": ["querystring@0.2.0", "", {}, "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g=="], + + "querystring-es3": ["querystring-es3@0.2.1", "", {}, "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + + "randomfill": ["randomfill@1.0.4", "", { "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw=="], + + "range-parser": ["range-parser@1.2.0", "", {}, "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A=="], + + "rc-align": ["rc-align@4.0.15", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "dom-align": "^1.7.0", "rc-util": "^5.26.0", "resize-observer-polyfill": "^1.5.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA=="], + + "rc-cascader": ["rc-cascader@3.7.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "array-tree-filter": "^2.1.0", "classnames": "^2.3.1", "rc-select": "~14.1.0", "rc-tree": "~5.7.0", "rc-util": "^5.6.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-SFtGpwmYN7RaWEAGTS4Rkc62ZV/qmQGg/tajr/7mfIkleuu8ro9Hlk6J+aA0x1YS4zlaZBtTcSaXM01QMiEV/A=="], + + "rc-checkbox": ["rc-checkbox@2.3.2", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg=="], + + "rc-collapse": ["rc-collapse@3.4.2", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "rc-motion": "^2.3.4", "rc-util": "^5.2.1", "shallowequal": "^1.1.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q=="], + + "rc-dialog": ["rc-dialog@9.0.2", "", { "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/portal": "^1.0.0-8", "classnames": "^2.2.6", "rc-motion": "^2.3.0", "rc-util": "^5.21.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg=="], + + "rc-drawer": ["rc-drawer@6.1.3", "", { "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/portal": "^1.0.0-6", "classnames": "^2.2.6", "rc-motion": "^2.6.1", "rc-util": "^5.21.2" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-AvHisO90A+xMLMKBw2zs89HxjWxusM2BUABlgK60RhweIHF8W/wk0hSOrxBlUXoA9r1F+10na3g6GZ97y1qDZA=="], + + "rc-dropdown": ["rc-dropdown@4.0.1", "", { "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.6", "rc-trigger": "^5.3.1", "rc-util": "^5.17.0" }, "peerDependencies": { "react": ">=16.11.0", "react-dom": ">=16.11.0" } }, "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g=="], + + "rc-field-form": ["rc-field-form@1.27.4", "", { "dependencies": { "@babel/runtime": "^7.18.0", "async-validator": "^4.1.0", "rc-util": "^5.8.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-PQColQnZimGKArnOh8V2907+VzDCXcqtFvHgevDLtqWc/P7YASb/FqntSmdS8q3VND5SHX3Y1vgMIzY22/f/0Q=="], + + "rc-image": ["rc-image@5.13.0", "", { "dependencies": { "@babel/runtime": "^7.11.2", "@rc-component/portal": "^1.0.2", "classnames": "^2.2.6", "rc-dialog": "~9.0.0", "rc-motion": "^2.6.2", "rc-util": "^5.0.6" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg=="], + + "rc-input": ["rc-input@0.1.4", "", { "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", "rc-util": "^5.18.1" }, "peerDependencies": { "react": ">=16.0.0", "react-dom": ">=16.0.0" } }, "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA=="], + + "rc-input-number": ["rc-input-number@7.3.11", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", "rc-util": "^5.23.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA=="], + + "rc-mentions": ["rc-mentions@1.13.1", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.6", "rc-menu": "~9.8.0", "rc-textarea": "^0.4.0", "rc-trigger": "^5.0.4", "rc-util": "^5.22.5" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw=="], + + "rc-menu": ["rc-menu@9.8.2", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "rc-motion": "^2.4.3", "rc-overflow": "^1.2.8", "rc-trigger": "^5.1.2", "rc-util": "^5.27.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-EahOJVjLuEnJsThoPN+mGnVm431RzVzDLZWHRS/YnXTQULa7OsgdJa/Y7qXxc3Z5sz8mgT6xYtgpmBXLxrZFaQ=="], + + "rc-motion": ["rc-motion@2.6.3", "", { "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", "rc-util": "^5.21.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-xFLkes3/7VL/J+ah9jJruEW/Akbx5F6jVa2wG5o/ApGKQKSOd5FR3rseHLL9+xtJg4PmCwo6/1tqhDO/T+jFHA=="], + + "rc-notification": ["rc-notification@4.6.1", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "rc-motion": "^2.2.0", "rc-util": "^5.20.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw=="], + + "rc-overflow": ["rc-overflow@1.2.8", "", { "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", "rc-resize-observer": "^1.0.0", "rc-util": "^5.19.2" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-QJ0UItckWPQ37ZL1dMEBAdY1dhfTXFL9k6oTTcyydVwoUNMnMqCGqnRNA98axSr/OeDKqR6DVFyi8eA5RQI/uQ=="], + + "rc-pagination": ["rc-pagination@3.2.0", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w=="], + + "rc-picker": ["rc-picker@2.7.0", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", "date-fns": "2.x", "dayjs": "1.x", "moment": "^2.24.0", "rc-trigger": "^5.0.4", "rc-util": "^5.4.0", "shallowequal": "^1.1.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-oZH6FZ3j4iuBxHB4NvQ6ABRsS2If/Kpty1YFFsji7/aej6ruGmfM7WnJWQ88AoPfpJ++ya5z+nVEA8yCRYGKyw=="], + + "rc-progress": ["rc-progress@3.4.1", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.6", "rc-util": "^5.16.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw=="], + + "rc-rate": ["rc-rate@2.9.2", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", "rc-util": "^5.0.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g=="], + + "rc-resize-observer": ["rc-resize-observer@1.3.1", "", { "dependencies": { "@babel/runtime": "^7.20.7", "classnames": "^2.2.1", "rc-util": "^5.27.0", "resize-observer-polyfill": "^1.5.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg=="], + + "rc-segmented": ["rc-segmented@2.1.2", "", { "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", "rc-motion": "^2.4.4", "rc-util": "^5.17.0" }, "peerDependencies": { "react": ">=16.0.0", "react-dom": ">=16.0.0" } }, "sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ=="], + + "rc-select": ["rc-select@14.1.16", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "rc-motion": "^2.0.1", "rc-overflow": "^1.0.0", "rc-trigger": "^5.0.4", "rc-util": "^5.16.1", "rc-virtual-list": "^3.2.0" }, "peerDependencies": { "react": "*", "react-dom": "*" } }, "sha512-71XLHleuZmufpdV2vis5oituRkhg2WNvLpVMJBGWRar6WGAVOHXaY9DR5HvwWry3EGTn19BqnL6Xbybje6f8YA=="], + + "rc-slider": ["rc-slider@10.0.1", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", "rc-util": "^5.18.1", "shallowequal": "^1.1.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q=="], + + "rc-steps": ["rc-steps@5.0.0-alpha.2", "", { "dependencies": { "@babel/runtime": "^7.16.7", "classnames": "^2.2.3", "rc-util": "^5.16.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-WPH5jgLnQ1OJHs5SnSp46Ep0wqK0afT1+6MVc4sU9uD+7W1v6Ccisrz0v1ZCsTmQJVwiD7mwVaZ+l75iMHcrvg=="], + + "rc-switch": ["rc-switch@3.2.2", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", "rc-util": "^5.0.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A=="], + + "rc-table": ["rc-table@7.26.0", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", "rc-resize-observer": "^1.1.0", "rc-util": "^5.22.5", "shallowequal": "^1.1.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ=="], + + "rc-tabs": ["rc-tabs@12.5.6", "", { "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "2.x", "rc-dropdown": "~4.0.0", "rc-menu": "~9.8.0", "rc-motion": "^2.6.2", "rc-resize-observer": "^1.0.0", "rc-util": "^5.16.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-aArXHzxK7YICxe+622CZ8FlO5coMi8P7E6tXpseCPKm1gdTjUt0LrQK1/AxcrRXZXG3K4QqhlKmET0+cX5DQaQ=="], + + "rc-textarea": ["rc-textarea@0.4.7", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", "rc-resize-observer": "^1.0.0", "rc-util": "^5.24.4", "shallowequal": "^1.1.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ=="], + + "rc-tooltip": ["rc-tooltip@5.2.2", "", { "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "^2.3.1", "rc-trigger": "^5.0.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg=="], + + "rc-tree": ["rc-tree@5.7.2", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "rc-motion": "^2.0.1", "rc-util": "^5.16.1", "rc-virtual-list": "^3.4.8" }, "peerDependencies": { "react": "*", "react-dom": "*" } }, "sha512-nmnL6qLnfwVckO5zoqKL2I9UhwDqzyCtjITQCkwhimyz1zfuFkG5ZPIXpzD/Guzso94qQA/QrMsvzic5W6QDjg=="], + + "rc-tree-select": ["rc-tree-select@5.5.5", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "rc-select": "~14.1.0", "rc-tree": "~5.7.0", "rc-util": "^5.16.1" }, "peerDependencies": { "react": "*", "react-dom": "*" } }, "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw=="], + + "rc-trigger": ["rc-trigger@5.3.4", "", { "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.6", "rc-align": "^4.0.0", "rc-motion": "^2.0.0", "rc-util": "^5.19.2" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw=="], + + "rc-upload": ["rc-upload@4.3.4", "", { "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.5", "rc-util": "^5.2.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ=="], + + "rc-util": ["rc-util@5.27.2", "", { "dependencies": { "@babel/runtime": "^7.18.3", "react-is": "^16.12.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-8XHRbeJOWlTR2Hk1K2xLaPOf7lZu+3taskAGuqOPccA676vB3ygrz3ZgdrA3wml40CzR9RlIEHDWwI7FZT3wBQ=="], + + "rc-virtual-list": ["rc-virtual-list@3.4.13", "", { "dependencies": { "@babel/runtime": "^7.20.0", "classnames": "^2.2.6", "rc-resize-observer": "^1.0.0", "rc-util": "^5.15.0" }, "peerDependencies": { "react": "*", "react-dom": "*" } }, "sha512-cPOVDmcNM7rH6ANotanMDilW/55XnFPw0Jh/GQYtrzZSy3AmWvCnqVNyNC/pgg3lfVmX2994dlzAhuUrd4jG7w=="], + + "react": ["react@17.0.2", "", { "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA=="], + + "react-bootstrap": ["react-bootstrap@1.6.6", "", { "dependencies": { "@babel/runtime": "^7.14.0", "@restart/context": "^2.1.4", "@restart/hooks": "^0.4.7", "@types/invariant": "^2.2.33", "@types/prop-types": "^15.7.3", "@types/react": ">=16.14.8", "@types/react-transition-group": "^4.4.1", "@types/warning": "^3.0.0", "classnames": "^2.3.1", "dom-helpers": "^5.2.1", "invariant": "^2.2.4", "prop-types": "^15.7.2", "prop-types-extra": "^1.1.0", "react-overlays": "^5.1.2", "react-transition-group": "^4.4.1", "uncontrollable": "^7.2.1", "warning": "^4.0.3" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-pSzYyJT5u4rc8+5myM8Vid2JG52L8AmYSkpznReH/GM4+FhLqEnxUa0+6HRTaGwjdEixQNGchwY+b3xCdYWrDA=="], + + "react-dom": ["react-dom@17.0.2", "", { "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "scheduler": "^0.20.2" }, "peerDependencies": { "react": "17.0.2" } }, "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA=="], + + "react-form": ["react-form@4.0.1", "", { "peerDependencies": { "prop-types": "^15.5.4", "react": "^16.8.3" } }, "sha512-vhsCuBLZJYjm6vd8TBxIhIWeB/8Jg4mmmiR3Zj+1zIGBM39qJf1CLqekadLp0J9NeW0EsZxUnBtbmEnMeZ/7Pw=="], + + "react-hook-form": ["react-hook-form@7.43.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18" } }, "sha512-+s3+s8LLytRMriwwuSqeLStVjRXFGxgjjx2jED7Z+wz1J/88vpxieRQGvJVvzrzVxshZ0BRuocFERb779m2kNg=="], + + "react-is": ["react-is@18.2.0", "", {}, "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="], + + "react-lifecycles-compat": ["react-lifecycles-compat@3.0.4", "", {}, "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="], + + "react-overlays": ["react-overlays@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.13.8", "@popperjs/core": "^2.11.6", "@restart/hooks": "^0.4.7", "@types/warning": "^3.0.0", "dom-helpers": "^5.2.0", "prop-types": "^15.7.2", "uncontrollable": "^7.2.1", "warning": "^4.0.3" }, "peerDependencies": { "react": ">=16.3.0", "react-dom": ">=16.3.0" } }, "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA=="], + + "react-refresh": ["react-refresh@0.9.0", "", {}, "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ=="], + + "react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="], + + "readable-stream": ["readable-stream@2.3.7", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw=="], + + "regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="], + + "regex-not": ["regex-not@1.0.2", "", { "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" } }, "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.4.3", "", { "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "functions-have-names": "^1.2.2" } }, "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA=="], + + "relateurl": ["relateurl@0.2.7", "", {}, "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="], + + "repeat-element": ["repeat-element@1.1.4", "", {}, "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ=="], + + "repeat-string": ["repeat-string@1.6.1", "", {}, "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="], + + "request": ["request@2.88.2", "", { "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="], + + "request-promise-core": ["request-promise-core@1.1.4", "", { "dependencies": { "lodash": "^4.17.19" }, "peerDependencies": { "request": "^2.34" } }, "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw=="], + + "request-promise-native": ["request-promise-native@1.0.9", "", { "dependencies": { "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, "peerDependencies": { "request": "^2.34" } }, "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g=="], + + "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], + + "resize-observer-polyfill": ["resize-observer-polyfill@1.5.1", "", {}, "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="], + + "resolve": ["resolve@1.22.1", "", { "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "resolve-url": ["resolve-url@0.2.1", "", {}, "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg=="], + + "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], + + "ret": ["ret@0.1.15", "", {}, "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="], + + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + + "rgb-regex": ["rgb-regex@1.0.1", "", {}, "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w=="], + + "rgba-regex": ["rgba-regex@1.0.0", "", {}, "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg=="], + + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "ripemd160": ["ripemd160@2.0.2", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-regex": ["safe-regex@1.1.0", "", { "dependencies": { "ret": "~0.1.10" } }, "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg=="], + + "safe-regex-test": ["safe-regex-test@1.0.0", "", { "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" } }, "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sax": ["sax@1.2.4", "", {}, "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="], + + "saxes": ["saxes@3.1.11", "", { "dependencies": { "xmlchars": "^2.1.1" } }, "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g=="], + + "scheduler": ["scheduler@0.20.2", "", { "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ=="], + + "scroll-into-view-if-needed": ["scroll-into-view-if-needed@2.2.31", "", { "dependencies": { "compute-scroll-into-view": "^1.0.20" } }, "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA=="], + + "semver": ["semver@6.3.0", "", { "bin": { "semver": "./bin/semver.js" } }, "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="], + + "serve-handler": ["serve-handler@6.1.5", "", { "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "fast-url-parser": "1.1.3", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "2.2.1", "range-parser": "1.2.0" } }, "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg=="], + + "set-value": ["set-value@2.0.1", "", { "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" } }, "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw=="], + + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + + "sha.js": ["sha.js@2.4.11", "", { "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" }, "bin": { "sha.js": "./bin.js" } }, "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ=="], + + "shallowequal": ["shallowequal@1.1.0", "", {}, "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="], + + "shebang-command": ["shebang-command@1.2.0", "", { "dependencies": { "shebang-regex": "^1.0.0" } }, "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg=="], + + "shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="], + + "side-channel": ["side-channel@1.0.4", "", { "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" } }, "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "slice-ansi": ["slice-ansi@4.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ=="], + + "snapdragon": ["snapdragon@0.8.2", "", { "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "map-cache": "^0.2.2", "source-map": "^0.5.6", "source-map-resolve": "^0.5.0", "use": "^3.1.0" } }, "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg=="], + + "snapdragon-node": ["snapdragon-node@2.1.1", "", { "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" } }, "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw=="], + + "snapdragon-util": ["snapdragon-util@3.0.1", "", { "dependencies": { "kind-of": "^3.2.0" } }, "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ=="], + + "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "source-map-js": ["source-map-js@1.0.2", "", {}, "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="], + + "source-map-resolve": ["source-map-resolve@0.5.3", "", { "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", "urix": "^0.1.0" } }, "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "source-map-url": ["source-map-url@0.4.1", "", {}, "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw=="], + + "split-string": ["split-string@3.1.0", "", { "dependencies": { "extend-shallow": "^3.0.0" } }, "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw=="], + + "split2": ["split2@3.2.2", "", { "dependencies": { "readable-stream": "^3.0.0" } }, "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "srcset": ["srcset@3.0.1", "", {}, "sha512-MM8wDGg5BQJEj94tDrZDrX9wrC439/Eoeg3sgmVLPMjHgrAFeXAKk3tmFlCbKw5k+yOEhPXRpPlRcisQmqWVSQ=="], + + "sshpk": ["sshpk@1.17.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ=="], + + "stable": ["stable@0.1.8", "", {}, "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="], + + "static-extend": ["static-extend@0.1.2", "", { "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" } }, "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g=="], + + "statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], + + "stealthy-require": ["stealthy-require@1.1.1", "", {}, "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g=="], + + "stream-http": ["stream-http@3.2.0", "", { "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" } }, "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A=="], + + "string-convert": ["string-convert@0.2.1", "", {}, "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="], + + "string-hash": ["string-hash@1.1.3", "", {}, "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.6", "", { "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.6", "", { "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA=="], + + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "styled-jsx": ["styled-jsx@5.0.7", "", { "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" } }, "sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA=="], + + "stylehacks": ["stylehacks@4.0.3", "", { "dependencies": { "browserslist": "^4.0.0", "postcss": "^7.0.0", "postcss-selector-parser": "^3.0.0" } }, "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g=="], + + "stylis": ["stylis@4.1.3", "", {}, "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "svgo": ["svgo@1.3.2", "", { "dependencies": { "chalk": "^2.4.1", "coa": "^2.0.2", "css-select": "^2.0.0", "css-select-base-adapter": "^0.1.1", "css-tree": "1.0.0-alpha.37", "csso": "^4.0.2", "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", "object.values": "^1.1.0", "sax": "~1.2.4", "stable": "^0.1.8", "unquote": "~1.1.1", "util.promisify": "~1.0.0" }, "bin": { "svgo": "./bin/svgo" } }, "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw=="], + + "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], + + "tar-fs": ["tar-fs@2.0.0", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp": "^0.5.1", "pump": "^3.0.0", "tar-stream": "^2.0.0" } }, "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA=="], + + "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + + "term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="], + + "terser": ["terser@5.16.4", "", { "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "timers-browserify": ["timers-browserify@2.0.12", "", { "dependencies": { "setimmediate": "^1.0.4" } }, "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ=="], + + "timsort": ["timsort@0.3.0", "", {}, "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A=="], + + "to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="], + + "to-object-path": ["to-object-path@0.3.0", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg=="], + + "to-regex": ["to-regex@3.0.2", "", { "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" } }, "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toggle-selection": ["toggle-selection@1.0.6", "", {}, "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="], + + "tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="], + + "tr46": ["tr46@1.0.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA=="], + + "tslib": ["tslib@2.5.0", "", {}, "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="], + + "tty-browserify": ["tty-browserify@0.0.1", "", {}, "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="], + + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + + "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], + + "type-check": ["type-check@0.3.2", "", { "dependencies": { "prelude-ls": "~1.1.2" } }, "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg=="], + + "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], + + "typed-array-length": ["typed-array-length@1.0.4", "", { "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "is-typed-array": "^1.1.9" } }, "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng=="], + + "typescript": ["typescript@4.9.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="], + + "unbox-primitive": ["unbox-primitive@1.0.2", "", { "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw=="], + + "unbzip2-stream": ["unbzip2-stream@1.3.3", "", { "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg=="], + + "uncontrollable": ["uncontrollable@7.2.1", "", { "dependencies": { "@babel/runtime": "^7.6.3", "@types/react": ">=16.9.11", "invariant": "^2.2.4", "react-lifecycles-compat": "^3.0.4" }, "peerDependencies": { "react": ">=15.0.0" } }, "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ=="], + + "uncss": ["uncss@0.17.3", "", { "dependencies": { "commander": "^2.20.0", "glob": "^7.1.4", "is-absolute-url": "^3.0.1", "is-html": "^1.1.0", "jsdom": "^14.1.0", "lodash": "^4.17.15", "postcss": "^7.0.17", "postcss-selector-parser": "6.0.2", "request": "^2.88.0" }, "bin": { "uncss": "bin/uncss" } }, "sha512-ksdDWl81YWvF/X14fOSw4iu8tESDHFIeyKIeDrK6GEVTQvqJc1WlOEXqostNwOCi3qAj++4EaLsdAgPmUbEyog=="], + + "union-value": ["union-value@1.0.1", "", { "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" } }, "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg=="], + + "uniq": ["uniq@1.0.1", "", {}, "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA=="], + + "uniqs": ["uniqs@2.0.0", "", {}, "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "unquote": ["unquote@1.1.1", "", {}, "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg=="], + + "unset-value": ["unset-value@1.0.0", "", { "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" } }, "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ=="], + + "update-browserslist-db": ["update-browserslist-db@1.0.10", "", { "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "browserslist-lint": "cli.js" } }, "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "urix": ["urix@0.1.0", "", {}, "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg=="], + + "url": ["url@0.11.0", "", { "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" } }, "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ=="], + + "use": ["use@3.1.1", "", {}, "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.2.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA=="], + + "util": ["util@0.10.4", "", { "dependencies": { "inherits": "2.0.3" } }, "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "util.promisify": ["util.promisify@1.0.1", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" } }, "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA=="], + + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], + + "v8-compile-cache": ["v8-compile-cache@2.3.0", "", {}, "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA=="], + + "vendors": ["vendors@1.0.4", "", {}, "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w=="], + + "verror": ["verror@1.10.0", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw=="], + + "vm-browserify": ["vm-browserify@1.1.2", "", {}, "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="], + + "w3c-hr-time": ["w3c-hr-time@1.0.2", "", { "dependencies": { "browser-process-hrtime": "^1.0.0" } }, "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ=="], + + "w3c-xmlserializer": ["w3c-xmlserializer@1.1.2", "", { "dependencies": { "domexception": "^1.0.1", "webidl-conversions": "^4.0.2", "xml-name-validator": "^3.0.0" } }, "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg=="], + + "warning": ["warning@4.0.3", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w=="], + + "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], + + "webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="], + + "whatwg-encoding": ["whatwg-encoding@1.0.5", "", { "dependencies": { "iconv-lite": "0.4.24" } }, "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw=="], + + "whatwg-mimetype": ["whatwg-mimetype@2.3.0", "", {}, "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="], + + "whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], + + "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.0.2", "", { "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" } }, "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg=="], + + "which-typed-array": ["which-typed-array@1.1.9", "", { "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", "is-typed-array": "^1.1.10" } }, "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA=="], + + "wipwipwipwip-next-donotuse": ["wipwipwipwip-next-donotuse@4.0.0", "", {}, "sha512-VlhmxFbJ/wy7yMb4ekP6R46gUAE1vjpRA5qFrk7XqADckQHRkE0+3aDUGn2j3tidJPAOmMEVjU5dgLpeWT/C5g=="], + + "word-wrap": ["word-wrap@1.2.3", "", {}, "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@7.4.6", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="], + + "xml-name-validator": ["xml-name-validator@3.0.0", "", {}, "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="], + + "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "@babel/core/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], + + "@babel/generator/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.2", "", { "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } }, "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "@babel/traverse/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], + + "@jridgewell/source-map/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.2", "", { "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } }, "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A=="], + + "@parcel/core/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "@parcel/core/querystring": ["querystring@0.2.1", "", {}, "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg=="], + + "@parcel/core/semver": ["semver@5.7.1", "", { "bin": { "semver": "./bin/semver" } }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="], + + "@parcel/node-libs-browser/punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], + + "@parcel/node-libs-browser/readable-stream": ["readable-stream@3.6.0", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="], + + "@parcel/node-libs-browser/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "@parcel/node-libs-browser/util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], + + "@parcel/node-resolver-core/micromatch": ["micromatch@3.1.10", "", { "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "extglob": "^2.0.4", "fragment-cache": "^0.2.1", "kind-of": "^6.0.2", "nanomatch": "^1.2.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } }, "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg=="], + + "@parcel/node-resolver-core/querystring": ["querystring@0.2.1", "", {}, "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg=="], + + "@parcel/optimizer-cssnano/postcss": ["postcss@8.4.21", "", { "dependencies": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg=="], + + "@parcel/package-manager/semver": ["semver@5.7.1", "", { "bin": { "semver": "./bin/semver" } }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="], + + "@parcel/packager-css/postcss": ["postcss@8.4.21", "", { "dependencies": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg=="], + + "@parcel/packager-js/globals": ["globals@13.20.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ=="], + + "@parcel/reporter-dev-server/ws": ["ws@7.5.9", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="], + + "@parcel/transformer-babel/semver": ["semver@5.7.1", "", { "bin": { "semver": "./bin/semver" } }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="], + + "@parcel/transformer-css/postcss": ["postcss@8.4.21", "", { "dependencies": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg=="], + + "@parcel/transformer-css/semver": ["semver@5.7.1", "", { "bin": { "semver": "./bin/semver" } }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="], + + "@parcel/transformer-html/semver": ["semver@5.7.1", "", { "bin": { "semver": "./bin/semver" } }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="], + + "@parcel/transformer-js/@swc/helpers": ["@swc/helpers@0.2.14", "", {}, "sha512-wpCQMhf5p5GhNg2MmGKXzUNwxe7zRiCsmqYsamez2beP7mKPCSiu+BjZcdN95yYSzO857kr0VfQewmGpS77nqA=="], + + "@parcel/transformer-js/semver": ["semver@5.7.1", "", { "bin": { "semver": "./bin/semver" } }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="], + + "@parcel/transformer-postcss/semver": ["semver@5.7.1", "", { "bin": { "semver": "./bin/semver" } }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="], + + "@parcel/transformer-posthtml/semver": ["semver@5.7.1", "", { "bin": { "semver": "./bin/semver" } }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="], + + "@parcel/utils/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "@vitejs/plugin-react-refresh/react-refresh": ["react-refresh@0.10.0", "", {}, "sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ=="], + + "acorn-globals/acorn": ["acorn@6.4.2", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ=="], + + "agent-base/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], + + "asn1.js/bn.js": ["bn.js@4.12.0", "", {}, "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="], + + "assert/util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], + + "base/define-property": ["define-property@1.0.0", "", { "dependencies": { "is-descriptor": "^1.0.0" } }, "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA=="], + + "bl/readable-stream": ["readable-stream@3.6.0", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="], + + "browserify-sign/readable-stream": ["readable-stream@3.6.0", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="], + + "caller-callsite/callsites": ["callsites@2.0.0", "", {}, "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ=="], + + "class-utils/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="], + + "coa/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "color/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "create-ecdh/bn.js": ["bn.js@4.12.0", "", {}, "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="], + + "cross-spawn/semver": ["semver@5.7.1", "", { "bin": { "semver": "./bin/semver" } }, "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="], + + "css-declaration-sorter/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "css-modules-loader-core/postcss": ["postcss@6.0.1", "", { "dependencies": { "chalk": "^1.1.3", "source-map": "^0.5.6", "supports-color": "^3.2.3" } }, "sha512-VbGX1LQgQbf9l3cZ3qbUuC3hGqIEOGQFHAEHQ/Diaeo0yLgpgK5Rb8J+OcamIfQ9PbAU/fzBjVtQX3AhJHUvZw=="], + + "css-select/domutils": ["domutils@1.7.0", "", { "dependencies": { "dom-serializer": "0", "domelementtype": "1" } }, "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg=="], + + "css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "cssnano/cosmiconfig": ["cosmiconfig@5.2.1", "", { "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" } }, "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="], + + "cssnano/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "cssnano-preset-default/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "cssnano-util-raw-cache/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "csso/css-tree": ["css-tree@1.1.3", "", { "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="], + + "defaults/clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], + + "diffie-hellman/bn.js": ["bn.js@4.12.0", "", {}, "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="], + + "dom-serializer/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], + + "domutils/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], + + "elliptic/bn.js": ["bn.js@4.12.0", "", {}, "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="], + + "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "expand-brackets/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "expand-brackets/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="], + + "expand-brackets/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "extglob/define-property": ["define-property@1.0.0", "", { "dependencies": { "is-descriptor": "^1.0.0" } }, "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA=="], + + "extglob/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "extract-zip/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], + + "fast-url-parser/punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], + + "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "globby/fast-glob": ["fast-glob@3.2.12", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w=="], + + "has-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "has-values/is-number": ["is-number@3.0.0", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg=="], + + "has-values/kind-of": ["kind-of@4.0.0", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw=="], + + "hash-base/readable-stream": ["readable-stream@3.6.0", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="], + + "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "https-proxy-agent/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], + + "icss-utils/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "jsdom/acorn": ["acorn@6.4.2", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ=="], + + "jsdom/ws": ["ws@6.2.2", "", { "dependencies": { "async-limiter": "~1.0.0" } }, "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw=="], + + "loader-utils/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "miller-rabin/bn.js": ["bn.js@4.12.0", "", {}, "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="], + + "object-copy/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="], + + "object-copy/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "postcss-calc/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-colormin/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-colormin/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-convert-values/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-convert-values/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-discard-comments/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-discard-duplicates/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-discard-empty/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-discard-overridden/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-merge-longhand/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-merge-longhand/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-merge-rules/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-merge-rules/postcss-selector-parser": ["postcss-selector-parser@3.1.2", "", { "dependencies": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } }, "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA=="], + + "postcss-minify-font-values/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-minify-font-values/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-minify-gradients/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-minify-gradients/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-minify-params/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-minify-params/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-minify-selectors/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-minify-selectors/postcss-selector-parser": ["postcss-selector-parser@3.1.2", "", { "dependencies": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } }, "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA=="], + + "postcss-modules/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-modules/postcss-modules-extract-imports": ["postcss-modules-extract-imports@2.0.0", "", { "dependencies": { "postcss": "^7.0.5" } }, "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ=="], + + "postcss-modules/postcss-modules-local-by-default": ["postcss-modules-local-by-default@3.0.3", "", { "dependencies": { "icss-utils": "^4.1.1", "postcss": "^7.0.32", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" } }, "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw=="], + + "postcss-modules/postcss-modules-scope": ["postcss-modules-scope@2.2.0", "", { "dependencies": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" } }, "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ=="], + + "postcss-modules/postcss-modules-values": ["postcss-modules-values@3.0.0", "", { "dependencies": { "icss-utils": "^4.0.0", "postcss": "^7.0.6" } }, "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg=="], + + "postcss-modules-extract-imports/postcss": ["postcss@6.0.23", "", { "dependencies": { "chalk": "^2.4.1", "source-map": "^0.6.1", "supports-color": "^5.4.0" } }, "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag=="], + + "postcss-modules-local-by-default/postcss": ["postcss@6.0.23", "", { "dependencies": { "chalk": "^2.4.1", "source-map": "^0.6.1", "supports-color": "^5.4.0" } }, "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag=="], + + "postcss-modules-scope/postcss": ["postcss@6.0.23", "", { "dependencies": { "chalk": "^2.4.1", "source-map": "^0.6.1", "supports-color": "^5.4.0" } }, "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag=="], + + "postcss-modules-values/postcss": ["postcss@6.0.23", "", { "dependencies": { "chalk": "^2.4.1", "source-map": "^0.6.1", "supports-color": "^5.4.0" } }, "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag=="], + + "postcss-normalize-charset/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-normalize-display-values/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-normalize-display-values/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-normalize-positions/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-normalize-positions/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-normalize-repeat-style/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-normalize-repeat-style/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-normalize-string/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-normalize-string/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-normalize-timing-functions/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-normalize-timing-functions/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-normalize-unicode/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-normalize-unicode/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-normalize-url/is-absolute-url": ["is-absolute-url@2.1.0", "", {}, "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg=="], + + "postcss-normalize-url/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-normalize-url/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-normalize-whitespace/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-normalize-whitespace/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-ordered-values/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-ordered-values/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-reduce-initial/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-reduce-transforms/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-reduce-transforms/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-svgo/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "postcss-svgo/postcss-value-parser": ["postcss-value-parser@3.3.1", "", {}, "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="], + + "postcss-unique-selectors/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "posthtml/posthtml-parser": ["posthtml-parser@0.7.2", "", { "dependencies": { "htmlparser2": "^6.0.0" } }, "sha512-LjEEG/3fNcWZtBfsOE3Gbyg1Li4CmsZRkH1UmbMR7nKdMXVMYI3B4/ZMiCpaq8aI1Aym4FRMMW9SAOLSwOnNsQ=="], + + "posthtml/posthtml-render": ["posthtml-render@1.3.1", "", {}, "sha512-eSToKjNLu0FiF76SSGMHjOFXYzAc/CJqi677Sq6hYvcvFCBtD6de/W5l+0IYPf7ypscqAfjCttxvTdMJt5Gj8Q=="], + + "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "prop-types-extra/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "public-encrypt/bn.js": ["bn.js@4.12.0", "", {}, "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="], + + "purgecss/commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], + + "purgecss/postcss": ["postcss@7.0.32", "", { "dependencies": { "chalk": "^2.4.2", "source-map": "^0.6.1", "supports-color": "^6.1.0" } }, "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw=="], + + "rc-image/@rc-component/portal": ["@rc-component/portal@1.1.0", "", { "dependencies": { "@babel/runtime": "^7.18.0", "classnames": "^2.3.2", "rc-util": "^5.24.4" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-tbXM9SB1r5FOuZjRCljERFByFiEUcMmCWMXLog/NmgCzlAzreXyf23Vei3ZpSMxSMavzPnhCovfZjZdmxS3d1w=="], + + "rc-util/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "request/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "set-value/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "set-value/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "simple-swizzle/is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], + + "snapdragon/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "snapdragon/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="], + + "snapdragon/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "snapdragon-node/define-property": ["define-property@1.0.0", "", { "dependencies": { "is-descriptor": "^1.0.0" } }, "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA=="], + + "snapdragon-util/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "split2/readable-stream": ["readable-stream@3.6.0", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="], + + "static-extend/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="], + + "stream-http/readable-stream": ["readable-stream@3.6.0", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="], + + "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "stylehacks/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "stylehacks/postcss-selector-parser": ["postcss-selector-parser@3.1.2", "", { "dependencies": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } }, "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA=="], + + "svgo/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "tar-stream/readable-stream": ["readable-stream@3.6.0", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="], + + "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "to-object-path/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "tough-cookie/punycode": ["punycode@2.3.0", "", {}, "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="], + + "tr46/punycode": ["punycode@2.3.0", "", {}, "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="], + + "uncss/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "uncss/postcss": ["postcss@7.0.39", "", { "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" } }, "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="], + + "uncss/postcss-selector-parser": ["postcss-selector-parser@6.0.2", "", { "dependencies": { "cssesc": "^3.0.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } }, "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg=="], + + "union-value/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "unset-value/has-value": ["has-value@0.3.1", "", { "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" } }, "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q=="], + + "uri-js/punycode": ["punycode@2.3.0", "", {}, "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="], + + "util/inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="], + + "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], + + "verror/extsprintf": ["extsprintf@1.4.1", "", {}, "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="], + + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "@parcel/node-resolver-core/micromatch/braces": ["braces@2.3.2", "", { "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", "extend-shallow": "^2.0.1", "fill-range": "^4.0.0", "isobject": "^3.0.1", "repeat-element": "^1.1.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" } }, "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w=="], + + "bl/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "browserify-sign/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "class-utils/define-property/is-descriptor": ["is-descriptor@0.1.6", "", { "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="], + + "coa/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "coa/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "coa/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "color/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "css-declaration-sorter/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "css-declaration-sorter/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "css-modules-loader-core/postcss/chalk": ["chalk@1.1.3", "", { "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } }, "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A=="], + + "css-modules-loader-core/postcss/supports-color": ["supports-color@3.2.3", "", { "dependencies": { "has-flag": "^1.0.0" } }, "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A=="], + + "css-select/domutils/dom-serializer": ["dom-serializer@0.2.2", "", { "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" } }, "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g=="], + + "css-select/domutils/domelementtype": ["domelementtype@1.3.1", "", {}, "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="], + + "cssnano-preset-default/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "cssnano-preset-default/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "cssnano-util-raw-cache/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "cssnano-util-raw-cache/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "cssnano/cosmiconfig/import-fresh": ["import-fresh@2.0.0", "", { "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg=="], + + "cssnano/cosmiconfig/parse-json": ["parse-json@4.0.0", "", { "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw=="], + + "cssnano/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "cssnano/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.14", "", {}, "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="], + + "csso/css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "expand-brackets/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "expand-brackets/define-property/is-descriptor": ["is-descriptor@0.1.6", "", { "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="], + + "expand-brackets/extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "extglob/extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "has-values/is-number/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "hash-base/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "icss-utils/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "icss-utils/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "object-copy/define-property/is-descriptor": ["is-descriptor@0.1.6", "", { "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="], + + "postcss-calc/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-calc/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-colormin/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-colormin/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-convert-values/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-convert-values/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-discard-comments/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-discard-comments/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-discard-duplicates/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-discard-duplicates/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-discard-empty/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-discard-empty/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-discard-overridden/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-discard-overridden/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-merge-longhand/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-merge-longhand/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-merge-rules/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-merge-rules/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-minify-font-values/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-minify-font-values/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-minify-gradients/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-minify-gradients/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-minify-params/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-minify-params/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-minify-selectors/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-minify-selectors/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-modules-extract-imports/postcss/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "postcss-modules-extract-imports/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-modules-extract-imports/postcss/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "postcss-modules-local-by-default/postcss/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "postcss-modules-local-by-default/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-modules-local-by-default/postcss/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "postcss-modules-scope/postcss/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "postcss-modules-scope/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-modules-scope/postcss/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "postcss-modules-values/postcss/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "postcss-modules-values/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-modules-values/postcss/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "postcss-modules/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-modules/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-normalize-charset/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-normalize-charset/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-normalize-display-values/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-normalize-display-values/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-normalize-positions/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-normalize-positions/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-normalize-repeat-style/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-normalize-repeat-style/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-normalize-string/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-normalize-string/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-normalize-timing-functions/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-normalize-timing-functions/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-normalize-unicode/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-normalize-unicode/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-normalize-url/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-normalize-url/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-normalize-whitespace/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-normalize-whitespace/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-ordered-values/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-ordered-values/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-reduce-initial/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-reduce-initial/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-reduce-transforms/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-reduce-transforms/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-svgo/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-svgo/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "postcss-unique-selectors/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "postcss-unique-selectors/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "posthtml/posthtml-parser/htmlparser2": ["htmlparser2@6.1.0", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", "domutils": "^2.5.2", "entities": "^2.0.0" } }, "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A=="], + + "purgecss/postcss/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "purgecss/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "purgecss/postcss/supports-color": ["supports-color@6.1.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ=="], + + "request/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "snapdragon/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "snapdragon/define-property/is-descriptor": ["is-descriptor@0.1.6", "", { "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="], + + "snapdragon/extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "split2/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "static-extend/define-property/is-descriptor": ["is-descriptor@0.1.6", "", { "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" } }, "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg=="], + + "stream-http/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "stylehacks/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "stylehacks/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "svgo/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "svgo/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "svgo/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "tar-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "uncss/postcss/picocolors": ["picocolors@0.2.1", "", {}, "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="], + + "uncss/postcss/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "unset-value/has-value/has-values": ["has-values@0.1.4", "", {}, "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ=="], + + "unset-value/has-value/isobject": ["isobject@2.1.0", "", { "dependencies": { "isarray": "1.0.0" } }, "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA=="], + + "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "@parcel/node-resolver-core/micromatch/braces/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "@parcel/node-resolver-core/micromatch/braces/fill-range": ["fill-range@4.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" } }, "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ=="], + + "class-utils/define-property/is-descriptor/is-accessor-descriptor": ["is-accessor-descriptor@0.1.6", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A=="], + + "class-utils/define-property/is-descriptor/is-data-descriptor": ["is-data-descriptor@0.1.4", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg=="], + + "class-utils/define-property/is-descriptor/kind-of": ["kind-of@5.1.0", "", {}, "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="], + + "coa/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "coa/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "css-modules-loader-core/postcss/chalk/ansi-styles": ["ansi-styles@2.2.1", "", {}, "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="], + + "css-modules-loader-core/postcss/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "css-modules-loader-core/postcss/chalk/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], + + "css-modules-loader-core/postcss/chalk/supports-color": ["supports-color@2.0.0", "", {}, "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="], + + "css-modules-loader-core/postcss/supports-color/has-flag": ["has-flag@1.0.0", "", {}, "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA=="], + + "css-select/domutils/dom-serializer/domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "cssnano/cosmiconfig/import-fresh/resolve-from": ["resolve-from@3.0.0", "", {}, "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="], + + "expand-brackets/define-property/is-descriptor/is-accessor-descriptor": ["is-accessor-descriptor@0.1.6", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A=="], + + "expand-brackets/define-property/is-descriptor/is-data-descriptor": ["is-data-descriptor@0.1.4", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg=="], + + "expand-brackets/define-property/is-descriptor/kind-of": ["kind-of@5.1.0", "", {}, "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="], + + "object-copy/define-property/is-descriptor/is-accessor-descriptor": ["is-accessor-descriptor@0.1.6", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A=="], + + "object-copy/define-property/is-descriptor/is-data-descriptor": ["is-data-descriptor@0.1.4", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg=="], + + "object-copy/define-property/is-descriptor/kind-of": ["kind-of@5.1.0", "", {}, "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="], + + "postcss-modules-extract-imports/postcss/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "postcss-modules-extract-imports/postcss/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "postcss-modules-extract-imports/postcss/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "postcss-modules-local-by-default/postcss/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "postcss-modules-local-by-default/postcss/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "postcss-modules-local-by-default/postcss/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "postcss-modules-scope/postcss/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "postcss-modules-scope/postcss/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "postcss-modules-scope/postcss/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "postcss-modules-values/postcss/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "postcss-modules-values/postcss/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "postcss-modules-values/postcss/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "posthtml/posthtml-parser/htmlparser2/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], + + "purgecss/postcss/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "purgecss/postcss/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "purgecss/postcss/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "purgecss/postcss/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "snapdragon/define-property/is-descriptor/is-accessor-descriptor": ["is-accessor-descriptor@0.1.6", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A=="], + + "snapdragon/define-property/is-descriptor/is-data-descriptor": ["is-data-descriptor@0.1.4", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg=="], + + "snapdragon/define-property/is-descriptor/kind-of": ["kind-of@5.1.0", "", {}, "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="], + + "static-extend/define-property/is-descriptor/is-accessor-descriptor": ["is-accessor-descriptor@0.1.6", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A=="], + + "static-extend/define-property/is-descriptor/is-data-descriptor": ["is-data-descriptor@0.1.4", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg=="], + + "static-extend/define-property/is-descriptor/kind-of": ["kind-of@5.1.0", "", {}, "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="], + + "svgo/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "svgo/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "@parcel/node-resolver-core/micromatch/braces/extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "@parcel/node-resolver-core/micromatch/braces/fill-range/is-number": ["is-number@3.0.0", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg=="], + + "@parcel/node-resolver-core/micromatch/braces/fill-range/to-regex-range": ["to-regex-range@2.1.1", "", { "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } }, "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg=="], + + "class-utils/define-property/is-descriptor/is-accessor-descriptor/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "class-utils/define-property/is-descriptor/is-data-descriptor/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "coa/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "css-modules-loader-core/postcss/chalk/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "expand-brackets/define-property/is-descriptor/is-accessor-descriptor/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "expand-brackets/define-property/is-descriptor/is-data-descriptor/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "object-copy/define-property/is-descriptor/is-accessor-descriptor/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "object-copy/define-property/is-descriptor/is-data-descriptor/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "postcss-modules-extract-imports/postcss/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "postcss-modules-local-by-default/postcss/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "postcss-modules-scope/postcss/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "postcss-modules-values/postcss/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "purgecss/postcss/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "purgecss/postcss/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "snapdragon/define-property/is-descriptor/is-accessor-descriptor/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "snapdragon/define-property/is-descriptor/is-data-descriptor/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "static-extend/define-property/is-descriptor/is-accessor-descriptor/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "static-extend/define-property/is-descriptor/is-data-descriptor/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "svgo/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "@parcel/node-resolver-core/micromatch/braces/fill-range/is-number/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "postcss-modules-extract-imports/postcss/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "postcss-modules-local-by-default/postcss/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "postcss-modules-scope/postcss/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "postcss-modules-values/postcss/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "purgecss/postcss/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + } +} diff --git a/bench/hot-module-reloading/css-stress-test/bun.lockb b/bench/hot-module-reloading/css-stress-test/bun.lockb deleted file mode 100755 index b2d009e0de..0000000000 Binary files a/bench/hot-module-reloading/css-stress-test/bun.lockb and /dev/null differ diff --git a/bench/hot-module-reloading/css-stress-test/src/index.tsx b/bench/hot-module-reloading/css-stress-test/src/index.tsx index 7ca290f48a..c8b470ec7a 100644 --- a/bench/hot-module-reloading/css-stress-test/src/index.tsx +++ b/bench/hot-module-reloading/css-stress-test/src/index.tsx @@ -1,8 +1,7 @@ -import { Main } from "./main"; -import classNames from "classnames"; import ReactDOM from "react-dom"; +import { Main } from "./main"; -const Base = ({}) => { +const Base = () => { const name = typeof location !== "undefined" ? decodeURIComponent(location.search.substring(1)) : null; return
; }; diff --git a/bench/install/README.md b/bench/install/README.md index 42739a1aa4..e94ce66976 100644 --- a/bench/install/README.md +++ b/bench/install/README.md @@ -23,7 +23,7 @@ $ hyperfine --prepare 'rm -rf node_modules' --runs 1 'bun install' 'pnpm install To run the benchmark with offline mode but without lockfiles: ```sh -$ hyperfine --prepare 'rm -rf node_modules' --warmup 1 'rm bun.lockb && bun install' 'rm pnpm-lock.yaml && pnpm install --prefer-offline' 'rm yarn.lock && yarn --offline' 'rm package-lock.json && npm install --prefer-offline' +$ hyperfine --prepare 'rm -rf node_modules' --warmup 1 'rm bun.lock && bun install' 'rm pnpm-lock.yaml && pnpm install --prefer-offline' 'rm yarn.lock && yarn --offline' 'rm package-lock.json && npm install --prefer-offline' ``` ## diff --git a/bench/install/app/entry.server.tsx b/bench/install/app/entry.server.tsx index fbea6220e2..a83df79c87 100644 --- a/bench/install/app/entry.server.tsx +++ b/bench/install/app/entry.server.tsx @@ -4,11 +4,11 @@ * For more information, see https://remix.run/docs/en/main/file-conventions/entry.server */ -import { PassThrough } from "node:stream"; import type { EntryContext } from "@remix-run/node"; import { Response } from "@remix-run/node"; import { RemixServer } from "@remix-run/react"; import isbot from "isbot"; +import { PassThrough } from "node:stream"; import { renderToPipeableStream } from "react-dom/server"; const ABORT_DELAY = 5_000; diff --git a/bench/json-stringify/bun.js b/bench/json-stringify/bun.js deleted file mode 100644 index 22f29deb40..0000000000 --- a/bench/json-stringify/bun.js +++ /dev/null @@ -1,8 +0,0 @@ -import { bench, run } from "mitata"; - -bench("JSON.stringify({hello: 'world'})", () => JSON.stringify({ hello: "world" })); - -const otherUint8Array = new Uint8Array(1024); -bench("Uint8Array.from(otherUint8Array)", () => Uint8Array.from(otherUint8Array)); - -run(); diff --git a/bench/log/bun.js b/bench/log/bun.js index 43728fd648..3e78eb4206 100644 --- a/bench/log/bun.js +++ b/bench/log/bun.js @@ -1,4 +1,4 @@ -import { bench, run } from "mitata"; +import { bench, run } from "../runner.mjs"; bench("console.log('hello')", () => console.log("hello")); bench("console.log({ hello: 'object' })", () => console.log({ hello: "object" })); diff --git a/bench/log/deno.mjs b/bench/log/deno.mjs index 24d7244633..4bfa1a3cc2 100644 --- a/bench/log/deno.mjs +++ b/bench/log/deno.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; bench("console.log", () => console.log("hello")); bench("console.log({ hello: 'object' })", () => console.log({ hello: "object" })); diff --git a/bench/log/node.mjs b/bench/log/node.mjs index 6ec73f7438..4bfa1a3cc2 100644 --- a/bench/log/node.mjs +++ b/bench/log/node.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "mitata"; +import { bench, run } from "../runner.mjs"; bench("console.log", () => console.log("hello")); bench("console.log({ hello: 'object' })", () => console.log({ hello: "object" })); diff --git a/bench/log/package.json b/bench/log/package.json index 1dc6e46020..821c1c3064 100644 --- a/bench/log/package.json +++ b/bench/log/package.json @@ -3,9 +3,9 @@ "scripts": { "deps": "exit 0", "build": "exit 0", - "bench:bun": "$BUN bun.js | grep iter", - "bench:node": "$NODE node.mjs | grep iter", - "bench:deno": "$DENO run -A --unstable deno.mjs | grep iter", + "bench:bun": "bun bun.js | grep iter", + "bench:node": "node node.mjs | grep iter", + "bench:deno": "deno run -A --unstable deno.mjs | grep iter", "bench": "bun run bench:bun && bun run bench:node && bun run bench:deno" } } diff --git a/bench/modules/node_os/bun.js b/bench/modules/node_os/bun.js index 217fae47da..713f9483a9 100644 --- a/bench/modules/node_os/bun.js +++ b/bench/modules/node_os/bun.js @@ -1,21 +1,21 @@ -import { bench, run } from "mitata"; +import { bench, run } from "../../runner.mjs"; import { + arch, cpus, endianness, - arch, - uptime, - networkInterfaces, - getPriority, - totalmem, freemem, + getPriority, homedir, hostname, loadavg, + networkInterfaces, platform, release, setPriority, tmpdir, + totalmem, type, + uptime, userInfo, version, } from "node:os"; diff --git a/bench/modules/node_os/node.mjs b/bench/modules/node_os/node.mjs index 217fae47da..36139b29ef 100644 --- a/bench/modules/node_os/node.mjs +++ b/bench/modules/node_os/node.mjs @@ -1,24 +1,24 @@ -import { bench, run } from "mitata"; import { + arch, cpus, endianness, - arch, - uptime, - networkInterfaces, - getPriority, - totalmem, freemem, + getPriority, homedir, hostname, loadavg, + networkInterfaces, platform, release, setPriority, tmpdir, + totalmem, type, + uptime, userInfo, version, } from "node:os"; +import { bench, run } from "../../runner.mjs"; bench("cpus()", () => cpus()); bench("networkInterfaces()", () => networkInterfaces()); diff --git a/bench/modules/node_os/package.json b/bench/modules/node_os/package.json index 2a095e28b6..d198465b9e 100644 --- a/bench/modules/node_os/package.json +++ b/bench/modules/node_os/package.json @@ -3,8 +3,8 @@ "scripts": { "deps": "exit 0", "build": "exit 0", - "bench:bun": "$BUN bun.js", - "bench:node": "$NODE node.mjs", + "bench:bun": "bun bun.js", + "bench:node": "node node.mjs", "bench": "bun run bench:bun && bun run bench:node" } } diff --git a/bench/package.json b/bench/package.json index 6ea67f5c99..d71efc00aa 100644 --- a/bench/package.json +++ b/bench/package.json @@ -7,13 +7,17 @@ "@swc/core": "^1.2.133", "benchmark": "^2.1.4", "braces": "^3.0.2", + "color": "^4.2.3", "esbuild": "^0.14.12", "eventemitter3": "^5.0.0", "execa": "^8.0.1", "fast-glob": "3.3.1", "fdir": "^6.1.0", - "mitata": "^0.1.6", + "mitata": "^1.0.25", + "react": "^18.3.1", + "react-dom": "^18.3.1", "string-width": "7.1.0", + "tinycolor2": "^1.6.0", "zx": "^7.2.3" }, "scripts": { diff --git a/bench/postgres/.gitignore b/bench/postgres/.gitignore new file mode 100644 index 0000000000..9b1ee42e84 --- /dev/null +++ b/bench/postgres/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/bench/postgres/README.md b/bench/postgres/README.md new file mode 100644 index 0000000000..3f082fdab2 --- /dev/null +++ b/bench/postgres/README.md @@ -0,0 +1,27 @@ +# Postgres table load benchmark + +To install dependencies: + +```bash +bun install +``` + +To run in Bun: + +```bash +bun ./index.mjs +``` + +To run in Node.js: + +```bash +node index.mjs +``` + +To run in Deno: + +```bash +deno run -A index.mjs +``` + +You will need a localhost Postgres server running. diff --git a/bench/postgres/bun.lockb b/bench/postgres/bun.lockb new file mode 100755 index 0000000000..35c8f9d77e Binary files /dev/null and b/bench/postgres/bun.lockb differ diff --git a/bench/postgres/index.mjs b/bench/postgres/index.mjs new file mode 100644 index 0000000000..19618c51a2 --- /dev/null +++ b/bench/postgres/index.mjs @@ -0,0 +1,47 @@ +const isBun = typeof globalThis?.Bun?.sql !== "undefined"; +import postgres from "postgres"; +const sql = isBun ? Bun.sql : postgres; + +// Create the table if it doesn't exist +await sql` + CREATE TABLE IF NOT EXISTS "users_bun_bench" ( + id SERIAL PRIMARY KEY, + first_name TEXT NOT NULL, + last_name TEXT NOT NULL, + email TEXT NOT NULL UNIQUE, + dob TEXT NOT NULL + ) + `; + +// Check if users already exist +const existingUsers = await sql`SELECT COUNT(*) as count FROM "users_bun_bench"`; + +if (+(existingUsers?.[0]?.count ?? existingUsers?.count) < 100) { + // Generate 100 users if none exist + const users = Array.from({ length: 100 }, (_, i) => ({ + first_name: `FirstName${i}`, + last_name: `LastName${i}`, + email: `user${i}@example.com`, + dob: new Date(1970 + Math.floor(Math.random() * 30), Math.floor(Math.random() * 12), Math.floor(Math.random() * 28)) + .toISOString() + .split("T")[0], + })); + + // Insert all users + await sql` + INSERT INTO users_bun_bench (first_name, last_name, email, dob) ${sql(users)} + `; +} + +const type = isBun ? "Bun.sql" : "postgres"; +console.time(type); +let promises = []; +for (let i = 0; i < 100_000; i++) { + promises.push(sql`SELECT * FROM "users_bun_bench" LIMIT 100`); + if (i % 100 === 0 && promises.length > 1) { + await Promise.all(promises); + promises.length = 0; + } +} +await Promise.all(promises); +console.timeEnd(type); diff --git a/bench/postgres/package.json b/bench/postgres/package.json new file mode 100644 index 0000000000..663d54c930 --- /dev/null +++ b/bench/postgres/package.json @@ -0,0 +1,14 @@ +{ + "name": "postgres", + "module": "index.ts", + "type": "module", + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "postgres": "^3.4.5" + } +} \ No newline at end of file diff --git a/bench/postgres/tsconfig.json b/bench/postgres/tsconfig.json new file mode 100644 index 0000000000..238655f2ce --- /dev/null +++ b/bench/postgres/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/bench/react-hello-world/bun.lock b/bench/react-hello-world/bun.lock new file mode 100644 index 0000000000..56594f42eb --- /dev/null +++ b/bench/react-hello-world/bun.lock @@ -0,0 +1,23 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "react-hello-world", + "dependencies": { + "react": "next", + "react-dom": "next", + }, + }, + }, + "packages": { + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "react": ["react@18.3.0-next-b72ed698f-20230303", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-l6RbwXa9Peerh9pQEq62DDypxSQfavbybY0wV1vwZ63X0P5VaaEesZAz1KPpnVvXjTtQaOMQsIPvnQwmaVqzTQ=="], + + "react-dom": ["react-dom@18.3.0-next-b72ed698f-20230303", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "0.24.0-next-b72ed698f-20230303" }, "peerDependencies": { "react": "18.3.0-next-b72ed698f-20230303" } }, "sha512-0Gh/gmTT6H8KxswIQB/8shdTTfs6QIu86nNqZf3Y0RBqIwgTVxRaQVz14/Fw4/Nt81nK/Jt6KT4bx3yvOxZDGQ=="], + + "scheduler": ["scheduler@0.24.0-next-b72ed698f-20230303", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-ct4DMMFbc2kFxCdvbG+i/Jn1S1oqrIFSn2VX/mam+Ya0iuNy+lb8rgT7A+YBUqrQNDaNEqABYI2sOQgqoRxp7w=="], + } +} diff --git a/bench/react-hello-world/bun.lockb b/bench/react-hello-world/bun.lockb deleted file mode 100755 index 6fd04cd03b..0000000000 Binary files a/bench/react-hello-world/bun.lockb and /dev/null differ diff --git a/bench/react-hello-world/react-hello-world.deno.jsx b/bench/react-hello-world/react-hello-world.deno.jsx index 0bea2574a2..08cb7b0222 100644 --- a/bench/react-hello-world/react-hello-world.deno.jsx +++ b/bench/react-hello-world/react-hello-world.deno.jsx @@ -1,5 +1,5 @@ -import { renderToReadableStream } from "https://esm.run/react-dom/server"; import * as React from "https://esm.run/react"; +import { renderToReadableStream } from "https://esm.run/react-dom/server"; const App = () => ( diff --git a/bench/react-hello-world/react-hello-world.node.jsx b/bench/react-hello-world/react-hello-world.node.jsx index a1a5125737..52dd3b0566 100644 --- a/bench/react-hello-world/react-hello-world.node.jsx +++ b/bench/react-hello-world/react-hello-world.node.jsx @@ -1,6 +1,6 @@ // react-ssr.tsx -import { renderToPipeableStream } from "react-dom/server.node"; import React from "react"; +import { renderToPipeableStream } from "react-dom/server.node"; const http = require("http"); const App = () => ( diff --git a/bench/runner.mjs b/bench/runner.mjs new file mode 100644 index 0000000000..9f6bcee16f --- /dev/null +++ b/bench/runner.mjs @@ -0,0 +1,19 @@ +import * as Mitata from "mitata"; +import process from "node:process"; + +const asJSON = !!process?.env?.BENCHMARK_RUNNER; + +/** @param {Parameters["0"]} opts */ +export function run(opts = {}) { + if (asJSON) { + opts.format = "json"; + } + + return Mitata.run(opts); +} + +export const bench = Mitata.bench; + +export function group(_name, fn) { + return Mitata.group(fn); +} diff --git a/bench/scanner/bun.lock b/bench/scanner/bun.lock new file mode 100644 index 0000000000..60d1e6d8fb --- /dev/null +++ b/bench/scanner/bun.lock @@ -0,0 +1,56 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "scan", + "dependencies": { + "esbuild": "^0.14.11", + }, + }, + }, + "packages": { + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.14.54", "", { "os": "linux", "cpu": "none" }, "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw=="], + + "esbuild": ["esbuild@0.14.54", "", { "dependencies": { "@esbuild/linux-loong64": "0.14.54", "esbuild-android-64": "0.14.54", "esbuild-android-arm64": "0.14.54", "esbuild-darwin-64": "0.14.54", "esbuild-darwin-arm64": "0.14.54", "esbuild-freebsd-64": "0.14.54", "esbuild-freebsd-arm64": "0.14.54", "esbuild-linux-32": "0.14.54", "esbuild-linux-64": "0.14.54", "esbuild-linux-arm": "0.14.54", "esbuild-linux-arm64": "0.14.54", "esbuild-linux-mips64le": "0.14.54", "esbuild-linux-ppc64le": "0.14.54", "esbuild-linux-riscv64": "0.14.54", "esbuild-linux-s390x": "0.14.54", "esbuild-netbsd-64": "0.14.54", "esbuild-openbsd-64": "0.14.54", "esbuild-sunos-64": "0.14.54", "esbuild-windows-32": "0.14.54", "esbuild-windows-64": "0.14.54", "esbuild-windows-arm64": "0.14.54" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA=="], + + "esbuild-android-64": ["esbuild-android-64@0.14.54", "", { "os": "android", "cpu": "x64" }, "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ=="], + + "esbuild-android-arm64": ["esbuild-android-arm64@0.14.54", "", { "os": "android", "cpu": "arm64" }, "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg=="], + + "esbuild-darwin-64": ["esbuild-darwin-64@0.14.54", "", { "os": "darwin", "cpu": "x64" }, "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug=="], + + "esbuild-darwin-arm64": ["esbuild-darwin-arm64@0.14.54", "", { "os": "darwin", "cpu": "arm64" }, "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw=="], + + "esbuild-freebsd-64": ["esbuild-freebsd-64@0.14.54", "", { "os": "freebsd", "cpu": "x64" }, "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg=="], + + "esbuild-freebsd-arm64": ["esbuild-freebsd-arm64@0.14.54", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q=="], + + "esbuild-linux-32": ["esbuild-linux-32@0.14.54", "", { "os": "linux", "cpu": "ia32" }, "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw=="], + + "esbuild-linux-64": ["esbuild-linux-64@0.14.54", "", { "os": "linux", "cpu": "x64" }, "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg=="], + + "esbuild-linux-arm": ["esbuild-linux-arm@0.14.54", "", { "os": "linux", "cpu": "arm" }, "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw=="], + + "esbuild-linux-arm64": ["esbuild-linux-arm64@0.14.54", "", { "os": "linux", "cpu": "arm64" }, "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig=="], + + "esbuild-linux-mips64le": ["esbuild-linux-mips64le@0.14.54", "", { "os": "linux", "cpu": "none" }, "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw=="], + + "esbuild-linux-ppc64le": ["esbuild-linux-ppc64le@0.14.54", "", { "os": "linux", "cpu": "ppc64" }, "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ=="], + + "esbuild-linux-riscv64": ["esbuild-linux-riscv64@0.14.54", "", { "os": "linux", "cpu": "none" }, "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg=="], + + "esbuild-linux-s390x": ["esbuild-linux-s390x@0.14.54", "", { "os": "linux", "cpu": "s390x" }, "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA=="], + + "esbuild-netbsd-64": ["esbuild-netbsd-64@0.14.54", "", { "os": "none", "cpu": "x64" }, "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w=="], + + "esbuild-openbsd-64": ["esbuild-openbsd-64@0.14.54", "", { "os": "openbsd", "cpu": "x64" }, "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw=="], + + "esbuild-sunos-64": ["esbuild-sunos-64@0.14.54", "", { "os": "sunos", "cpu": "x64" }, "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw=="], + + "esbuild-windows-32": ["esbuild-windows-32@0.14.54", "", { "os": "win32", "cpu": "ia32" }, "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w=="], + + "esbuild-windows-64": ["esbuild-windows-64@0.14.54", "", { "os": "win32", "cpu": "x64" }, "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ=="], + + "esbuild-windows-arm64": ["esbuild-windows-arm64@0.14.54", "", { "os": "win32", "cpu": "arm64" }, "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg=="], + } +} diff --git a/bench/scanner/bun.lockb b/bench/scanner/bun.lockb deleted file mode 100755 index 4bfd38af12..0000000000 Binary files a/bench/scanner/bun.lockb and /dev/null differ diff --git a/bench/scanner/remix-route.ts b/bench/scanner/remix-route.ts index dbacf3a4ca..e9d0880eed 100644 --- a/bench/scanner/remix-route.ts +++ b/bench/scanner/remix-route.ts @@ -1,5 +1,5 @@ +import type { ActionFunction, LoaderFunction } from "remix"; import { useParams } from "remix"; -import type { LoaderFunction, ActionFunction } from "remix"; export const loader: LoaderFunction = async ({ params }) => { console.log(params.postId); diff --git a/bench/snippets/array-arguments-slice.mjs b/bench/snippets/array-arguments-slice.mjs index 5d1139b8b3..8470ab79a6 100644 --- a/bench/snippets/array-arguments-slice.mjs +++ b/bench/snippets/array-arguments-slice.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; function doIt(...args) { // we use .at() to prevent constant folding optimizations diff --git a/bench/snippets/array-map.mjs b/bench/snippets/array-map.mjs index 7b8bc6fdcf..b467e9cd3e 100644 --- a/bench/snippets/array-map.mjs +++ b/bench/snippets/array-map.mjs @@ -1,5 +1,5 @@ // https://github.com/oven-sh/bun/issues/1096 -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; const identity = x => x; diff --git a/bench/snippets/array-shift.mjs b/bench/snippets/array-shift.mjs index 7039026706..15733f940b 100644 --- a/bench/snippets/array-shift.mjs +++ b/bench/snippets/array-shift.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var myArray = new Array(5); bench("[1, 2, 3, 4, 5].shift()", () => { diff --git a/bench/snippets/array-sort.mjs b/bench/snippets/array-sort.mjs index 9ed257740e..8951d716a6 100644 --- a/bench/snippets/array-sort.mjs +++ b/bench/snippets/array-sort.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var comparator = (a, b) => a - b; const numbers = [ diff --git a/bench/snippets/arraybuffersink.mjs b/bench/snippets/arraybuffersink.mjs index f90fae69fd..566f9bd630 100644 --- a/bench/snippets/arraybuffersink.mjs +++ b/bench/snippets/arraybuffersink.mjs @@ -1,6 +1,6 @@ // @runtime bun import { ArrayBufferSink } from "bun"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var short = "Hello World!"; var shortUTF16 = "Hello World 💕💕💕"; diff --git a/bench/snippets/assert.mjs b/bench/snippets/assert.mjs index 3b3284e54b..7ed8cf7596 100644 --- a/bench/snippets/assert.mjs +++ b/bench/snippets/assert.mjs @@ -1,5 +1,5 @@ -import { bench, group, run } from "./runner.mjs"; import * as assert from "assert"; +import { bench, run } from "../runner.mjs"; bench("deepEqual", () => { assert.deepEqual({ foo: "123", bar: "baz" }, { foo: "123", bar: "baz" }); diff --git a/bench/snippets/async-overhead.mjs b/bench/snippets/async-overhead.mjs index e285c7edd6..ec171dae54 100644 --- a/bench/snippets/async-overhead.mjs +++ b/bench/snippets/async-overhead.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "mitata"; +import { bench, run } from "../runner.mjs"; bench("noop", function () {}); bench("async function(){}", async function () {}); diff --git a/bench/snippets/atob.mjs b/bench/snippets/atob.mjs index 3a848300c0..de7d128265 100644 --- a/bench/snippets/atob.mjs +++ b/bench/snippets/atob.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; function makeBenchmark(size) { const latin1 = btoa("A".repeat(size)); diff --git a/bench/snippets/blob.mjs b/bench/snippets/blob.mjs index 68ebc1ce4d..7486f56fc9 100644 --- a/bench/snippets/blob.mjs +++ b/bench/snippets/blob.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; bench("new Blob(['hello world'])", function () { return new Blob(["hello world"]); diff --git a/bench/snippets/buffer-base64.mjs b/bench/snippets/buffer-base64.mjs index 96bab6f039..73dc3bccf8 100644 --- a/bench/snippets/buffer-base64.mjs +++ b/bench/snippets/buffer-base64.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; function makeBenchmark(size, isToString) { const base64Input = Buffer.alloc(size, "latin1").toString("base64"); diff --git a/bench/snippets/buffer-concat.mjs b/bench/snippets/buffer-concat.mjs index 0a6e4a0c85..c2812796a7 100644 --- a/bench/snippets/buffer-concat.mjs +++ b/bench/snippets/buffer-concat.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; for (let size of [32, 2048, 1024 * 16, 1024 * 1024 * 2, 1024 * 1024 * 16]) { const first = Buffer.allocUnsafe(size); diff --git a/bench/snippets/buffer-create.mjs b/bench/snippets/buffer-create.mjs index 115f8dd4aa..7c38bfdf40 100644 --- a/bench/snippets/buffer-create.mjs +++ b/bench/snippets/buffer-create.mjs @@ -1,7 +1,7 @@ // @runtime bun,node,deno -import { bench, run } from "./runner.mjs"; -import process from "node:process"; import { Buffer } from "node:buffer"; +import process from "node:process"; +import { bench, run } from "../runner.mjs"; const N = parseInt(process.env.RUN_COUNTER ?? "10000", 10); var isBuffer = new Buffer(0); @@ -25,6 +25,10 @@ bench("Buffer.from('short string')", () => { return Buffer.from("short string"); }); +bench("new Buffer('short string')", () => { + return new Buffer("short string"); +}); + const loooong = "long string".repeat(9999).split("").join(" "); bench("Buffer.byteLength('long string'.repeat(9999))", () => { return Buffer.byteLength(loooong); @@ -45,6 +49,14 @@ bench("Buffer.from(Uint8Array(0))", () => { return Buffer.from(empty); }); +bench("new Buffer(ArrayBuffer(100))", () => { + return new Buffer(hundred); +}); + +bench("new Buffer(Uint8Array(100))", () => { + return new Buffer(hundredArray); +}); + bench("new Buffer(Uint8Array(0))", () => { return new Buffer(empty); }); diff --git a/bench/snippets/buffer-fill.mjs b/bench/snippets/buffer-fill.mjs new file mode 100644 index 0000000000..47b5babbc4 --- /dev/null +++ b/bench/snippets/buffer-fill.mjs @@ -0,0 +1,15 @@ +import { bench, run } from "../runner.mjs"; + +for (let size of [32, 2048, 1024 * 16, 1024 * 1024 * 2, 1024 * 1024 * 16]) { + for (let fillSize of [4, 8, 16, 11]) { + const buffer = Buffer.allocUnsafe(size); + + const pattern = "x".repeat(fillSize); + + bench(`Buffer.fill ${size} bytes with ${fillSize} byte value`, () => { + buffer.fill(pattern); + }); + } +} + +await run(); diff --git a/bench/snippets/buffer-includes.js b/bench/snippets/buffer-includes.js new file mode 100644 index 0000000000..a624bee2b4 --- /dev/null +++ b/bench/snippets/buffer-includes.js @@ -0,0 +1,17 @@ +const buf = Buffer.from( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", +); +const INTERVAL = 9_999_999; + +const time = (name, fn) => { + for (let i = 0; i < INTERVAL; i++) fn(); + + console.time(name.padEnd(30)); + for (let i = 0; i < INTERVAL; i++) fn(); + console.timeEnd(name.padEnd(30)); +}; + +console.log(`Run ${new Intl.NumberFormat().format(INTERVAL)} times with a warmup:`, "\n"); + +time("includes true", () => buf.includes("nisi")); +time("includes false", () => buf.includes("oopwo")); diff --git a/bench/snippets/buffer-to-string.mjs b/bench/snippets/buffer-to-string.mjs index c4dac62081..2d26535838 100644 --- a/bench/snippets/buffer-to-string.mjs +++ b/bench/snippets/buffer-to-string.mjs @@ -1,6 +1,6 @@ -import { bench, run } from "./runner.mjs"; import { Buffer } from "node:buffer"; import crypto from "node:crypto"; +import { bench, run } from "../runner.mjs"; const bigBuffer = Buffer.from("hello world".repeat(10000)); const converted = bigBuffer.toString("base64"); diff --git a/bench/snippets/buffer.js b/bench/snippets/buffer.js index 22dad8e343..ee85afb4fa 100644 --- a/bench/snippets/buffer.js +++ b/bench/snippets/buffer.js @@ -1,7 +1,7 @@ // import { Buffer } from "buffer"; var buf = new Buffer(1024); var view = new DataView(buf.buffer); -var INTERVAL = 9999999; +var INTERVAL = 9_999_999; var time = (name, fn) => { for (let i = 0; i < INTERVAL; i++) fn(); diff --git a/bench/snippets/byteLength.mjs b/bench/snippets/byteLength.mjs new file mode 100644 index 0000000000..810bf487fd --- /dev/null +++ b/bench/snippets/byteLength.mjs @@ -0,0 +1,27 @@ +import { Buffer } from "node:buffer"; +import { bench, run } from "../runner.mjs"; + +const variations = [ + ["latin1", "hello world"], + ["utf16", "hello emoji 🤔"], +]; + +for (const [label, string] of variations) { + const big = Buffer.alloc(1000000, string).toString(); + const small = Buffer.from(string).toString(); + const substring = big.slice(0, big.length - 2); + + bench(`${substring.length}`, () => { + return Buffer.byteLength(substring, "utf8"); + }); + + bench(`${small.length}`, () => { + return Buffer.byteLength(small); + }); + + bench(`${big.length}`, () => { + return Buffer.byteLength(big); + }); +} + +await run(); diff --git a/bench/snippets/color.mjs b/bench/snippets/color.mjs new file mode 100644 index 0000000000..4a505630fc --- /dev/null +++ b/bench/snippets/color.mjs @@ -0,0 +1,25 @@ +import Color from "color"; +import tinycolor from "tinycolor2"; +import { bench, group, run } from "../runner.mjs"; + +const inputs = ["#f00", "rgb(255, 0, 0)", "rgba(255, 0, 0, 1)", "hsl(0, 100%, 50%)"]; + +for (const input of inputs) { + group(`${input}`, () => { + if (typeof Bun !== "undefined") { + bench(`Bun.color() (${input})`, () => { + Bun.color(input, "css"); + }); + } + + bench(`color (${input})`, () => { + Color(input).hex(); + }); + + bench(`'tinycolor2' (${input})`, () => { + tinycolor(input).toHexString(); + }); + }); +} + +await run(); diff --git a/bench/snippets/concat.js b/bench/snippets/concat.js index 76804dae19..15e418f05e 100644 --- a/bench/snippets/concat.js +++ b/bench/snippets/concat.js @@ -1,6 +1,6 @@ -import { bench, group, run } from "./runner.mjs"; -import { readFileSync } from "fs"; import { allocUnsafe } from "bun"; +import { readFileSync } from "fs"; +import { bench, group, run } from "../runner.mjs"; function polyfill(chunks) { var size = 0; @@ -41,15 +41,16 @@ const chunkGroups = [ ]; for (const chunks of chunkGroups) { - group(`${chunks.reduce((prev, curr, i, a) => prev + curr.byteLength, 0)} bytes for ${chunks.length} chunks`, () => { - bench("Bun.concatArrayBuffers", () => { + const name = `${chunks.reduce((prev, curr, i, a) => prev + curr.byteLength, 0)} bytes for ${chunks.length} chunks` + group(name, () => { + bench(`Bun.concatArrayBuffers (${name})`, () => { Bun.concatArrayBuffers(chunks); }); - bench("Uint8Array.set", () => { + bench(`Uint8Array.set (${name})`, () => { polyfill(chunks); }); - bench("Uint8Array.set (uninitialized memory)", () => { + bench(`Uint8Array.set (uninitialized memory) (${name})`, () => { polyfillUninitialized(chunks); }); }); diff --git a/bench/snippets/console-log.mjs b/bench/snippets/console-log.mjs index b95533f012..274af84d67 100644 --- a/bench/snippets/console-log.mjs +++ b/bench/snippets/console-log.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; const json = { login: "wongmjane", diff --git a/bench/snippets/cp.mjs b/bench/snippets/cp.mjs index 898375439f..1572296e62 100644 --- a/bench/snippets/cp.mjs +++ b/bench/snippets/cp.mjs @@ -2,7 +2,7 @@ import { mkdirSync, rmSync, writeFileSync } from "fs"; import { cp } from "fs/promises"; import { tmpdir } from "os"; import { join, resolve } from "path"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; import { fileURLToPath } from "url"; const hugeDirectory = (() => { diff --git a/bench/snippets/crypto-2190.mjs b/bench/snippets/crypto-2190.mjs index dab54f1fdf..1ff6536788 100644 --- a/bench/snippets/crypto-2190.mjs +++ b/bench/snippets/crypto-2190.mjs @@ -1,6 +1,6 @@ // https://github.com/oven-sh/bun/issues/2190 -import { bench, run } from "mitata"; import { createHash } from "node:crypto"; +import { bench, run } from "../runner.mjs"; const data = "Delightful remarkably mr on announcing themselves entreaties favourable. About to in so terms voice at. Equal an would is found seems of. The particular friendship one sufficient terminated frequently themselves. It more shed went up is roof if loud case. Delay music in lived noise an. Beyond genius really enough passed is up."; diff --git a/bench/snippets/crypto-hasher.mjs b/bench/snippets/crypto-hasher.mjs index 36f67739ad..e08e360753 100644 --- a/bench/snippets/crypto-hasher.mjs +++ b/bench/snippets/crypto-hasher.mjs @@ -1,5 +1,5 @@ // so it can run in environments without node module resolution -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; import crypto from "node:crypto"; diff --git a/bench/snippets/crypto-randomUUID.mjs b/bench/snippets/crypto-randomUUID.mjs index f6a4c0aa68..f8faeb6c9e 100644 --- a/bench/snippets/crypto-randomUUID.mjs +++ b/bench/snippets/crypto-randomUUID.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; bench("crypto.randomUUID()", () => { return crypto.randomUUID(); diff --git a/bench/snippets/crypto-stream.mjs b/bench/snippets/crypto-stream.mjs index 3560563d9d..f931f2ed73 100644 --- a/bench/snippets/crypto-stream.mjs +++ b/bench/snippets/crypto-stream.mjs @@ -1,6 +1,6 @@ // https://github.com/oven-sh/bun/issues/2190 -import { bench, run } from "mitata"; import { createHash } from "node:crypto"; +import { bench, run } from "../runner.mjs"; const data = "Delightful remarkably mr on announcing themselves entreaties favourable. About to in so terms voice at. Equal an would is found seems of. The particular friendship one sufficient terminated frequently themselves. It more shed went up is roof if loud case. Delay music in lived noise an. Beyond genius really enough passed is up."; diff --git a/bench/snippets/crypto.mjs b/bench/snippets/crypto.mjs index 484a4295dd..c285722056 100644 --- a/bench/snippets/crypto.mjs +++ b/bench/snippets/crypto.mjs @@ -1,6 +1,6 @@ // so it can run in environments without node module resolution -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; import crypto from "node:crypto"; +import { bench, run } from "../runner.mjs"; var foo = new Uint8Array(65536); bench("crypto.getRandomValues(65536)", () => { crypto.getRandomValues(foo); diff --git a/bench/snippets/decode.js b/bench/snippets/decode.js new file mode 100644 index 0000000000..16b1255cda --- /dev/null +++ b/bench/snippets/decode.js @@ -0,0 +1,71 @@ +import { bench, run } from "../runner.mjs"; + +let decodeURIComponentSIMD; +if (typeof Bun !== "undefined") { + ({ decodeURIComponentSIMD } = await import("bun:internal-for-testing")); +} + +const hugeText = Buffer.alloc(1000000, "Hello, world!").toString(); +const hugeTextWithPercentAtEnd = Buffer.alloc(1000000, "Hello, world!%40").toString(); + +const tinyText = Buffer.alloc(100, "Hello, world!").toString(); +const tinyTextWithPercentAtEnd = Buffer.alloc(100, "Hello, world!%40").toString(); + +const veryTinyText = Buffer.alloc(8, "a").toString(); +const veryTinyTextWithPercentAtEnd = Buffer.alloc(8, "a%40").toString(); + +decodeURIComponentSIMD && + bench("decodeURIComponentSIMD - no % x 8 bytes", () => { + decodeURIComponentSIMD(veryTinyText); + }); + +bench(" decodeURIComponent - no % x 8 bytes", () => { + decodeURIComponent(veryTinyText); +}); + +decodeURIComponentSIMD && + bench("decodeURIComponentSIMD - yes % x 8 bytes", () => { + decodeURIComponentSIMD(veryTinyTextWithPercentAtEnd); + }); + +bench(" decodeURIComponent - yes % x 8 bytes", () => { + decodeURIComponent(veryTinyTextWithPercentAtEnd); +}); + +decodeURIComponentSIMD && + bench("decodeURIComponentSIMD - no % x 100 bytes", () => { + decodeURIComponentSIMD(tinyText); + }); + +bench(" decodeURIComponent - no % x 100 bytes", () => { + decodeURIComponent(tinyText); +}); + +decodeURIComponentSIMD && + bench("decodeURIComponentSIMD - yes % x 100 bytes", () => { + decodeURIComponentSIMD(tinyTextWithPercentAtEnd); + }); + +bench(" decodeURIComponent - yes % x 100 bytes", () => { + decodeURIComponent(tinyTextWithPercentAtEnd); +}); + +decodeURIComponentSIMD && + bench("decodeURIComponentSIMD - no % x 1 MB", () => { + decodeURIComponentSIMD(hugeText); + }); + +bench(" decodeURIComponent - no % x 1 MB", () => { + decodeURIComponent(hugeText); +}); + +decodeURIComponentSIMD && + bench("decodeURIComponentSIMD - yes % x 1 MB", () => { + decodeURIComponentSIMD(hugeTextWithPercentAtEnd); + }); + +bench(" decodeURIComponent - yes % x 1 MB", () => { + decodeURIComponent(hugeTextWithPercentAtEnd); +}); + +await run(); diff --git a/bench/snippets/deep-equals.js b/bench/snippets/deep-equals.js index 53dee81ab4..87d68ce030 100644 --- a/bench/snippets/deep-equals.js +++ b/bench/snippets/deep-equals.js @@ -1,5 +1,5 @@ -import { bench, group, run } from "./runner.mjs"; import fastDeepEquals from "fast-deep-equal/es6/index"; +import { bench, group, run } from "../runner.mjs"; // const Date = globalThis.Date; function func1() {} @@ -490,7 +490,7 @@ for (let { tests, description } of fixture) { var expected; group(describe, () => { for (let equalsFn of [Bun.deepEquals, fastDeepEquals]) { - bench(equalsFn.name, () => { + bench(`${describe}: ${equalsFn.name}`, () => { expected = equalsFn(value1, value2); if (expected !== equal) { throw new Error(`Expected ${expected} to be ${equal} for ${description}`); diff --git a/bench/snippets/define-properties.mjs b/bench/snippets/define-properties.mjs index 6a10ab1832..f26d3c7188 100644 --- a/bench/snippets/define-properties.mjs +++ b/bench/snippets/define-properties.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; const properties = { closed: { diff --git a/bench/snippets/dns.node.mjs b/bench/snippets/dns.node.mjs index ffa58ff236..fe065edf06 100644 --- a/bench/snippets/dns.node.mjs +++ b/bench/snippets/dns.node.mjs @@ -1,5 +1,5 @@ import { lookup, resolve } from "node:dns/promises"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; bench("(cached) dns.lookup remote x 50", async () => { var tld = "example.com"; diff --git a/bench/snippets/dns.ts b/bench/snippets/dns.ts index 7eeeea689b..cb350a808d 100644 --- a/bench/snippets/dns.ts +++ b/bench/snippets/dns.ts @@ -1,10 +1,10 @@ import { dns } from "bun"; -import { bench, run, group } from "./runner.mjs"; +import { bench, group, run } from "../runner.mjs"; async function forEachBackend(name, fn) { group(name, () => { for (let backend of ["libc", "c-ares", process.platform === "darwin" ? "system" : ""].filter(Boolean)) - bench(backend, fn(backend)); + bench(`${backend} (${name})`, fn(backend)); }); } diff --git a/bench/snippets/encode-into.mjs b/bench/snippets/encode-into.mjs index 5275b6f108..20ac486bad 100644 --- a/bench/snippets/encode-into.mjs +++ b/bench/snippets/encode-into.mjs @@ -1,4 +1,4 @@ -import { run, bench } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; const encoder = new TextEncoder(); diff --git a/bench/snippets/error-capturestack.mjs b/bench/snippets/error-capturestack.mjs index 0c59ff9c84..3b715b3961 100644 --- a/bench/snippets/error-capturestack.mjs +++ b/bench/snippets/error-capturestack.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var err = new Error(); bench("Error.captureStackTrace(err)", () => { diff --git a/bench/snippets/escapeHTML.js b/bench/snippets/escapeHTML.js index 809666d71c..48b12bf61d 100644 --- a/bench/snippets/escapeHTML.js +++ b/bench/snippets/escapeHTML.js @@ -1,7 +1,4 @@ -import { group } from "./runner.mjs"; -import { bench, run } from "./runner.mjs"; -import { encode as htmlEntityEncode } from "html-entities"; -import { escape as heEscape } from "he"; +import { bench, group, run } from "../runner.mjs"; var bunEscapeHTML = globalThis.escapeHTML || Bun.escapeHTML; @@ -95,24 +92,21 @@ function reactEscapeHtml(string) { // } for (let input of [ - `long string, nothing to escape... `.repeat(9999999 * 3), + "long string, nothing to escape... ".repeat(9999999 * 3), FIXTURE.repeat(8000), // "[unicode]" + FIXTURE_WITH_UNICODE, ]) { + const name = `"${input.substring(0, Math.min(input.length, 32))}" (${new Intl.NumberFormat().format(input.length / 100_000_000_0)} GB)` group( { summary: true, - name: - `"` + - input.substring(0, Math.min(input.length, 32)) + - `"` + - ` (${new Intl.NumberFormat().format(input.length / 100_000_000_0)} GB)`, + name }, () => { // bench(`ReactDOM.escapeHTML`, () => reactEscapeHtml(input)); // bench(`html-entities.encode`, () => htmlEntityEncode(input)); // bench(`he.escape`, () => heEscape(input)); - bench(`Bun.escapeHTML`, () => bunEscapeHTML(input)); + bench(`Bun.escapeHTML (${name})`, () => bunEscapeHTML(input)); }, ); } diff --git a/bench/snippets/ffi-overhead.mjs b/bench/snippets/ffi-overhead.mjs index bfb92634c2..d0f11e907c 100644 --- a/bench/snippets/ffi-overhead.mjs +++ b/bench/snippets/ffi-overhead.mjs @@ -1,5 +1,5 @@ -import { viewSource, dlopen, CString, ptr, toBuffer, toArrayBuffer, FFIType, callback } from "bun:ffi"; -import { bench, group, run } from "./runner.mjs"; +import { dlopen } from "bun:ffi"; +import { bench, group, run } from "../runner.mjs"; const types = { returns_true: { diff --git a/bench/snippets/form-data.mjs b/bench/snippets/form-data.mjs index a12cf4b134..b78edbfbe7 100644 --- a/bench/snippets/form-data.mjs +++ b/bench/snippets/form-data.mjs @@ -1,5 +1,5 @@ // so it can run in environments without node module resolution -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; const blob = new Blob(["foo", "bar", "baz"]); bench("FormData.append", () => { diff --git a/bench/snippets/hash.mjs b/bench/snippets/hash.mjs new file mode 100644 index 0000000000..bcc619ff30 --- /dev/null +++ b/bench/snippets/hash.mjs @@ -0,0 +1,97 @@ +import { bench, run } from "../runner.mjs"; + +// Can be strings or buffers. +const shortStr = Buffer.from("abcd1234"); // 8 chars +const longStr = Buffer.alloc(128 * 1024, "xABcDpQrStUvWxYz=-1]23]12312312][3123][123]["); + +// Short string benchmarks + +bench("wyhash (short)", () => { + Bun.hash.wyhash(shortStr); +}); + +bench("adler32 (short)", () => { + Bun.hash.adler32(shortStr); +}); + +bench("crc32 (short)", () => { + Bun.hash.crc32(shortStr); +}); + +bench("cityHash32 (short)", () => { + Bun.hash.cityHash32(shortStr); +}); + +bench("cityHash64 (short)", () => { + Bun.hash.cityHash64(shortStr); +}); + +bench("xxHash32 (short)", () => { + Bun.hash.xxHash32(shortStr); +}); + +bench("xxHash64 (short)", () => { + Bun.hash.xxHash64(shortStr); +}); + +bench("xxHash3 (short)", () => { + Bun.hash.xxHash3(shortStr); +}); + +bench("murmur32v3 (short)", () => { + Bun.hash.murmur32v3(shortStr); +}); + +bench("murmur32v2 (short)", () => { + Bun.hash.murmur32v2(shortStr); +}); + +bench("murmur64v2 (short)", () => { + Bun.hash.murmur64v2(shortStr); +}); + +bench("wyhash (128 KB)", () => { + Bun.hash.wyhash(longStr); +}); + +bench("adler32 (128 KB)", () => { + Bun.hash.adler32(longStr); +}); + +bench("crc32 (128 KB)", () => { + Bun.hash.crc32(longStr); +}); + +bench("cityHash32 (128 KB)", () => { + Bun.hash.cityHash32(longStr); +}); + +bench("cityHash64 (128 KB)", () => { + Bun.hash.cityHash64(longStr); +}); + +bench("xxHash32 (128 KB)", () => { + Bun.hash.xxHash32(longStr); +}); + +bench("xxHash64 (128 KB)", () => { + Bun.hash.xxHash64(longStr); +}); + +bench("xxHash3 (128 KB)", () => { + Bun.hash.xxHash3(longStr); +}); + +bench("murmur32v3 (128 KB)", () => { + Bun.hash.murmur32v3(longStr); +}); + +bench("murmur32v2 (128 KB)", () => { + Bun.hash.murmur32v2(longStr); +}); + +bench("murmur64v2 (128 KB)", () => { + Bun.hash.murmur64v2(longStr); +}); + +run(); diff --git a/bench/snippets/headers.mjs b/bench/snippets/headers.mjs index 7057db02a7..8c0c0ec450 100644 --- a/bench/snippets/headers.mjs +++ b/bench/snippets/headers.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; // pure JS implementation will optimze this out bench("new Headers", function () { diff --git a/bench/snippets/index-of.mjs b/bench/snippets/index-of.mjs index 04b9704e96..8f22ab3518 100644 --- a/bench/snippets/index-of.mjs +++ b/bench/snippets/index-of.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; const input = "Hello, World! foo bar baz qux quux corge grault garply waldo fred plugh xyzzy thud z a b c d e f g h i j k l m n o p q r s t u v w x y z".split( diff --git a/bench/snippets/json-parse-stringify.mjs b/bench/snippets/json-parse-stringify.mjs index c58041e100..f516f5364c 100644 --- a/bench/snippets/json-parse-stringify.mjs +++ b/bench/snippets/json-parse-stringify.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var obj = { "restApiRoot": "/api", diff --git a/bench/snippets/json-stringify.js b/bench/snippets/json-stringify.js new file mode 100644 index 0000000000..e50ab7be10 --- /dev/null +++ b/bench/snippets/json-stringify.js @@ -0,0 +1,8 @@ +import { bench, run } from "../runner.mjs"; + +bench("JSON.stringify({hello: 'world'})", () => JSON.stringify({ hello: "world" })); + +const otherUint8Array = new Uint8Array(1024); +bench("Uint8Array.from(otherUint8Array)", () => Uint8Array.from(otherUint8Array)); + +run(); diff --git a/bench/snippets/module-exports-putter.cjs b/bench/snippets/module-exports-putter.cjs index 9bef17b90e..7afb1e3aa6 100644 --- a/bench/snippets/module-exports-putter.cjs +++ b/bench/snippets/module-exports-putter.cjs @@ -1,6 +1,6 @@ // This is a stress test of some internals in How Bun does the module.exports assignment. // If it crashes or throws then this fails -import("./runner.mjs").then(({ bench, run }) => { +import("../runner.mjs").then(({ bench, run }) => { bench("Object.defineProperty(module, 'exports', { get() { return 42; } })", () => { Object.defineProperty(module, "exports", { get() { @@ -36,7 +36,9 @@ import("./runner.mjs").then(({ bench, run }) => { a: 1, }; - console.log( + const log = !process?.env?.BENCHMARK_RUNNER ? console.log : () => {}; + + log( module?.exports, require.cache[module.id].exports, module?.exports === require.cache[module.id], @@ -49,10 +51,11 @@ import("./runner.mjs").then(({ bench, run }) => { return 42; }; - console.log(module.exports, module.exports()); + log(module.exports); + log(module.exports, module.exports()); queueMicrotask(() => { - console.log( + log( module?.exports, require.cache[module.id].exports, module?.exports === require.cache[module.id]?.exports, diff --git a/bench/snippets/native-overhead.mjs b/bench/snippets/native-overhead.mjs index 2c33c46fab..43576b21d4 100644 --- a/bench/snippets/native-overhead.mjs +++ b/bench/snippets/native-overhead.mjs @@ -1,20 +1,14 @@ -import { bench, run } from "./runner.mjs"; +import { noOpForTesting as noop } from "bun:internal-for-testing"; +import { bench, run } from "../runner.mjs"; // These are no-op C++ functions that are exported to JS. -const lazy = globalThis[Symbol.for("Bun.lazy")]; -const noop = lazy("noop"); const fn = noop.function; -const regular = noop.functionRegular; const callback = noop.callback; bench("C++ callback into JS", () => { callback(() => {}); }); -bench("C++ fn regular", () => { - regular(); -}); - bench("C++ fn", () => { fn(); }); diff --git a/bench/snippets/new-incomingmessage.mjs b/bench/snippets/new-incomingmessage.mjs index ae480e0311..13cd172646 100644 --- a/bench/snippets/new-incomingmessage.mjs +++ b/bench/snippets/new-incomingmessage.mjs @@ -1,5 +1,5 @@ -import { bench, run } from "./runner.mjs"; import { IncomingMessage } from "node:http"; +import { bench, run } from "../runner.mjs"; const headers = { date: "Mon, 06 Nov 2023 05:12:49 GMT", diff --git a/bench/snippets/node-vm.mjs b/bench/snippets/node-vm.mjs index 6f9d607736..74bed6a4be 100644 --- a/bench/snippets/node-vm.mjs +++ b/bench/snippets/node-vm.mjs @@ -1,6 +1,6 @@ // @runtime node, bun -import { bench, run } from "./runner.mjs"; import * as vm from "node:vm"; +import { bench, run } from "../runner.mjs"; const context = { animal: "cat", diff --git a/bench/snippets/node-zlib-brotli.mjs b/bench/snippets/node-zlib-brotli.mjs new file mode 100644 index 0000000000..01208d3ec9 --- /dev/null +++ b/bench/snippets/node-zlib-brotli.mjs @@ -0,0 +1,37 @@ +import { bench, run } from "../runner.mjs"; +import { brotliCompress, brotliDecompress, createBrotliCompress, createBrotliDecompress } from "node:zlib"; +import { promisify } from "node:util"; +import { pipeline } from "node:stream/promises"; +import { Readable } from "node:stream"; +import { readFileSync } from "node:fs"; + +const brotliCompressAsync = promisify(brotliCompress); +const brotliDecompressAsync = promisify(brotliDecompress); + +const testData = + process.argv.length > 2 + ? readFileSync(process.argv[2]) + : Buffer.alloc(1024 * 1024 * 16, "abcdefghijklmnopqrstuvwxyz"); +let compressed; + +bench("brotli compress", async () => { + compressed = await brotliCompressAsync(testData); +}); + +bench("brotli decompress", async () => { + await brotliDecompressAsync(compressed); +}); + +bench("brotli compress stream", async () => { + const source = Readable.from([testData]); + const compress = createBrotliCompress(); + await pipeline(source, compress); +}); + +bench("brotli decompress stream", async () => { + const source = Readable.from([compressed]); + const decompress = createBrotliDecompress(); + await pipeline(source, decompress); +}); + +await run(); diff --git a/bench/snippets/noop.js b/bench/snippets/noop.js index 9b9f1a1d12..6b647064c1 100644 --- a/bench/snippets/noop.js +++ b/bench/snippets/noop.js @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var noop = globalThis[Symbol.for("Bun.lazy")]("noop"); var { function: noopFn, callback } = noop; diff --git a/bench/snippets/object-entries.mjs b/bench/snippets/object-entries.mjs index c3e4bf9e5b..8c4b331b51 100644 --- a/bench/snippets/object-entries.mjs +++ b/bench/snippets/object-entries.mjs @@ -1,5 +1,5 @@ // so it can run in environments without node module resolution -import { bench, run } from "../../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; const obj = { a: 1, diff --git a/bench/snippets/object-values.mjs b/bench/snippets/object-values.mjs index 8dc62780bf..86e4bef2c1 100644 --- a/bench/snippets/object-values.mjs +++ b/bench/snippets/object-values.mjs @@ -24,7 +24,7 @@ const obj = { w: 23, }; -import { bench, group, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var val = 0; bench("Object.values(literal)", () => { diff --git a/bench/snippets/path-relative.mjs b/bench/snippets/path-relative.mjs new file mode 100644 index 0000000000..05584564bf --- /dev/null +++ b/bench/snippets/path-relative.mjs @@ -0,0 +1,25 @@ +import { posix } from "path"; +import { bench, run } from "../runner.mjs"; + +const pathConfigurations = [ + ["", ""], + [".", "."], + ["/foo/bar", "/foo/bar"], + ["/foo/bar/baz", "/foo/bar"], + ["/foo/bar", "/foo/bar/baz"], + ["/foo/bar/baz", "/foo/bar/qux"], + ["/foo/bar/baz", "/foo/bar/baz/qux"], + ["/foo/bar/baz", "/foo/bar/baz/qux/quux"], + ["/", "/foo"], + ["/foo", "/"], + ["foo/bar/baz", "foo/bar/qux"], + ["../foo/bar", "../foo/baz"], +]; + +pathConfigurations.forEach(([from, to]) => { + bench(`relative(${JSON.stringify(from)}, ${JSON.stringify(to)})`, () => { + globalThis.abc = posix.relative(from, to); + }); +}); + +await run(); diff --git a/bench/snippets/path-resolve.mjs b/bench/snippets/path-resolve.mjs new file mode 100644 index 0000000000..8263a7b048 --- /dev/null +++ b/bench/snippets/path-resolve.mjs @@ -0,0 +1,22 @@ +import { posix } from "path"; +import { bench, run } from "../runner.mjs"; + +const pathConfigurations = [ + "", + ".", + "./", + ["", ""].join("|"), + ["./abc.js"].join("|"), + ["foo/bar", "/tmp/file/", "..", "a/../subfile"].join("|"), + ["a/b/c/", "../../.."].join("|"), +]; + +pathConfigurations.forEach(paths => { + const args = paths.split("|"); + + bench(`resolve(${args.map(a => JSON.stringify(a)).join(", ")})`, () => { + globalThis.abc = posix.resolve(...args); + }); +}); + +await run(); diff --git a/bench/snippets/pbkdf2.mjs b/bench/snippets/pbkdf2.mjs index 6c21d3d6ea..3b286543ec 100644 --- a/bench/snippets/pbkdf2.mjs +++ b/bench/snippets/pbkdf2.mjs @@ -1,6 +1,6 @@ -import { pbkdf2, pbkdf2Sync } from "node:crypto"; +import { pbkdf2 } from "node:crypto"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; const password = "password"; const salt = "salt"; diff --git a/bench/snippets/peek-promise.mjs b/bench/snippets/peek-promise.mjs index cabb15a313..9468efca25 100644 --- a/bench/snippets/peek-promise.mjs +++ b/bench/snippets/peek-promise.mjs @@ -1,5 +1,5 @@ -import { bench, run } from "mitata"; import { peek } from "bun"; +import { bench, run } from "../runner.mjs"; let pending = Bun.sleep(1000); let resolved = Promise.resolve(1); diff --git a/bench/snippets/performance-now-overhead.js b/bench/snippets/performance-now-overhead.js index 442d305639..b7626e3312 100644 --- a/bench/snippets/performance-now-overhead.js +++ b/bench/snippets/performance-now-overhead.js @@ -1,5 +1,4 @@ -import { group } from "./runner.mjs"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; bench("performance.now x 1000", () => { for (let i = 0; i < 1000; i++) { performance.now(); diff --git a/bench/snippets/private.mjs b/bench/snippets/private.mjs index 452dab06b7..2cf72a3ced 100644 --- a/bench/snippets/private.mjs +++ b/bench/snippets/private.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; // This is a benchmark of the performance impact of using private properties. bench("Polyfillprivate", () => { diff --git a/bench/snippets/process-cwd.mjs b/bench/snippets/process-cwd.mjs new file mode 100644 index 0000000000..9d7576e253 --- /dev/null +++ b/bench/snippets/process-cwd.mjs @@ -0,0 +1,7 @@ +import { bench, run } from "../runner.mjs"; + +bench("process.cwd()", () => { + process.cwd(); +}); + +await run(); diff --git a/bench/snippets/process-info.mjs b/bench/snippets/process-info.mjs index 0366472e5a..bb053a205f 100644 --- a/bench/snippets/process-info.mjs +++ b/bench/snippets/process-info.mjs @@ -1,5 +1,5 @@ -import { bench, run } from "./runner.mjs"; import { performance } from "perf_hooks"; +import { bench, run } from "../runner.mjs"; bench("process.memoryUsage()", () => { process.memoryUsage(); diff --git a/bench/snippets/process.mjs b/bench/snippets/process.mjs index 40bb48e0e1..666fc8dcaf 100644 --- a/bench/snippets/process.mjs +++ b/bench/snippets/process.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; bench("process.stderr.write('hey')", () => { process.stderr.write("hey"); diff --git a/bench/snippets/react-dom-render.bun.js b/bench/snippets/react-dom-render.bun.js index b13508d75d..d808b9547f 100644 --- a/bench/snippets/react-dom-render.bun.js +++ b/bench/snippets/react-dom-render.bun.js @@ -1,6 +1,6 @@ -import { bench, group, run } from "./runner.mjs"; -import { renderToReadableStream } from "react-dom/server.browser"; import { renderToReadableStream as renderToReadableStreamBun } from "react-dom/server"; +import { renderToReadableStream } from "react-dom/server.browser"; +import { bench, group, run } from "../runner.mjs"; const App = () => (
diff --git a/bench/snippets/read-file-chunk.mjs b/bench/snippets/read-file-chunk.mjs index e6a33a4992..7a0526e1f1 100644 --- a/bench/snippets/read-file-chunk.mjs +++ b/bench/snippets/read-file-chunk.mjs @@ -1,7 +1,7 @@ -import { tmpdir } from "node:os"; -import { bench, group, run } from "./runner.mjs"; import { createReadStream, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; import { sep } from "node:path"; +import { bench, run } from "../runner.mjs"; if (!Promise.withResolvers) { Promise.withResolvers = function () { diff --git a/bench/snippets/read-file.mjs b/bench/snippets/read-file.mjs index b808dee792..8a9e1f1825 100644 --- a/bench/snippets/read-file.mjs +++ b/bench/snippets/read-file.mjs @@ -1,5 +1,5 @@ import { readFileSync, writeFileSync } from "node:fs"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var short = (function () { const text = "Hello World!"; diff --git a/bench/snippets/readdir.mjs b/bench/snippets/readdir.mjs index 37aefe6ac8..7a43cc6fdc 100644 --- a/bench/snippets/readdir.mjs +++ b/bench/snippets/readdir.mjs @@ -1,10 +1,10 @@ -import { readdirSync, readdir as readdirCb } from "fs"; +import { createHash } from "crypto"; +import { readdirSync } from "fs"; import { readdir } from "fs/promises"; -import { bench, run } from "./runner.mjs"; +import { relative, resolve } from "path"; import { argv } from "process"; import { fileURLToPath } from "url"; -import { relative, resolve } from "path"; -import { createHash } from "crypto"; +import { bench, run } from "../runner.mjs"; let dir = resolve(argv.length > 2 ? argv[2] : fileURLToPath(new URL("../../node_modules", import.meta.url))); if (dir.includes(process.cwd())) { @@ -43,8 +43,11 @@ bench(`await readdir("${dir}", {recursive: false})`, async () => { }); await run(); -console.log("\n", count, "files/dirs in", dir, "\n", "SHA256:", hash, "\n"); -if (count !== syncCount) { - throw new Error(`Mismatched file counts: ${count} async !== ${syncCount} sync`); +if (!process?.env?.BENCHMARK_RUNNER) { + console.log("\n", count, "files/dirs in", dir, "\n", "SHA256:", hash, "\n"); + + if (count !== syncCount) { + throw new Error(`Mismatched file counts: ${count} async !== ${syncCount} sync`); + } } diff --git a/bench/snippets/readfile-not-found.mjs b/bench/snippets/readfile-not-found.mjs index c28100ba4a..af90ba1f6b 100644 --- a/bench/snippets/readfile-not-found.mjs +++ b/bench/snippets/readfile-not-found.mjs @@ -1,6 +1,6 @@ -import { bench, run } from "./runner.mjs"; -import { readFileSync, existsSync } from "node:fs"; +import { readFileSync } from "node:fs"; import { readFile } from "node:fs/promises"; +import { bench, run } from "../runner.mjs"; bench(`readFileSync(/tmp/404-not-found)`, () => { try { diff --git a/bench/snippets/realpath.mjs b/bench/snippets/realpath.mjs index 4793ee3d67..30f2bf8da0 100644 --- a/bench/snippets/realpath.mjs +++ b/bench/snippets/realpath.mjs @@ -1,7 +1,7 @@ import { realpathSync } from "node:fs"; +import { bench, run } from "../runner.mjs"; const count = parseInt(process.env.ITERATIONS || "1", 10) || 1; const arg = process.argv[process.argv.length - 1]; -import { bench, run } from "./runner.mjs"; bench("realpathSync x " + count, () => { for (let i = 0; i < count; i++) realpathSync(arg, "utf-8"); diff --git a/bench/snippets/render.js b/bench/snippets/render.js index 9ef70bc273..58aaefb1c4 100644 --- a/bench/snippets/render.js +++ b/bench/snippets/render.js @@ -1,4 +1,4 @@ -import decoding from "./jsx-entity-decoding"; import ReactDOMServer from "react-dom/server.browser"; +import decoding from "./jsx-entity-decoding"; console.log(ReactDOMServer.renderToString(decoding)); diff --git a/bench/snippets/request-response-clone.mjs b/bench/snippets/request-response-clone.mjs index 05a9806560..9ba1f25d93 100644 --- a/bench/snippets/request-response-clone.mjs +++ b/bench/snippets/request-response-clone.mjs @@ -1,5 +1,5 @@ // This mostly exists to check for a memory leak in response.clone() -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; const req = new Request("http://localhost:3000/"); const resp = await fetch("http://example.com"); diff --git a/bench/snippets/require-builtins.mjs b/bench/snippets/require-builtins.mjs index c458f3a356..34c008a892 100644 --- a/bench/snippets/require-builtins.mjs +++ b/bench/snippets/require-builtins.mjs @@ -1,7 +1,6 @@ -import { bench, run } from "./runner.mjs"; -import { builtinModules } from "node:module"; -import { writeFile } from "node:fs/promises"; import { spawnSync } from "child_process"; +import { writeFile } from "node:fs/promises"; +import { builtinModules } from "node:module"; for (let builtin of builtinModules) { const path = `/tmp/require.${builtin.replaceAll("/", "_")}.cjs`; diff --git a/bench/snippets/response-arrayBuffer.mjs b/bench/snippets/response-arrayBuffer.mjs index a3b1f0a730..255c46e7d8 100644 --- a/bench/snippets/response-arrayBuffer.mjs +++ b/bench/snippets/response-arrayBuffer.mjs @@ -1,6 +1,6 @@ // This snippet mostly exists to reproduce a memory leak // -import { bench, run } from "mitata"; +import { bench, run } from "../runner.mjs"; const obj = { "id": 1296269, diff --git a/bench/snippets/response-json.mjs b/bench/snippets/response-json.mjs index dd28203f0b..2cd20523b6 100644 --- a/bench/snippets/response-json.mjs +++ b/bench/snippets/response-json.mjs @@ -1,5 +1,5 @@ // This snippet mostly exists to reproduce a memory leak -import { bench, run } from "mitata"; +import { bench, run } from "../runner.mjs"; const obj = { "id": 1296269, diff --git a/bench/snippets/return-await.mjs b/bench/snippets/return-await.mjs index 079eb4bdd0..4ccdccf549 100644 --- a/bench/snippets/return-await.mjs +++ b/bench/snippets/return-await.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; bench("return await Promise.resolve(1)", async function () { return await Promise.resolve(1); diff --git a/bench/snippets/rewriter.mjs b/bench/snippets/rewriter.mjs index abdc7f0af5..4cb1143aac 100644 --- a/bench/snippets/rewriter.mjs +++ b/bench/snippets/rewriter.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; const blob = new Blob(["

Hello

"]); bench("prepend", async () => { diff --git a/bench/snippets/rmdir.mjs b/bench/snippets/rmdir.mjs index 258d69097d..8cc7bb08fb 100644 --- a/bench/snippets/rmdir.mjs +++ b/bench/snippets/rmdir.mjs @@ -1,5 +1,5 @@ +import { existsSync, mkdirSync, promises } from "node:fs"; import { tmpdir } from "node:os"; -import { promises, existsSync, mkdirSync } from "node:fs"; const count = 1024 * 12; var queue = new Array(count); diff --git a/bench/snippets/runner-entrypoint.js b/bench/snippets/runner-entrypoint.js index 77011c1317..cbcf0f6726 100644 --- a/bench/snippets/runner-entrypoint.js +++ b/bench/snippets/runner-entrypoint.js @@ -1,9 +1,9 @@ // note: this isn't done yet // we look for `// @runtime` in the file to determine which runtimes to run the benchmark in import { spawnSync } from "bun"; -import { readdirSync, readFileSync } from "node:fs"; import { Database } from "bun:sqlite"; -import { extname, basename } from "path"; +import { readdirSync, readFileSync } from "node:fs"; +import { basename, extname } from "path"; const exts = [".js", ".ts", ".mjs", ".tsx"]; diff --git a/bench/snippets/runner.mjs b/bench/snippets/runner.mjs deleted file mode 100644 index 4f6e29fba5..0000000000 --- a/bench/snippets/runner.mjs +++ /dev/null @@ -1,22 +0,0 @@ -import * as Mitata from "../node_modules/mitata/src/cli.mjs"; -import process from "node:process"; - -const asJSON = !!process?.env?.BENCHMARK_RUNNER; - -export function run(opts = {}) { - opts ??= {}; - - if (asJSON) { - opts.json = true; - } - - return Mitata.run(opts); -} - -export function bench(name, fn) { - return Mitata.bench(name, fn); -} - -export function group(name, fn) { - return Mitata.group(name, fn); -} diff --git a/bench/snippets/semver.mjs b/bench/snippets/semver.mjs index bacacef214..7b3d599a58 100644 --- a/bench/snippets/semver.mjs +++ b/bench/snippets/semver.mjs @@ -1,5 +1,5 @@ import { satisfies } from "semver"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; const tests = [ ["~1.2.3", "1.2.3", true], ["~1.2", "1.2.0", true], diff --git a/bench/snippets/serialize.mjs b/bench/snippets/serialize.mjs index 1a3646f792..80da320dfb 100644 --- a/bench/snippets/serialize.mjs +++ b/bench/snippets/serialize.mjs @@ -1,5 +1,5 @@ -import { serialize, deserialize } from "node:v8"; -import { bench, run } from "./runner.mjs"; +import { deserialize, serialize } from "node:v8"; +import { bench, run } from "../runner.mjs"; const obj = { "id": 1296269, "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5", diff --git a/bench/snippets/set-timeout.mjs b/bench/snippets/set-timeout.mjs index 47228f77ce..a9f495a319 100644 --- a/bench/snippets/set-timeout.mjs +++ b/bench/snippets/set-timeout.mjs @@ -1,5 +1,3 @@ -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; - let count = 20_000_000; const batchSize = 1_000_000; console.time("Run"); diff --git a/bench/snippets/sha512.js b/bench/snippets/sha512.js index ac162dc248..548bbc096b 100644 --- a/bench/snippets/sha512.js +++ b/bench/snippets/sha512.js @@ -1,5 +1,5 @@ -import { bench, run } from "./runner.mjs"; import { SHA512 } from "bun"; +import { bench, run } from "../runner.mjs"; bench('SHA512.hash("hello world")', () => { SHA512.hash("hello world"); diff --git a/bench/snippets/sha512.node.mjs b/bench/snippets/sha512.node.mjs index 3c3ac16976..26268ea0ab 100644 --- a/bench/snippets/sha512.node.mjs +++ b/bench/snippets/sha512.node.mjs @@ -1,5 +1,5 @@ -import { bench, run } from "./runner.mjs"; import { createHash } from "crypto"; +import { bench, run } from "../runner.mjs"; bench('createHash("sha256").update("hello world").digest()', () => { createHash("sha256").update("hello world").digest(); diff --git a/bench/snippets/shell-spawn.mjs b/bench/snippets/shell-spawn.mjs index aa4da66eeb..c3aaf557db 100644 --- a/bench/snippets/shell-spawn.mjs +++ b/bench/snippets/shell-spawn.mjs @@ -1,6 +1,6 @@ -import { $ as zx } from "zx"; import { $ as execa$ } from "execa"; -import { bench, run, group } from "./runner.mjs"; +import { $ as zx } from "zx"; +import { bench, group, run } from "../runner.mjs"; const execa = execa$({ stdio: "ignore", cwd: import.meta.dirname }); diff --git a/bench/snippets/spawn-hugemem.mjs b/bench/snippets/spawn-hugemem.mjs index 177382c743..792381ab0d 100644 --- a/bench/snippets/spawn-hugemem.mjs +++ b/bench/snippets/spawn-hugemem.mjs @@ -1,5 +1,5 @@ import { spawnSync } from "bun"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var memory = new Uint8Array(128 * 1024 * 1024); memory.fill(10); diff --git a/bench/snippets/spawn-hugemem.node.mjs b/bench/snippets/spawn-hugemem.node.mjs index d33a5d4bd4..489c1c33e9 100644 --- a/bench/snippets/spawn-hugemem.node.mjs +++ b/bench/snippets/spawn-hugemem.node.mjs @@ -1,5 +1,5 @@ import { spawnSync } from "child_process"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var memory = new Uint8Array(128 * 1024 * 1024); memory.fill(10); diff --git a/bench/snippets/spawn.deno.mjs b/bench/snippets/spawn.deno.mjs index 0e96d9e93e..198d3d43ce 100644 --- a/bench/snippets/spawn.deno.mjs +++ b/bench/snippets/spawn.deno.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; bench("spawnSync echo hi", () => { Deno.spawnSync("echo", { diff --git a/bench/snippets/spawn.mjs b/bench/snippets/spawn.mjs index 9c259b096f..8836f19aab 100644 --- a/bench/snippets/spawn.mjs +++ b/bench/snippets/spawn.mjs @@ -1,5 +1,5 @@ import { spawnSync } from "bun"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; bench("spawnSync echo hi", () => { spawnSync({ cmd: ["echo", "hi"] }); diff --git a/bench/snippets/spawn.node.mjs b/bench/snippets/spawn.node.mjs index c72a3bf036..008949d990 100644 --- a/bench/snippets/spawn.node.mjs +++ b/bench/snippets/spawn.node.mjs @@ -1,6 +1,6 @@ // @runtime bun,node,deno import { spawnSync } from "node:child_process"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; bench("spawnSync echo hi", () => { spawnSync("echo", ["hi"], { encoding: "buffer", shell: false }); diff --git a/bench/snippets/stat.mjs b/bench/snippets/stat.mjs index 17d6a68c83..68fd1f5135 100644 --- a/bench/snippets/stat.mjs +++ b/bench/snippets/stat.mjs @@ -1,6 +1,6 @@ -import { readdirSync, statSync } from "fs"; -import { bench, run } from "./runner.mjs"; +import { statSync } from "fs"; import { argv } from "process"; +import { bench, run } from "../runner.mjs"; const dir = argv.length > 2 ? argv[2] : "/tmp"; diff --git a/bench/snippets/stderr.mjs b/bench/snippets/stderr.mjs index f4669905b0..e06c388588 100644 --- a/bench/snippets/stderr.mjs +++ b/bench/snippets/stderr.mjs @@ -1,4 +1,4 @@ -import { run, bench } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var writer = globalThis.Bun ? Bun.stderr.writer() : undefined; if (writer) diff --git a/bench/snippets/string-decoder.mjs b/bench/snippets/string-decoder.mjs index b00b7b67d4..1969937441 100644 --- a/bench/snippets/string-decoder.mjs +++ b/bench/snippets/string-decoder.mjs @@ -1,5 +1,5 @@ -import { bench, run } from "./runner.mjs"; import { StringDecoder } from "string_decoder"; +import { bench, run } from "../runner.mjs"; var short = Buffer.from("Hello World!"); var shortUTF16 = Buffer.from("Hello World 💕💕💕"); diff --git a/bench/snippets/string-width.mjs b/bench/snippets/string-width.mjs index 03b4833a3b..d75507657a 100644 --- a/bench/snippets/string-width.mjs +++ b/bench/snippets/string-width.mjs @@ -1,5 +1,5 @@ -import { bench, run } from "./runner.mjs"; import npmStringWidth from "string-width"; +import { bench, run } from "../runner.mjs"; const bunStringWidth = globalThis?.Bun?.stringWidth; diff --git a/bench/snippets/structuredClone.mjs b/bench/snippets/structuredClone.mjs index 3007b22f56..684acd3b19 100644 --- a/bench/snippets/structuredClone.mjs +++ b/bench/snippets/structuredClone.mjs @@ -31,7 +31,7 @@ var testArray = [ }, ]; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; bench("structuredClone(array)", () => structuredClone(testArray)); bench("structuredClone(123)", () => structuredClone(123)); diff --git a/bench/snippets/tcp-echo.bun.ts b/bench/snippets/tcp-echo.bun.ts index c0f227e754..193ce0bd2a 100644 --- a/bench/snippets/tcp-echo.bun.ts +++ b/bench/snippets/tcp-echo.bun.ts @@ -1,4 +1,4 @@ -import { listen, connect } from "bun"; +import { connect, listen } from "bun"; var counter = 0; const msg = "Hello World!"; diff --git a/bench/snippets/text-decoder-stream.mjs b/bench/snippets/text-decoder-stream.mjs index 5495fdc09b..c30e45f1b5 100644 --- a/bench/snippets/text-decoder-stream.mjs +++ b/bench/snippets/text-decoder-stream.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; const latin1 = `hello hello hello!!!! `.repeat(10240); diff --git a/bench/snippets/text-decoder.mjs b/bench/snippets/text-decoder.mjs index 340815e9df..5bf0e90cbf 100644 --- a/bench/snippets/text-decoder.mjs +++ b/bench/snippets/text-decoder.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "../node_modules/mitata/src/cli.mjs"; +import { bench, run } from "../runner.mjs"; var short = new TextEncoder().encode("Hello World!"); var shortUTF16 = new TextEncoder().encode("Hello World 💕💕💕"); diff --git a/bench/snippets/text-encoder-stream.mjs b/bench/snippets/text-encoder-stream.mjs index 788e3fb50b..ee83f90d5c 100644 --- a/bench/snippets/text-encoder-stream.mjs +++ b/bench/snippets/text-encoder-stream.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; const latin1 = `hello hello hello!!!! `.repeat(10240); diff --git a/bench/snippets/text-encoder.mjs b/bench/snippets/text-encoder.mjs index d0f5c40a4d..674345177d 100644 --- a/bench/snippets/text-encoder.mjs +++ b/bench/snippets/text-encoder.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var short = "Hello World!"; var shortUTF16 = "Hello World 💕💕💕"; diff --git a/bench/snippets/transpiler-2.mjs b/bench/snippets/transpiler-2.mjs index 702fda9d18..fdf3deb713 100644 --- a/bench/snippets/transpiler-2.mjs +++ b/bench/snippets/transpiler-2.mjs @@ -1,5 +1,5 @@ -import { bench, run } from "mitata"; import { join } from "path"; +import { bench, run } from "../runner.mjs"; const code = require("fs").readFileSync( process.argv[2] || join(import.meta.dir, "../node_modules/@babel/standalone/babel.min.js"), diff --git a/bench/snippets/transpiler.mjs b/bench/snippets/transpiler.mjs index 3a5c57d0af..f453270435 100644 --- a/bench/snippets/transpiler.mjs +++ b/bench/snippets/transpiler.mjs @@ -1,8 +1,8 @@ import { readFileSync } from "fs"; +import { createRequire } from "module"; import { dirname } from "path"; import { fileURLToPath } from "url"; -import { bench, run, group } from "./runner.mjs"; -import { createRequire } from "module"; +import { bench, group, run } from "../runner.mjs"; const require = createRequire(import.meta.url); const esbuild_ = require("esbuild/lib/main"); const swc_ = require("@swc/core"); diff --git a/bench/snippets/url.mjs b/bench/snippets/url.mjs index 1cb6e7a8f1..d794b7f6d6 100644 --- a/bench/snippets/url.mjs +++ b/bench/snippets/url.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; bench(`new URL('https://example.com/')`, () => { const url = new URL("https://example.com/"); diff --git a/bench/snippets/urlsearchparams.mjs b/bench/snippets/urlsearchparams.mjs index af653c917f..4663dbfedf 100644 --- a/bench/snippets/urlsearchparams.mjs +++ b/bench/snippets/urlsearchparams.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; // bench("new URLSearchParams({})", () => { // return new URLSearchParams({}); @@ -10,7 +10,6 @@ bench("new URLSearchParams(obj)", () => { "Content-Length": "123", "User-Agent": "node-fetch/1.0", "Accept-Encoding": "gzip,deflate", - "Content-Length": "0", "Content-Range": "bytes 0-9/10", }); }); diff --git a/bench/snippets/util-deprecate.mjs b/bench/snippets/util-deprecate.mjs index 364601d79a..1acd31f5a1 100644 --- a/bench/snippets/util-deprecate.mjs +++ b/bench/snippets/util-deprecate.mjs @@ -1,4 +1,4 @@ -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; function deprecateUsingClosure(fn, msg, code) { if (process.noDeprecation === true) { return fn; diff --git a/bench/snippets/webcrypto.mjs b/bench/snippets/webcrypto.mjs index 2d1256cf8f..2ae35652d7 100644 --- a/bench/snippets/webcrypto.mjs +++ b/bench/snippets/webcrypto.mjs @@ -1,5 +1,4 @@ -import { group } from "mitata"; -import { bench, run } from "./runner.mjs"; +import { bench, group, run } from "../runner.mjs"; const sizes = [ ["small (63 bytes)", 63], @@ -10,7 +9,7 @@ for (let [name, size] of sizes) { group(name, () => { var buf = new Uint8Array(size); for (let algorithm of ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]) { - bench(algorithm, async () => { + bench(`${algorithm} (${name})`, async () => { await crypto.subtle.digest(algorithm, buf); }); } diff --git a/bench/snippets/write-file-huge.mjs b/bench/snippets/write-file-huge.mjs index fe874c9399..f79a8ca991 100644 --- a/bench/snippets/write-file-huge.mjs +++ b/bench/snippets/write-file-huge.mjs @@ -1,6 +1,6 @@ import { Buffer } from "node:buffer"; import { writeFile } from "node:fs/promises"; -import { bench, run } from "./runner.mjs"; +import { bench, run } from "../runner.mjs"; var hugeFile = Buffer.alloc(1024 * 1024 * 64); var medFile = Buffer.alloc(1024 * 1024 * 16); diff --git a/bench/snippets/write-file.mjs b/bench/snippets/write-file.mjs index 4417c817cd..e16732cb7e 100644 --- a/bench/snippets/write-file.mjs +++ b/bench/snippets/write-file.mjs @@ -1,5 +1,5 @@ -import { readFileSync, writeFileSync } from "node:fs"; -import { bench, run } from "./runner.mjs"; +import { writeFileSync } from "node:fs"; +import { bench, run } from "../runner.mjs"; var short = "Hello World!"; var shortUTF16 = "Hello World 💕💕💕"; diff --git a/bench/snippets/write.bun.js b/bench/snippets/write.bun.js index 67fbbe3b25..a3ea86b871 100644 --- a/bench/snippets/write.bun.js +++ b/bench/snippets/write.bun.js @@ -1,6 +1,6 @@ -import { bench, run } from "./runner.mjs"; import { write } from "bun"; import { openSync } from "fs"; +import { bench, run } from "../runner.mjs"; bench('write(/tmp/foo.txt, "short string")', async () => { await write("/tmp/foo.txt", "short string"); diff --git a/bench/snippets/write.node.mjs b/bench/snippets/write.node.mjs index f59c98aefa..92b97f77c8 100644 --- a/bench/snippets/write.node.mjs +++ b/bench/snippets/write.node.mjs @@ -1,9 +1,8 @@ // @runtime node, bun, deno -import { bench, run } from "./runner.mjs"; import { Buffer } from "node:buffer"; -import { openSync } from "node:fs"; +import { openSync, writeSync as write } from "node:fs"; import { writeFile } from "node:fs/promises"; -import { writeSync as write } from "node:fs"; +import { bench, run } from "../runner.mjs"; bench("writeFile(/tmp/foo.txt, short string)", async () => { await writeFile("/tmp/foo.txt", "short string", "utf8"); diff --git a/bench/snippets/zlib.mjs b/bench/snippets/zlib.mjs new file mode 100644 index 0000000000..8bfc87e308 --- /dev/null +++ b/bench/snippets/zlib.mjs @@ -0,0 +1,62 @@ +import { bench, run } from "../runner.mjs"; +import zlib from "node:zlib"; +import { promisify } from "node:util"; + +const deflate = promisify(zlib.deflate); +const inflate = promisify(zlib.inflate); + +const short = "Hello World!"; +const long = "Hello World!".repeat(1024); +const veryLong = "Hello World!".repeat(10240); + +// Pre-compress some data for decompression tests +const shortBuf = Buffer.from(short); +const longBuf = Buffer.from(long); +const veryLongBuf = Buffer.from(veryLong); + +let [shortCompressed, longCompressed, veryLongCompressed] = await Promise.all([ + deflate(shortBuf, { level: 6 }), + deflate(longBuf, { level: 6 }), + deflate(veryLongBuf, { level: 6 }), +]); + +const format = new Intl.NumberFormat("en-US", { notation: "compact", unit: "byte" }); +// Compression tests at different levels +bench(`deflate ${format.format(short.length)}B (level 1)`, async () => { + await deflate(shortBuf, { level: 1 }); +}); + +bench(`deflate ${format.format(short.length)} (level 6)`, async () => { + await deflate(shortBuf, { level: 6 }); +}); + +bench(`deflate ${format.format(long.length)} (level 1)`, async () => { + await deflate(longBuf, { level: 1 }); +}); + +bench(`deflate ${format.format(long.length)} (level 6)`, async () => { + await deflate(longBuf, { level: 6 }); +}); + +bench(`deflate ${format.format(veryLong.length)} (level 1)`, async () => { + await deflate(veryLongBuf, { level: 1 }); +}); + +bench(`deflate ${format.format(veryLong.length)} (level 6)`, async () => { + await deflate(veryLongBuf, { level: 6 }); +}); + +// Decompression tests +bench(`inflate ${format.format(short.length)}`, async () => { + await inflate(shortCompressed); +}); + +bench(`inflate ${format.format(long.length)}`, async () => { + await inflate(longCompressed); +}); + +bench(`inflate ${format.format(veryLong.length)}`, async () => { + await inflate(veryLongCompressed); +}); + +await run(); diff --git a/bench/sqlite/better-sqlite3.mjs b/bench/sqlite/better-sqlite3.mjs index 9bf25105b9..cf32b3e912 100644 --- a/bench/sqlite/better-sqlite3.mjs +++ b/bench/sqlite/better-sqlite3.mjs @@ -1,5 +1,5 @@ -import { run, bench } from "mitata"; import { createRequire } from "module"; +import { bench, run } from "../runner.mjs"; const require = createRequire(import.meta.url); const db = require("better-sqlite3")("./src/northwind.sqlite"); diff --git a/bench/sqlite/bun.js b/bench/sqlite/bun.js index c178981f17..9d2167c30b 100644 --- a/bench/sqlite/bun.js +++ b/bench/sqlite/bun.js @@ -1,5 +1,5 @@ -import { run, bench } from "mitata"; import { Database } from "bun:sqlite"; +import { bench, run } from "../runner.mjs"; import { join } from "path"; const db = Database.open(join(import.meta.dir, "src", "northwind.sqlite")); diff --git a/bench/sqlite/bun.lock b/bench/sqlite/bun.lock new file mode 100644 index 0000000000..371b6dfb6b --- /dev/null +++ b/bench/sqlite/bun.lock @@ -0,0 +1,92 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "bench", + "dependencies": { + "better-sqlite3": "8.5.0", + }, + }, + }, + "packages": { + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "better-sqlite3": ["better-sqlite3@8.5.0", "", { "dependencies": { "bindings": "^1.5.0", "prebuild-install": "^7.1.0" } }, "sha512-vbPcv/Hx5WYdyNg/NbcfyaBZyv9s/NVbxb7yCeC5Bq1pVocNxeL2tZmSu3Rlm4IEOTjYdGyzWQgyx0OSdORBzw=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "detect-libc": ["detect-libc@2.0.1", "", {}, "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w=="], + + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], + + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + + "napi-build-utils": ["napi-build-utils@1.0.2", "", {}, "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="], + + "node-abi": ["node-abi@3.35.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-jAlSOFR1Bls963NmFwxeQkNTzqjUF0NThm8Le7eRIRGzFUVJuMOFZDLv5Y30W/Oaw+KEebEJLAigwO9gQHoEmw=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "prebuild-install": ["prebuild-install@7.1.1", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw=="], + + "pump": ["pump@3.0.0", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "semver": ["semver@7.4.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw=="], + + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "tar-fs": ["tar-fs@2.1.1", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng=="], + + "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + } +} diff --git a/bench/sqlite/bun.lockb b/bench/sqlite/bun.lockb deleted file mode 100755 index 94f137da01..0000000000 Binary files a/bench/sqlite/bun.lockb and /dev/null differ diff --git a/bench/sqlite/deno.js b/bench/sqlite/deno.js index 8b4b215ee8..35cc47679e 100644 --- a/bench/sqlite/deno.js +++ b/bench/sqlite/deno.js @@ -1,5 +1,5 @@ -import { Database } from "https://deno.land/x/sqlite3@0.11.1/mod.ts"; -import { run, bench } from "../node_modules/mitata/src/cli.mjs"; +import { Database } from "https://deno.land/x/sqlite3@0.12.0/mod.ts"; +import { bench, run } from "../runner.mjs"; const db = new Database("./src/northwind.sqlite"); diff --git a/bench/sqlite/deno.lock b/bench/sqlite/deno.lock new file mode 100644 index 0000000000..d8282381ae --- /dev/null +++ b/bench/sqlite/deno.lock @@ -0,0 +1,82 @@ +{ + "version": "4", + "specifiers": { + "jsr:@denosaurs/plug@1": "1.0.6", + "jsr:@std/assert@0.217": "0.217.0", + "jsr:@std/assert@0.221": "0.221.0", + "jsr:@std/encoding@0.221": "0.221.0", + "jsr:@std/fmt@0.221": "0.221.0", + "jsr:@std/fs@0.221": "0.221.0", + "jsr:@std/path@0.217": "0.217.0", + "jsr:@std/path@0.221": "0.221.0" + }, + "jsr": { + "@denosaurs/plug@1.0.6": { + "integrity": "6cf5b9daba7799837b9ffbe89f3450510f588fafef8115ddab1ff0be9cb7c1a7", + "dependencies": [ + "jsr:@std/encoding", + "jsr:@std/fmt", + "jsr:@std/fs", + "jsr:@std/path@0.221" + ] + }, + "@std/assert@0.217.0": { + "integrity": "c98e279362ca6982d5285c3b89517b757c1e3477ee9f14eb2fdf80a45aaa9642" + }, + "@std/assert@0.221.0": { + "integrity": "a5f1aa6e7909dbea271754fd4ab3f4e687aeff4873b4cef9a320af813adb489a" + }, + "@std/encoding@0.221.0": { + "integrity": "d1dd76ef0dc5d14088411e6dc1dede53bf8308c95d1537df1214c97137208e45" + }, + "@std/fmt@0.221.0": { + "integrity": "379fed69bdd9731110f26b9085aeb740606b20428ce6af31ef6bd45ef8efa62a" + }, + "@std/fs@0.221.0": { + "integrity": "028044450299de8ed5a716ade4e6d524399f035513b85913794f4e81f07da286", + "dependencies": [ + "jsr:@std/assert@0.221", + "jsr:@std/path@0.221" + ] + }, + "@std/path@0.217.0": { + "integrity": "1217cc25534bca9a2f672d7fe7c6f356e4027df400c0e85c0ef3e4343bc67d11", + "dependencies": [ + "jsr:@std/assert@0.217" + ] + }, + "@std/path@0.221.0": { + "integrity": "0a36f6b17314ef653a3a1649740cc8db51b25a133ecfe838f20b79a56ebe0095", + "dependencies": [ + "jsr:@std/assert@0.221" + ] + } + }, + "remote": { + "https://deno.land/x/sqlite3@0.11.1/deno.json": "77126f50d0efce1375173fae94d4df7f732cd25f05d8aa74f8ff801ef4d85caf", + "https://deno.land/x/sqlite3@0.11.1/deps.ts": "d2f23a4489d27ed7ba1f601b86a85ff488a87603e4be7a15f3ea15154fc288ec", + "https://deno.land/x/sqlite3@0.11.1/mod.ts": "3169f246c0eddd6ed82862758f4109f167b7ba5538236240fbb26a129f1bc16c", + "https://deno.land/x/sqlite3@0.11.1/src/blob.ts": "3681353b3c97bc43f9b02f8d1c3269c0dc4eb9cb5d3af16c7ce4d1e1ec7507c4", + "https://deno.land/x/sqlite3@0.11.1/src/constants.ts": "85fd27aa6e199093f25f5f437052e16fd0e0870b96ca9b24a98e04ddc8b7d006", + "https://deno.land/x/sqlite3@0.11.1/src/database.ts": "063281b9b4340c781ba611cb5fef7ab0fc885cb87ed4c8ec123fd772e0da5f8b", + "https://deno.land/x/sqlite3@0.11.1/src/ffi.ts": "6648dc15f10312df9d2fc8e6e2be230d82a552f28b8f77d03f32bbfba9198888", + "https://deno.land/x/sqlite3@0.11.1/src/statement.ts": "5fe86e1a0136a259c055a03988e74490d9d131c058b4c1a18385a6770cd47e2a", + "https://deno.land/x/sqlite3@0.11.1/src/util.ts": "c6604183d2ec5fb17fa0a018572ed5f2317b319dbd7bf48d88a5d06ff25b2cc3", + "https://deno.land/x/sqlite3@0.12.0/deno.json": "b03d6de05f953886662ea987212539af8456a91352684c84af2188520449d42a", + "https://deno.land/x/sqlite3@0.12.0/deps.ts": "d2f23a4489d27ed7ba1f601b86a85ff488a87603e4be7a15f3ea15154fc288ec", + "https://deno.land/x/sqlite3@0.12.0/mod.ts": "3169f246c0eddd6ed82862758f4109f167b7ba5538236240fbb26a129f1bc16c", + "https://deno.land/x/sqlite3@0.12.0/src/blob.ts": "330886fae9714e4a612786f44d8117d65f91e778cf3f40de59b34879fc7ca9ab", + "https://deno.land/x/sqlite3@0.12.0/src/constants.ts": "85fd27aa6e199093f25f5f437052e16fd0e0870b96ca9b24a98e04ddc8b7d006", + "https://deno.land/x/sqlite3@0.12.0/src/database.ts": "4d380d7f0e5a2cf74635a9fcd2b4e27373533f2816cde5357067e51fd22ad8d0", + "https://deno.land/x/sqlite3@0.12.0/src/ffi.ts": "795b598eeae4d12f182e7bcdab524b74b0f01d6deae7f4d8ce63f25c06a46154", + "https://deno.land/x/sqlite3@0.12.0/src/statement.ts": "e8ccde898aef47c7a2514953aca5359a44a285bc3dc0de5819d66f891f477be1", + "https://deno.land/x/sqlite3@0.12.0/src/util.ts": "c6604183d2ec5fb17fa0a018572ed5f2317b319dbd7bf48d88a5d06ff25b2cc3" + }, + "workspace": { + "packageJson": { + "dependencies": [ + "npm:better-sqlite3@8.5.0" + ] + } + } +} diff --git a/bench/sqlite/node.mjs b/bench/sqlite/node.mjs index 7602a87612..e620913aaa 100644 --- a/bench/sqlite/node.mjs +++ b/bench/sqlite/node.mjs @@ -1,7 +1,7 @@ // Run `node --experimental-sqlite bench/sqlite/node.mjs` to run the script. // You will need `--experimental-sqlite` flag to run this script and node v22.5.0 or higher. -import { run, bench } from "mitata"; import { DatabaseSync as Database } from "node:sqlite"; +import { bench, run } from "../runner.mjs"; const db = new Database("./src/northwind.sqlite"); diff --git a/bench/sqlite/package.json b/bench/sqlite/package.json index 593a0c83fc..42330f727d 100644 --- a/bench/sqlite/package.json +++ b/bench/sqlite/package.json @@ -5,10 +5,10 @@ }, "scripts": { "build": "exit 0", - "bench:bun": "$BUN bun.js", - "bench:node": "$NODE node.mjs", + "bench:bun": "bun bun.js", + "bench:node": "node node.mjs", "deps": "npm install && bash src/download.sh", - "bench:deno": "$DENO run -A --unstable-ffi deno.js", + "bench:deno": "deno run -A --unstable-ffi deno.js", "bench": "bun run bench:bun && bun run bench:node && bun run bench:deno" } } diff --git a/bench/tsconfig.json b/bench/tsconfig.json new file mode 100644 index 0000000000..2432a3c9d6 --- /dev/null +++ b/bench/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + // For the organize imports plugin + "jsx": "react" + } +} diff --git a/bench/websocket-server/bun.lock b/bench/websocket-server/bun.lock new file mode 100644 index 0000000000..d5e1fc28b3 --- /dev/null +++ b/bench/websocket-server/bun.lock @@ -0,0 +1,22 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "websocket-server", + "dependencies": { + "bufferutil": "4.0.7", + "utf-8-validate": "6.0.3", + "ws": "8.13.0", + }, + }, + }, + "packages": { + "bufferutil": ["bufferutil@4.0.7", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw=="], + + "node-gyp-build": ["node-gyp-build@4.6.0", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ=="], + + "utf-8-validate": ["utf-8-validate@6.0.3", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA=="], + + "ws": ["ws@8.13.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["utf-8-validate"] }, "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA=="], + } +} diff --git a/bench/websocket-server/bun.lockb b/bench/websocket-server/bun.lockb deleted file mode 100755 index 496d5c9c31..0000000000 Binary files a/bench/websocket-server/bun.lockb and /dev/null differ diff --git a/build.zig b/build.zig index f545187ddc..a43a8929f2 100644 --- a/build.zig +++ b/build.zig @@ -19,15 +19,16 @@ const OperatingSystem = @import("src/env.zig").OperatingSystem; const pathRel = fs.path.relative; /// Do not rename this constant. It is scanned by some scripts to determine which zig version to install. -const recommended_zig_version = "0.13.0"; +const recommended_zig_version = "0.14.0-dev.2987+183bb8b08"; comptime { if (!std.mem.eql(u8, builtin.zig_version_string, recommended_zig_version)) { @compileError( "" ++ - "Bun requires Zig version " ++ recommended_zig_version ++ ". This is" ++ - "automatically configured via Bun's CMake setup. You likely meant to run" ++ - "`bun setup`. If you are trying to upgrade the Zig compiler," ++ + "Bun requires Zig version " ++ recommended_zig_version ++ " (found " ++ + builtin.zig_version_string ++ "). This is " ++ + "automatically configured via Bun's CMake setup. You likely meant to run " ++ + "`bun setup`. If you are trying to upgrade the Zig compiler, " ++ "run `./scripts/download-zig.sh master` or comment this message out.", ); } @@ -44,11 +45,23 @@ const BunBuildOptions = struct { version: Version, canary_revision: ?u32, sha: []const u8, + /// enable debug logs in release builds enable_logs: bool = false, + enable_asan: bool, tracy_callstack_depth: u16, reported_nodejs_version: Version, + /// To make iterating on some '@embedFile's faster, we load them at runtime + /// instead of at compile time. This is disabled in release or if this flag + /// is set (to allow CI to build a portable executable). Affected files: + /// + /// - src/bake/runtime.ts (bundled) + /// - src/bun.js/api/FFI.h + /// + /// A similar technique is used in C++ code for JavaScript builtins + codegen_embed: bool = false, - generated_code_dir: []const u8, + /// `./build/codegen` or equivalent + codegen_path: []const u8, no_llvm: bool, cached_options_module: ?*Module = null, @@ -59,6 +72,10 @@ const BunBuildOptions = struct { !Target.x86.featureSetHas(this.target.result.cpu.features, .avx2); } + pub fn shouldEmbedCode(opts: *const BunBuildOptions) bool { + return opts.optimize != .Debug or opts.codegen_embed; + } + pub fn buildOptionsModule(this: *BunBuildOptions, b: *Build) *Module { if (this.cached_options_module) |mod| { return mod; @@ -66,6 +83,9 @@ const BunBuildOptions = struct { var opts = b.addOptions(); opts.addOption([]const u8, "base_path", b.pathFromRoot(".")); + opts.addOption([]const u8, "codegen_path", std.fs.path.resolve(b.graph.arena, &.{ b.build_root.path.?, this.codegen_path }) catch @panic("OOM")); + + opts.addOption(bool, "codegen_embed", this.shouldEmbedCode()); opts.addOption(u32, "canary_revision", this.canary_revision orelse 0); opts.addOption(bool, "is_canary", this.canary_revision != null); opts.addOption(Version, "version", this.version); @@ -89,10 +109,8 @@ const BunBuildOptions = struct { pub fn getOSVersionMin(os: OperatingSystem) ?Target.Query.OsVersion { return switch (os) { - // bun needs macOS 12 to work properly due to icucore, but we have been - // compiling everything with 11 as the minimum. .mac => .{ - .semver = .{ .major = 11, .minor = 0, .patch = 0 }, + .semver = .{ .major = 13, .minor = 0, .patch = 0 }, }, // Windows 10 1809 is the minimum supported version @@ -133,13 +151,19 @@ pub fn getCpuModel(os: OperatingSystem, arch: Arch) ?Target.Query.CpuModel { pub fn build(b: *Build) !void { std.log.info("zig compiler v{s}", .{builtin.zig_version_string}); + checked_file_exists = std.AutoHashMap(u64, void).init(b.allocator); - b.zig_lib_dir = b.zig_lib_dir orelse b.path("src/deps/zig/lib"); + // TODO: Upgrade path for 0.14.0 + // b.graph.zig_lib_directory = brk: { + // const sub_path = "vendor/zig/lib"; + // const dir = try b.build_root.handle.openDir(sub_path, .{}); + // break :brk .{ .handle = dir, .path = try b.build_root.join(b.graph.arena, &.{sub_path}) }; + // }; var target_query = b.standardTargetOptionsQueryOnly(.{}); const optimize = b.standardOptimizeOption(.{}); - const os, const arch = brk: { + const os, const arch, const abi = brk: { // resolve the target query to pick up what operating system and cpu // architecture that is desired. this information is used to slightly // refine the query. @@ -153,7 +177,8 @@ pub fn build(b: *Build) !void { .windows => .windows, else => |t| std.debug.panic("Unsupported OS tag {}", .{t}), }; - break :brk .{ os, arch }; + const abi = temp_resolved.result.abi; + break :brk .{ os, arch, abi }; }; // target must be refined to support older but very popular devices on @@ -165,18 +190,23 @@ pub fn build(b: *Build) !void { } target_query.os_version_min = getOSVersionMin(os); - target_query.glibc_version = getOSGlibCVersion(os); + target_query.glibc_version = if (abi.isGnu()) getOSGlibCVersion(os) else null; const target = b.resolveTargetQuery(target_query); - const generated_code_dir = b.pathFromRoot( - b.option([]const u8, "generated-code", "Set the generated code directory") orelse - "build/codegen", + const codegen_path = b.pathFromRoot( + b.option([]const u8, "codegen_path", "Set the generated code directory") orelse + "build/debug/codegen", ); + const codegen_embed = b.option(bool, "codegen_embed", "If codegen files should be embedded in the binary") orelse switch (b.release_mode) { + .off => false, + else => true, + }; + const bun_version = b.option([]const u8, "version", "Value of `Bun.version`") orelse "0.0.0"; b.reference_trace = ref_trace: { - const trace = b.option(u32, "reference-trace", "Set the reference trace") orelse 16; + const trace = b.option(u32, "reference-trace", "Set the reference trace") orelse 24; break :ref_trace if (trace == 0) null else trace; }; @@ -191,7 +221,8 @@ pub fn build(b: *Build) !void { .os = os, .arch = arch, - .generated_code_dir = generated_code_dir, + .codegen_path = codegen_path, + .codegen_embed = codegen_embed, .no_llvm = no_llvm, .version = try Version.parse(bun_version), @@ -206,9 +237,10 @@ pub fn build(b: *Build) !void { ), .sha = sha: { - const sha = b.option([]const u8, "sha", "Force the git sha") orelse - b.graph.env_map.get("GITHUB_SHA") orelse - b.graph.env_map.get("GIT_SHA") orelse fetch_sha: { + const sha_buildoption = b.option([]const u8, "sha", "Force the git sha"); + const sha_github = b.graph.env_map.get("GITHUB_SHA"); + const sha_env = b.graph.env_map.get("GIT_SHA"); + const sha = sha_buildoption orelse sha_github orelse sha_env orelse fetch_sha: { const result = std.process.Child.run(.{ .allocator = b.allocator, .argv = &.{ @@ -242,6 +274,7 @@ pub fn build(b: *Build) !void { .tracy_callstack_depth = b.option(u16, "tracy_callstack_depth", "") orelse 10, .enable_logs = b.option(bool, "enable_logs", "Enable logs in release") orelse false, + .enable_asan = b.option(bool, "enable_asan", "Enable asan") orelse false, }; // zig build obj @@ -267,7 +300,7 @@ pub fn build(b: *Build) !void { bun_check_obj.generated_bin = null; step.dependOn(&bun_check_obj.step); - // The default install step will run zig build check This is so ZLS + // The default install step will run zig build check. This is so ZLS // identifies the codebase, as well as performs checking if build on // save is enabled. @@ -284,6 +317,8 @@ pub fn build(b: *Build) !void { .{ .os = .mac, .arch = .aarch64 }, .{ .os = .linux, .arch = .x86_64 }, .{ .os = .linux, .arch = .aarch64 }, + .{ .os = .linux, .arch = .x86_64, .musl = true }, + .{ .os = .linux, .arch = .aarch64, .musl = true }, }); } @@ -294,22 +329,55 @@ pub fn build(b: *Build) !void { .{ .os = .windows, .arch = .x86_64 }, }); } + { + const step = b.step("check-macos", "Check for semantic analysis errors on Windows"); + addMultiCheck(b, step, build_options, &.{ + .{ .os = .mac, .arch = .x86_64 }, + .{ .os = .mac, .arch = .aarch64 }, + }); + } + { + const step = b.step("check-linux", "Check for semantic analysis errors on Windows"); + addMultiCheck(b, step, build_options, &.{ + .{ .os = .linux, .arch = .x86_64 }, + .{ .os = .linux, .arch = .aarch64 }, + }); + } + + // zig build translate-c-headers + { + const step = b.step("translate-c", "Copy generated translated-c-headers.zig to zig-out"); + step.dependOn(&b.addInstallFile(getTranslateC(b, b.graph.host, .Debug).getOutput(), "translated-c-headers.zig").step); + } + + // zig build enum-extractor + { + // const step = b.step("enum-extractor", "Extract enum definitions (invoked by a code generator)"); + // const exe = b.addExecutable(.{ + // .name = "enum_extractor", + // .root_source_file = b.path("./src/generated_enum_extractor.zig"), + // .target = b.graph.host, + // .optimize = .Debug, + // }); + // const run = b.addRunArtifact(exe); + // step.dependOn(&run.step); + } } -pub inline fn addMultiCheck( +pub fn addMultiCheck( b: *Build, parent_step: *Step, root_build_options: BunBuildOptions, - to_check: []const struct { os: OperatingSystem, arch: Arch }, + to_check: []const struct { os: OperatingSystem, arch: Arch, musl: bool = false }, ) void { - inline for (to_check) |check| { - inline for (.{ .Debug, .ReleaseFast }) |mode| { + for (to_check) |check| { + for ([_]std.builtin.Mode{ .Debug, .ReleaseFast }) |mode| { const check_target = b.resolveTargetQuery(.{ .os_tag = OperatingSystem.stdOSTag(check.os), .cpu_arch = check.arch, - .cpu_model = getCpuModel(check.os, check.arch) orelse .determined_by_cpu_arch, + .cpu_model = getCpuModel(check.os, check.arch) orelse .determined_by_arch_os, .os_version_min = getOSVersionMin(check.os), - .glibc_version = getOSGlibCVersion(check.os), + .glibc_version = if (check.musl) null else getOSGlibCVersion(check.os), }); var options: BunBuildOptions = .{ @@ -323,8 +391,9 @@ pub inline fn addMultiCheck( .tracy_callstack_depth = root_build_options.tracy_callstack_depth, .version = root_build_options.version, .reported_nodejs_version = root_build_options.reported_nodejs_version, - .generated_code_dir = root_build_options.generated_code_dir, + .codegen_path = root_build_options.codegen_path, .no_llvm = root_build_options.no_llvm, + .enable_asan = root_build_options.enable_asan, }; var obj = addBunObject(b, &options); @@ -334,12 +403,32 @@ pub inline fn addMultiCheck( } } +fn getTranslateC(b: *Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode) *Step.TranslateC { + const translate_c = b.addTranslateC(.{ + .root_source_file = b.path("src/c-headers-for-zig.h"), + .target = target, + .optimize = optimize, + .link_libc = true, + }); + inline for ([_](struct { []const u8, bool }){ + .{ "WINDOWS", translate_c.target.result.os.tag == .windows }, + .{ "POSIX", translate_c.target.result.os.tag != .windows }, + .{ "LINUX", translate_c.target.result.os.tag == .linux }, + .{ "DARWIN", translate_c.target.result.os.tag.isDarwin() }, + }) |entry| { + const str, const value = entry; + translate_c.defineCMacroRaw(b.fmt("{s}={d}", .{ str, @intFromBool(value) })); + } + return translate_c; +} + pub fn addBunObject(b: *Build, opts: *BunBuildOptions) *Compile { const obj = b.addObject(.{ .name = if (opts.optimize == .Debug) "bun-debug" else "bun", .root_source_file = switch (opts.os) { .wasm => b.path("root_wasm.zig"), - else => b.path("root.zig"), + else => b.path("src/main.zig"), + // else => b.path("root_css.zig"), }, .target = opts.target, .optimize = opts.optimize, @@ -352,8 +441,15 @@ pub fn addBunObject(b: *Build, opts: *BunBuildOptions) *Compile { .omit_frame_pointer = false, .strip = false, // stripped at the end }); + if (opts.enable_asan) { + if (@hasField(Build.Module, "sanitize_address")) { + obj.root_module.sanitize_address = true; + } else { + const fail_step = b.addFail("asan is not supported on this platform"); + obj.step.dependOn(&fail_step.step); + } + } obj.bundle_compiler_rt = false; - obj.formatted_panics = true; obj.root_module.omit_frame_pointer = false; // Link libc @@ -380,6 +476,10 @@ pub fn addBunObject(b: *Build, opts: *BunBuildOptions) *Compile { } addInternalPackages(b, obj, opts); obj.root_module.addImport("build_options", opts.buildOptionsModule(b)); + + const translate_c = getTranslateC(b, opts.target, opts.optimize); + obj.root_module.addImport("translated-c-headers", translate_c.createModule()); + return obj; } @@ -402,25 +502,21 @@ pub fn addInstallObjectFile( }, b.fmt("{s}.o", .{name})).step; } +var checked_file_exists: std.AutoHashMap(u64, void) = undefined; fn exists(path: []const u8) bool { - const file = std.fs.openFileAbsolute(path, .{ .mode = .read_only }) catch return false; - file.close(); + const entry = checked_file_exists.getOrPut(std.hash.Wyhash.hash(0, path)) catch unreachable; + if (entry.found_existing) { + // It would've panicked. + return true; + } + + std.fs.accessAbsolute(path, .{ .mode = .read_only }) catch return false; return true; } fn addInternalPackages(b: *Build, obj: *Compile, opts: *BunBuildOptions) void { const os = opts.os; - const io_path = switch (os) { - .mac => "src/io/io_darwin.zig", - .linux => "src/io/io_linux.zig", - .windows => "src/io/io_windows.zig", - else => "src/io/io_stub.zig", - }; - obj.root_module.addAnonymousImport("async_io", .{ - .root_source_file = b.path(io_path), - }); - const zlib_internal_path = switch (os) { .windows => "src/deps/zlib.win32.zig", .linux, .mac => "src/deps/zlib.posix.zig", @@ -441,23 +537,64 @@ fn addInternalPackages(b: *Build, obj: *Compile, opts: *BunBuildOptions) void { .root_source_file = b.path(async_path), }); - const zig_generated_classes_path = b.pathJoin(&.{ opts.generated_code_dir, "ZigGeneratedClasses.zig" }); - validateGeneratedPath(zig_generated_classes_path); - obj.root_module.addAnonymousImport("ZigGeneratedClasses", .{ - .root_source_file = .{ .cwd_relative = zig_generated_classes_path }, - }); - - const resolved_source_tag_path = b.pathJoin(&.{ opts.generated_code_dir, "ResolvedSourceTag.zig" }); - validateGeneratedPath(resolved_source_tag_path); - obj.root_module.addAnonymousImport("ResolvedSourceTag", .{ - .root_source_file = .{ .cwd_relative = resolved_source_tag_path }, - }); - - const error_code_path = b.pathJoin(&.{ opts.generated_code_dir, "ErrorCode.zig" }); - validateGeneratedPath(error_code_path); - obj.root_module.addAnonymousImport("ErrorCode", .{ - .root_source_file = .{ .cwd_relative = error_code_path }, - }); + // Generated code exposed as individual modules. + inline for (.{ + .{ .file = "ZigGeneratedClasses.zig", .import = "ZigGeneratedClasses" }, + .{ .file = "ResolvedSourceTag.zig", .import = "ResolvedSourceTag" }, + .{ .file = "ErrorCode.zig", .import = "ErrorCode" }, + .{ .file = "runtime.out.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "bake.client.js", .import = "bake-codegen/bake.client.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "bake.error.js", .import = "bake-codegen/bake.error.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "bake.server.js", .import = "bake-codegen/bake.server.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "bun-error/index.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "bun-error/bun-error.css", .enable = opts.shouldEmbedCode() }, + .{ .file = "fallback-decoder.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/react-refresh.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/assert.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/buffer.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/console.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/constants.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/crypto.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/domain.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/events.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/http.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/https.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/net.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/os.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/path.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/process.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/punycode.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/querystring.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/stream.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/string_decoder.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/sys.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/timers.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/tty.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/url.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/util.js", .enable = opts.shouldEmbedCode() }, + .{ .file = "node-fallbacks/zlib.js", .enable = opts.shouldEmbedCode() }, + }) |entry| { + if (!@hasField(@TypeOf(entry), "enable") or entry.enable) { + const path = b.pathJoin(&.{ opts.codegen_path, entry.file }); + validateGeneratedPath(path); + const import_path = if (@hasField(@TypeOf(entry), "import")) + entry.import + else + entry.file; + obj.root_module.addAnonymousImport(import_path, .{ + .root_source_file = .{ .cwd_relative = path }, + }); + } + } + inline for (.{ + .{ .import = "completions-bash", .file = b.path("completions/bun.bash") }, + .{ .import = "completions-zsh", .file = b.path("completions/bun.zsh") }, + .{ .import = "completions-fish", .file = b.path("completions/bun.fish") }, + }) |entry| { + obj.root_module.addAnonymousImport(entry.import, .{ + .root_source_file = entry.file, + }); + } if (os == .windows) { obj.root_module.addAnonymousImport("bun_shim_impl.exe", .{ @@ -497,7 +634,7 @@ const WindowsShim = struct { .optimize = .ReleaseFast, .use_llvm = true, .use_lld = true, - .unwind_tables = false, + .unwind_tables = .none, .omit_frame_pointer = true, .strip = true, .linkage = .static, diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000000..ee4803a290 --- /dev/null +++ b/bun.lock @@ -0,0 +1,1074 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "bun", + "devDependencies": { + "@mdn/browser-compat-data": "~5.5.28", + "@types/bun": "*", + "@types/react": "^18.3.3", + "@typescript-eslint/eslint-plugin": "^7.11.0", + "@typescript-eslint/parser": "^7.11.0", + "@vscode/debugadapter": "^1.65.0", + "autoprefixer": "^10.4.19", + "caniuse-lite": "^1.0.30001620", + "esbuild": "^0.21.4", + "eslint": "^9.4.0", + "eslint-config-prettier": "^9.1.0", + "mitata": "^0.1.11", + "peechy": "0.4.34", + "prettier": "^3.2.5", + "prettier-plugin-organize-imports": "^4.0.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "source-map-js": "^1.2.0", + "typescript": "^5.7.2", + }, + }, + "packages/bun-types": { + "name": "bun-types", + "dependencies": { + "@types/node": "*", + "@types/ws": "~8.5.10", + }, + "devDependencies": { + "@biomejs/biome": "^1.5.3", + "@definitelytyped/dtslint": "^0.0.199", + "@definitelytyped/eslint-plugin": "^0.0.197", + "typescript": "^5.0.2", + }, + }, + }, + "overrides": { + "bun-types": "workspace:packages/bun-types", + }, + "packages": { + "@biomejs/biome": ["@biomejs/biome@1.8.3", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.8.3", "@biomejs/cli-darwin-x64": "1.8.3", "@biomejs/cli-linux-arm64": "1.8.3", "@biomejs/cli-linux-arm64-musl": "1.8.3", "@biomejs/cli-linux-x64": "1.8.3", "@biomejs/cli-linux-x64-musl": "1.8.3", "@biomejs/cli-win32-arm64": "1.8.3", "@biomejs/cli-win32-x64": "1.8.3" }, "bin": { "biome": "bin/biome" } }, "sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.8.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.8.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.8.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.8.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.8.3", "", { "os": "linux", "cpu": "x64" }, "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.8.3", "", { "os": "linux", "cpu": "x64" }, "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.8.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.8.3", "", { "os": "win32", "cpu": "x64" }, "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg=="], + + "@definitelytyped/dts-critic": ["@definitelytyped/dts-critic@0.0.191", "", { "dependencies": { "@definitelytyped/header-parser": "0.0.190", "command-exists": "^1.2.9", "semver": "^7.5.4", "tmp": "^0.2.1", "typescript": "^5.2.2", "yargs": "^17.7.2" } }, "sha512-j5HK3pQYiQwSXRLJzyhXJ6KxdzLl4gXXhz3ysCtLnRQkj+zsEfloDkEZ3x2bZMWS0OsKLXmR91JeQ2/c9DFEjg=="], + + "@definitelytyped/dtslint": ["@definitelytyped/dtslint@0.0.199", "", { "dependencies": { "@definitelytyped/dts-critic": "0.0.191", "@definitelytyped/header-parser": "0.0.190", "@definitelytyped/typescript-versions": "0.0.182", "@definitelytyped/utils": "0.0.188", "@typescript-eslint/eslint-plugin": "^6.11.0", "@typescript-eslint/parser": "^6.11.0", "@typescript-eslint/types": "^6.11.0", "@typescript-eslint/typescript-estree": "^6.11.0", "@typescript-eslint/utils": "^6.11.0", "eslint": "^8.53.0", "eslint-plugin-import": "^2.29.0", "json-stable-stringify": "^1.0.2", "strip-json-comments": "^3.1.1", "tslint": "5.14.0", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.7.0-dev || >= 3.8.0-dev || >= 3.9.0-dev || >= 4.0.0-dev || >=5.0.0-dev" }, "bin": { "dtslint": "dist/index.js" } }, "sha512-GlPqLuFhylYSv0twBLaq5U+LyoDDysew99D5/AGxvhyy9vZZFcPyu6pLg4TCcefYE2DbC2qH5Ncw99W/aGMstA=="], + + "@definitelytyped/eslint-plugin": ["@definitelytyped/eslint-plugin@0.0.197", "", { "dependencies": { "@definitelytyped/utils": "0.0.188", "@typescript-eslint/types": "^6.11.0", "@typescript-eslint/utils": "^6.11.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^6.11.0", "@typescript-eslint/parser": "^6.11.0", "eslint": "^8.40.0", "eslint-plugin-jsdoc": "^44.0.0", "typescript": ">= 3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.7.0-dev || >= 3.8.0-dev || >= 3.9.0-dev || >= 4.0.0-dev || >=5.0.0-dev" } }, "sha512-jHR2tG8+JSLDIV2jhpbk+7bQXrPlwukGjRslHd6OYahGkynKZ2wa38Bd+ZXSDtVDaF4e6qnkD5GDDwb7TPrpAg=="], + + "@definitelytyped/header-parser": ["@definitelytyped/header-parser@0.0.190", "", { "dependencies": { "@definitelytyped/typescript-versions": "0.0.182", "@definitelytyped/utils": "0.0.188", "semver": "^7.5.4" } }, "sha512-awWRynVpFt6uAVDzgOa1Ry0ttjQywtt4nh9wa3/MbSTEx6PNohL1X6xDjifUElLSTIUMDSAJyWO9FuKBjnX7IQ=="], + + "@definitelytyped/typescript-versions": ["@definitelytyped/typescript-versions@0.0.182", "", {}, "sha512-ebGzGyZJW3ZSuE/nfAokKBo40HKnq/XvBbBnmCTR/3FCDX4aT7/6pQYEu2ihVI/2tf4+76GMoq0jRE69QWJ93g=="], + + "@definitelytyped/utils": ["@definitelytyped/utils@0.0.188", "", { "dependencies": { "@definitelytyped/typescript-versions": "0.0.182", "@qiwi/npm-registry-client": "^8.9.1", "@types/node": "^16.18.61", "charm": "^1.0.2", "minimatch": "^9.0.3", "tar": "^6.2.0", "tar-stream": "^3.1.6", "which": "^4.0.0" } }, "sha512-NPUP1FvRbpac09qETtr1dw3Ri7Q07hp9WGOBjqhzXeXOSxfKs7c3BY6I+XJ2yxexG05LKrCKwgKRKgZlj+Zjzw=="], + + "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.39.4", "", { "dependencies": { "comment-parser": "1.3.1", "esquery": "^1.5.0", "jsdoc-type-pratt-parser": "~4.0.0" } }, "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.0", "", { "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.11.0", "", {}, "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A=="], + + "@eslint/config-array": ["@eslint/config-array@0.17.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.4", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.1.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ=="], + + "@eslint/js": ["@eslint/js@9.7.0", "", {}, "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.4", "", {}, "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ=="], + + "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.11.14", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.0", "", {}, "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew=="], + + "@mdn/browser-compat-data": ["@mdn/browser-compat-data@5.5.49", "", {}, "sha512-FNYbYIA8WEff/+A8iMGstZhArpgy5ZxZ9uQRsBQ+qXsiKTYn3WjxpCmJRw3CFUOqFlQSZDkC3v1y3BijRnE1Pg=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@qiwi/npm-registry-client": ["@qiwi/npm-registry-client@8.9.1", "", { "dependencies": { "concat-stream": "^2.0.0", "graceful-fs": "^4.2.4", "normalize-package-data": "~1.0.1 || ^2.0.0 || ^3.0.0", "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^8.0.0", "once": "^1.4.0", "request": "^2.88.2", "retry": "^0.12.0", "safe-buffer": "^5.2.1", "semver": "2 >=2.2.1 || 3.x || 4 || 5 || 7", "slide": "^1.1.6", "ssri": "^8.0.0" }, "optionalDependencies": { "npmlog": "2 || ^3.1.0 || ^4.0.0" } }, "sha512-rZF+mG+NfijR0SHphhTLHRr4aM4gtfdwoAMY6we2VGQam8vkN1cxGG1Lg/Llrj8Dd0Mu6VjdFQRyMMRZxtZR2A=="], + + "@types/bun": ["@types/bun@1.2.2", "", { "dependencies": { "bun-types": "1.2.2" } }, "sha512-tr74gdku+AEDN5ergNiBnplr7hpDp3V1h7fqI2GcR/rsUaM39jpSeKH0TFibRvU0KwniRx5POgaYnaXbk0hU+w=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + + "@types/node": ["@types/node@22.13.5", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg=="], + + "@types/prop-types": ["@types/prop-types@15.7.12", "", {}, "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q=="], + + "@types/react": ["@types/react@18.3.3", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw=="], + + "@types/semver": ["@types/semver@7.5.8", "", {}, "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ=="], + + "@types/ws": ["@types/ws@8.5.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@7.16.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "7.16.1", "@typescript-eslint/type-utils": "7.16.1", "@typescript-eslint/utils": "7.16.1", "@typescript-eslint/visitor-keys": "7.16.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "peerDependencies": { "@typescript-eslint/parser": "^7.0.0", "eslint": "^8.56.0" } }, "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@7.16.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "7.16.1", "@typescript-eslint/types": "7.16.1", "@typescript-eslint/typescript-estree": "7.16.1", "@typescript-eslint/visitor-keys": "7.16.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.16.1", "", { "dependencies": { "@typescript-eslint/types": "7.16.1", "@typescript-eslint/visitor-keys": "7.16.1" } }, "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@7.16.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "7.16.1", "@typescript-eslint/utils": "7.16.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@7.16.1", "", {}, "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.16.1", "", { "dependencies": { "@typescript-eslint/types": "7.16.1", "@typescript-eslint/visitor-keys": "7.16.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@7.16.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.16.1", "@typescript-eslint/types": "7.16.1", "@typescript-eslint/typescript-estree": "7.16.1" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@7.16.1", "", { "dependencies": { "@typescript-eslint/types": "7.16.1", "eslint-visitor-keys": "^3.4.3" } }, "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.2.0", "", {}, "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="], + + "@vscode/debugadapter": ["@vscode/debugadapter@1.66.0", "", { "dependencies": { "@vscode/debugprotocol": "1.66.0" } }, "sha512-U/m5l6igHtQ8rSMSKW9oWeco9ySPqGYjqW9NECGPGWZ/xnoYicpqUoXhGx3xUNsafrinzWvUWrSUL/Cdgj2V+w=="], + + "@vscode/debugprotocol": ["@vscode/debugprotocol@1.66.0", "", {}, "sha512-VGcRBLNL8QwHzwerSWOb60fy1FO7bdseZv6OkTS4opoP3xeyDX58i4/wAwakL2Y4P9NafN4VGrvlXSWIratmWA=="], + + "acorn": ["acorn@8.12.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "aproba": ["aproba@1.2.0", "", {}, "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="], + + "are-docs-informative": ["are-docs-informative@0.0.2", "", {}, "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig=="], + + "are-we-there-yet": ["are-we-there-yet@1.1.7", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.1", "", { "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" } }, "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg=="], + + "array-includes": ["array-includes@3.1.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.2", "", { "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.2", "", { "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.3", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", "define-properties": "^1.2.1", "es-abstract": "^1.22.3", "es-errors": "^1.2.1", "get-intrinsic": "^1.2.3", "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" } }, "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A=="], + + "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], + + "assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "autoprefixer": ["autoprefixer@10.4.20", "", { "dependencies": { "browserslist": "^4.23.3", "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "aws-sign2": ["aws-sign2@0.7.0", "", {}, "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="], + + "aws4": ["aws4@1.13.0", "", {}, "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g=="], + + "b4a": ["b4a@1.6.6", "", {}, "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg=="], + + "babel-code-frame": ["babel-code-frame@6.26.0", "", { "dependencies": { "chalk": "^1.1.3", "esutils": "^2.0.2", "js-tokens": "^3.0.2" } }, "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "bare-events": ["bare-events@2.4.2", "", {}, "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q=="], + + "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.23.3", "", { "dependencies": { "caniuse-lite": "^1.0.30001646", "electron-to-chromium": "^1.5.4", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "builtin-modules": ["builtin-modules@1.1.1", "", {}, "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ=="], + + "builtins": ["builtins@1.0.3", "", {}, "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ=="], + + "bun-types": ["bun-types@workspace:packages/bun-types"], + + "call-bind": ["call-bind@1.0.7", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.1" } }, "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camel-case": ["camel-case@4.1.2", "", { "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001695", "", {}, "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw=="], + + "capital-case": ["capital-case@1.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A=="], + + "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "change-case": ["change-case@4.1.2", "", { "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", "constant-case": "^3.0.4", "dot-case": "^3.0.4", "header-case": "^2.0.4", "no-case": "^3.0.4", "param-case": "^3.0.4", "pascal-case": "^3.1.2", "path-case": "^3.0.4", "sentence-case": "^3.0.4", "snake-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A=="], + + "charm": ["charm@1.0.2", "", { "dependencies": { "inherits": "^2.0.1" } }, "sha512-wqW3VdPnlSWT4eRiYX+hcs+C6ViBPUWk1qTCd+37qw9kEm/a5n2qcyQDMBWvSYKN/ctqZzeXNQaeBjOetJJUkw=="], + + "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "code-point-at": ["code-point-at@1.1.0", "", {}, "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "command-exists": ["command-exists@1.2.9", "", {}, "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w=="], + + "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "comment-parser": ["comment-parser@1.3.1", "", {}, "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "concat-stream": ["concat-stream@2.0.0", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A=="], + + "console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="], + + "constant-case": ["constant-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case": "^2.0.2" } }, "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="], + + "data-view-buffer": ["data-view-buffer@1.0.1", "", { "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.0", "", { "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA=="], + + "debug": ["debug@4.3.5", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], + + "diff": ["diff@3.5.0", "", {}, "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], + + "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], + + "ecc-jsbn": ["ecc-jsbn@0.1.2", "", { "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.13", "", {}, "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "es-abstract": ["es-abstract@1.23.3", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", "data-view-buffer": "^1.0.1", "data-view-byte-length": "^1.0.1", "data-view-byte-offset": "^1.0.0", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "hasown": "^2.0.2", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", "is-data-view": "^1.0.1", "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.2", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", "string.prototype.trimend": "^1.0.8", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.15" } }, "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A=="], + + "es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.0.3", "", { "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", "hasown": "^2.0.1" } }, "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ=="], + + "es-shim-unscopables": ["es-shim-unscopables@1.0.2", "", { "dependencies": { "hasown": "^2.0.0" } }, "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw=="], + + "es-to-primitive": ["es-to-primitive@1.2.1", "", { "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="], + + "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "escalade": ["escalade@3.1.2", "", {}, "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.7.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.17.0", "@eslint/eslintrc": "^3.1.0", "@eslint/js": "9.7.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.0.2", "eslint-visitor-keys": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw=="], + + "eslint-config-prettier": ["eslint-config-prettier@9.1.0", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw=="], + + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], + + "eslint-module-utils": ["eslint-module-utils@2.8.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q=="], + + "eslint-plugin-import": ["eslint-plugin-import@2.29.1", "", { "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", "hasown": "^2.0.0", "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.7", "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw=="], + + "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@44.2.7", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.39.4", "are-docs-informative": "^0.0.2", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.5.0", "semver": "^7.5.1", "spdx-expression-parse": "^3.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-PcAJO7Wh4xIHPT+StBRpEbWgwCpIrYk75zL31RMbduVVHpgiy3Y8aXQ6pdbRJOq0fxHuepWSEAve8ZrPWTSKRg=="], + + "eslint-scope": ["eslint-scope@8.0.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.0.0", "", {}, "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw=="], + + "espree": ["espree@10.1.0", "", { "dependencies": { "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.0.0" } }, "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extsprintf": ["extsprintf@1.3.0", "", {}, "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], + + "fast-glob": ["fast-glob@3.3.2", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.17.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.1", "", {}, "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="], + + "for-each": ["for-each@0.3.3", "", { "dependencies": { "is-callable": "^1.1.3" } }, "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw=="], + + "forever-agent": ["forever-agent@0.6.1", "", {}, "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="], + + "form-data": ["form-data@2.3.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="], + + "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], + + "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "function.prototype.name": ["function.prototype.name@1.1.6", "", { "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "functions-have-names": "^1.2.3" } }, "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "gauge": ["gauge@2.7.4", "", { "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" } }, "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="], + + "get-symbol-description": ["get-symbol-description@1.0.2", "", { "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4" } }, "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg=="], + + "getpass": ["getpass@0.1.7", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "gopd": ["gopd@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3" } }, "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "har-schema": ["har-schema@2.0.0", "", {}, "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="], + + "har-validator": ["har-validator@5.1.5", "", { "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w=="], + + "has-ansi": ["has-ansi@2.0.0", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg=="], + + "has-bigints": ["has-bigints@1.0.2", "", {}, "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.0.3", "", {}, "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="], + + "has-symbols": ["has-symbols@1.0.3", "", {}, "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "has-unicode": ["has-unicode@2.0.1", "", {}, "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "header-case": ["header-case@2.0.4", "", { "dependencies": { "capital-case": "^1.0.4", "tslib": "^2.0.3" } }, "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q=="], + + "hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], + + "http-signature": ["http-signature@1.2.0", "", { "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ=="], + + "ignore": ["ignore@5.3.1", "", {}, "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw=="], + + "import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "internal-slot": ["internal-slot@1.0.7", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g=="], + + "is-array-buffer": ["is-array-buffer@3.0.4", "", { "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" } }, "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw=="], + + "is-bigint": ["is-bigint@1.0.4", "", { "dependencies": { "has-bigints": "^1.0.1" } }, "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg=="], + + "is-boolean-object": ["is-boolean-object@1.1.2", "", { "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-core-module": ["is-core-module@2.15.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA=="], + + "is-data-view": ["is-data-view@1.0.1", "", { "dependencies": { "is-typed-array": "^1.1.13" } }, "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w=="], + + "is-date-object": ["is-date-object@1.0.5", "", { "dependencies": { "has-tostringtag": "^1.0.0" } }, "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.0.7", "", { "dependencies": { "has-tostringtag": "^1.0.0" } }, "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ=="], + + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], + + "is-regex": ["is-regex@1.1.4", "", { "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7" } }, "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg=="], + + "is-string": ["is-string@1.0.7", "", { "dependencies": { "has-tostringtag": "^1.0.0" } }, "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg=="], + + "is-symbol": ["is-symbol@1.0.4", "", { "dependencies": { "has-symbols": "^1.0.2" } }, "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg=="], + + "is-typed-array": ["is-typed-array@1.1.13", "", { "dependencies": { "which-typed-array": "^1.1.14" } }, "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw=="], + + "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], + + "is-weakref": ["is-weakref@1.0.2", "", { "dependencies": { "call-bind": "^1.0.2" } }, "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ=="], + + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsbn": ["jsbn@0.1.1", "", {}, "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="], + + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@4.0.0", "", {}, "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify": ["json-stable-stringify@1.1.1", "", { "dependencies": { "call-bind": "^1.0.5", "isarray": "^2.0.5", "jsonify": "^0.0.1", "object-keys": "^1.1.1" } }, "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "jsonify": ["jsonify@0.0.1", "", {}, "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg=="], + + "jsprim": ["jsprim@1.4.2", "", { "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.4.0", "verror": "1.10.0" } }, "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], + + "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.7", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "mitata": ["mitata@0.1.11", "", {}, "sha512-cs6FiWcnRxn7atVumm8wA8R70XCDmMXgVgb/qWUSjr5dwuIBr7zC+22mbGYPlbyFixlIOjuP//A0e72Q1ZoGDw=="], + + "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + + "nanoid": ["nanoid@3.3.7", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], + + "node-releases": ["node-releases@2.0.18", "", {}, "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="], + + "normalize-package-data": ["normalize-package-data@3.0.3", "", { "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA=="], + + "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], + + "npm-package-arg": ["npm-package-arg@8.1.5", "", { "dependencies": { "hosted-git-info": "^4.0.1", "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" } }, "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q=="], + + "npmlog": ["npmlog@4.1.2", "", { "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="], + + "number-is-nan": ["number-is-nan@1.0.1", "", {}, "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="], + + "oauth-sign": ["oauth-sign@0.9.0", "", {}, "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.2", "", {}, "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.5", "", { "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ=="], + + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], + + "object.values": ["object.values@1.2.0", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "param-case": ["param-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="], + + "path-case": ["path-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "peechy": ["peechy@0.4.34", "", { "dependencies": { "change-case": "^4.1.2" }, "bin": { "peechy": "cli.js" } }, "sha512-Cpke/cCqqZHhkyxz7mdqS8ZAGJFUi5icu3ZGqxm9GC7g2VrhH0tmjPhZoWHAN5ghw1m1wq5+2YvfbDSqgC4+Zg=="], + + "performance-now": ["performance-now@2.1.0", "", {}, "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="], + + "picocolors": ["picocolors@1.0.1", "", {}, "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.0.0", "", {}, "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q=="], + + "postcss": ["postcss@8.4.41", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", "source-map-js": "^1.2.0" } }, "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.3.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew=="], + + "prettier-plugin-organize-imports": ["prettier-plugin-organize-imports@4.1.0", "", { "peerDependencies": { "prettier": ">=2.0", "typescript": ">=2.9", "vue-tsc": "^2.1.0" }, "optionalPeers": ["vue-tsc"] }, "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "psl": ["psl@1.9.0", "", {}, "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "qs": ["qs@6.5.3", "", {}, "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "queue-tick": ["queue-tick@1.0.1", "", {}, "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag=="], + + "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], + + "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.2", "", { "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "set-function-name": "^2.0.1" } }, "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw=="], + + "request": ["request@2.88.2", "", { "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "resolve": ["resolve@1.22.8", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-array-concat": ["safe-array-concat@1.1.2", "", { "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" } }, "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-regex-test": ["safe-regex-test@1.0.3", "", { "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", "is-regex": "^1.1.4" } }, "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], + + "sentence-case": ["sentence-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg=="], + + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "side-channel": ["side-channel@1.0.6", "", { "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" } }, "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "slide": ["slide@1.1.6", "", {}, "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw=="], + + "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], + + "source-map-js": ["source-map-js@1.2.0", "", {}, "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="], + + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], + + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.18", "", {}, "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "sshpk": ["sshpk@1.18.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="], + + "ssri": ["ssri@8.0.1", "", { "dependencies": { "minipass": "^3.1.1" } }, "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ=="], + + "streamx": ["streamx@2.18.0", "", { "dependencies": { "fast-fifo": "^1.3.2", "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.9", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.0", "es-object-atoms": "^1.0.0" } }, "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + + "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], + + "text-decoder": ["text-decoder@1.1.1", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA=="], + + "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], + + "tmp": ["tmp@0.2.3", "", {}, "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="], + + "ts-api-utils": ["ts-api-utils@1.3.0", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ=="], + + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + + "tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], + + "tslint": ["tslint@5.14.0", "", { "dependencies": { "babel-code-frame": "^6.22.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", "diff": "^3.2.0", "glob": "^7.1.1", "js-yaml": "^3.7.0", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", "tsutils": "^2.29.0" }, "peerDependencies": { "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" }, "bin": { "tslint": "./bin/tslint" } }, "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ=="], + + "tsutils": ["tsutils@2.29.0", "", { "dependencies": { "tslib": "^1.8.1" }, "peerDependencies": { "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA=="], + + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + + "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.2", "", { "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", "is-typed-array": "^1.1.13" } }, "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", "is-typed-array": "^1.1.13" } }, "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.2", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", "is-typed-array": "^1.1.13" } }, "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA=="], + + "typed-array-length": ["typed-array-length@1.0.6", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0" } }, "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g=="], + + "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], + + "typescript": ["typescript@5.7.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg=="], + + "unbox-primitive": ["unbox-primitive@1.0.2", "", { "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw=="], + + "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.0", "", { "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ=="], + + "upper-case": ["upper-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg=="], + + "upper-case-first": ["upper-case-first@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], + + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], + + "validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], + + "verror": ["verror@1.10.0", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.0.2", "", { "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" } }, "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg=="], + + "which-typed-array": ["which-typed-array@1.1.15", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.2" } }, "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA=="], + + "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "@definitelytyped/dts-critic/typescript": ["typescript@5.5.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ=="], + + "@definitelytyped/dtslint/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="], + + "@definitelytyped/dtslint/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="], + + "@definitelytyped/dtslint/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + + "@definitelytyped/dtslint/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], + + "@definitelytyped/dtslint/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="], + + "@definitelytyped/dtslint/eslint": ["eslint@8.57.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.0", "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ=="], + + "@definitelytyped/eslint-plugin/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + + "@definitelytyped/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="], + + "@definitelytyped/utils/@types/node": ["@types/node@16.18.102", "", {}, "sha512-eSe2YwGCcRjqPidxfm20IAq02krERWcIIJW4FNPkU0zQLbc4L9pvhsmB0p6UJecjEf0j/E2ERHsKq7madvthKw=="], + + "@definitelytyped/utils/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@definitelytyped/utils/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@types/ws/@types/node": ["@types/node@20.12.14", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "are-we-there-yet/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "autoprefixer/caniuse-lite": ["caniuse-lite@1.0.30001653", "", {}, "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw=="], + + "babel-code-frame/chalk": ["chalk@1.1.3", "", { "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } }, "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A=="], + + "babel-code-frame/js-tokens": ["js-tokens@3.0.2", "", {}, "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg=="], + + "browserslist/caniuse-lite": ["caniuse-lite@1.0.30001653", "", {}, "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw=="], + + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + + "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "gauge/string-width": ["string-width@1.0.2", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw=="], + + "gauge/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], + + "has-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "ssri/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "tar/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "tslint/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "tslint/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "tslint/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "tslint/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "tsutils/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], + + "@definitelytyped/dtslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], + + "@definitelytyped/dtslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="], + + "@definitelytyped/dtslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], + + "@definitelytyped/dtslint/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], + + "@definitelytyped/dtslint/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], + + "@definitelytyped/dtslint/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], + + "@definitelytyped/dtslint/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], + + "@definitelytyped/dtslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], + + "@definitelytyped/dtslint/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], + + "@definitelytyped/dtslint/eslint/@eslint/js": ["@eslint/js@8.57.0", "", {}, "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g=="], + + "@definitelytyped/dtslint/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], + + "@definitelytyped/dtslint/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@definitelytyped/dtslint/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], + + "@definitelytyped/dtslint/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], + + "@definitelytyped/dtslint/eslint/globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], + + "@definitelytyped/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], + + "@definitelytyped/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], + + "@definitelytyped/utils/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@definitelytyped/utils/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "@types/ws/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "are-we-there-yet/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "are-we-there-yet/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "are-we-there-yet/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "babel-code-frame/chalk/ansi-styles": ["ansi-styles@2.2.1", "", {}, "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="], + + "babel-code-frame/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "babel-code-frame/chalk/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], + + "babel-code-frame/chalk/supports-color": ["supports-color@2.0.0", "", {}, "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="], + + "gauge/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="], + + "gauge/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "tslint/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "tslint/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "tslint/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "tslint/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "@definitelytyped/dtslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@definitelytyped/dtslint/@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@definitelytyped/dtslint/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@definitelytyped/dtslint/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@definitelytyped/dtslint/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], + + "@definitelytyped/dtslint/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], + + "@definitelytyped/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], + + "@definitelytyped/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], + + "@definitelytyped/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], + + "babel-code-frame/chalk/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "tslint/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "tslint/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "@definitelytyped/dtslint/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@definitelytyped/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@definitelytyped/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@definitelytyped/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "tslint/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + } +} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 0e38e94cfc..0000000000 Binary files a/bun.lockb and /dev/null differ diff --git a/bunfig.node-test.toml b/bunfig.node-test.toml new file mode 100644 index 0000000000..284945e352 --- /dev/null +++ b/bunfig.node-test.toml @@ -0,0 +1,4 @@ +# FIXME: move this back to test/js/node +# https://github.com/oven-sh/bun/issues/16289 +[test] +preload = ["./test/js/node/harness.ts", "./test/preload.ts"] diff --git a/cmake/CompilerFlags.cmake b/cmake/CompilerFlags.cmake new file mode 100644 index 0000000000..9f61034af8 --- /dev/null +++ b/cmake/CompilerFlags.cmake @@ -0,0 +1,309 @@ +# clang: https://clang.llvm.org/docs/CommandGuide/clang.html +# clang-cl: https://clang.llvm.org/docs/UsersManual.html#id11 + +# --- Macros --- + +macro(setb variable) + if(${variable}) + set(${variable} ON) + else() + set(${variable} OFF) + endif() +endmacro() + +set(targets WIN32 APPLE UNIX LINUX) + +foreach(target ${targets}) + setb(${target}) +endforeach() + +# --- CPU target --- +if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|ARM|arm64|ARM64|aarch64|AARCH64") + if(APPLE) + register_compiler_flags(-mcpu=apple-m1) + else() + register_compiler_flags(-march=armv8-a+crc -mtune=ampere1) + endif() +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|X86_64|x64|X64|amd64|AMD64") + if(ENABLE_BASELINE) + register_compiler_flags(-march=nehalem) + else() + register_compiler_flags(-march=haswell) + endif() +else() + unsupported(CMAKE_SYSTEM_PROCESSOR) +endif() + +# --- MSVC runtime --- +if(WIN32) + register_compiler_flags( + DESCRIPTION "Use static MSVC runtime" + /MTd ${DEBUG} + /MT ${RELEASE} + /U_DLL + ) +endif() + +if(ENABLE_ASAN) + register_compiler_flags( + DESCRIPTION "Enable AddressSanitizer" + -fsanitize=address + ) +endif() + +# --- Optimization level --- +if(DEBUG) + register_compiler_flags( + DESCRIPTION "Disable optimization" + /Od ${WIN32} + -O0 ${UNIX} + ) +elseif(ENABLE_SMOL) + register_compiler_flags( + DESCRIPTION "Optimize for size" + /Os ${WIN32} + -Os ${UNIX} + ) +else() + register_compiler_flags( + DESCRIPTION "Optimize for speed" + /O2 ${WIN32} # TODO: change to /0t (same as -O3) to match macOS and Linux? + -O3 ${UNIX} + ) +endif() + +# --- Debug level --- +if(WIN32) + register_compiler_flags( + DESCRIPTION "Enable debug symbols (.pdb)" + /Z7 + ) +elseif(APPLE) + register_compiler_flags( + DESCRIPTION "Enable debug symbols (.dSYM)" + -gdwarf-4 + ) +endif() + +if(UNIX) + register_compiler_flags( + DESCRIPTION "Enable debug symbols" + -g3 ${DEBUG} + -g1 ${RELEASE} + ) + + register_compiler_flags( + DESCRIPTION "Optimize debug symbols for LLDB" + -glldb + ) +endif() + +# TODO: consider other debug options +# -fdebug-macro # Emit debug info for macros +# -fstandalone-debug # Emit debug info for non-system libraries +# -fno-eliminate-unused-debug-types # Don't eliminate unused debug symbols + +# --- C/C++ flags --- +register_compiler_flags( + DESCRIPTION "Disable C/C++ exceptions" + -fno-exceptions ${UNIX} + /EHsc ${WIN32} # (s- disables C++, c- disables C) +) + +register_compiler_flags( + DESCRIPTION "Disable C++ static destructors" + LANGUAGES CXX + -Xclang ${WIN32} + -fno-c++-static-destructors +) + +register_compiler_flags( + DESCRIPTION "Disable runtime type information (RTTI)" + /GR- ${WIN32} + -fno-rtti ${UNIX} +) + +register_compiler_flags( + DESCRIPTION "Keep frame pointers" + /Oy- ${WIN32} + -fno-omit-frame-pointer ${UNIX} + -mno-omit-leaf-frame-pointer ${UNIX} +) + +if(UNIX) + register_compiler_flags( + DESCRIPTION "Set C/C++ visibility to hidden" + -fvisibility=hidden + -fvisibility-inlines-hidden + ) + + register_compiler_flags( + DESCRIPTION "Disable unwind tables" + -fno-unwind-tables + -fno-asynchronous-unwind-tables + ) +endif() + +register_compiler_flags( + DESCRIPTION "Place each function in its own section" + -ffunction-sections ${UNIX} + /Gy ${WIN32} +) + +register_compiler_flags( + DESCRIPTION "Place each data item in its own section" + -fdata-sections ${UNIX} + /Gw ${WIN32} +) + +# having this enabled in debug mode on macOS >=14 causes libarchive to fail to configure with the error: +# > pid_t doesn't exist on this platform? +if((DEBUG AND LINUX) OR((NOT DEBUG) AND UNIX)) + register_compiler_flags( + DESCRIPTION "Emit an address-significance table" + -faddrsig + ) +endif() + +if(WIN32) + register_compiler_flags( + DESCRIPTION "Enable string pooling" + /GF + ) + + register_compiler_flags( + DESCRIPTION "Assume thread-local variables are defined in the executable" + /GA + ) +endif() + +# --- Linker flags --- +if(LINUX) + register_linker_flags( + DESCRIPTION "Disable relocation read-only (RELRO)" + -Wl,-z,norelro + ) + register_compiler_flags( + DESCRIPTION "Disable semantic interposition" + -fno-semantic-interposition + ) +endif() + +# --- Assertions --- + +# Note: This is a helpful guide about assertions: +# https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++ +if(ENABLE_ASSERTIONS) + register_compiler_flags( + DESCRIPTION "Do not eliminate null-pointer checks" + -fno-delete-null-pointer-checks + ) + + register_compiler_definitions( + DESCRIPTION "Enable libc++ assertions" + _LIBCPP_ENABLE_ASSERTIONS=1 + _LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE ${RELEASE} + _LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG ${DEBUG} + ) + + register_compiler_definitions( + DESCRIPTION "Enable fortified sources" + _FORTIFY_SOURCE=3 + ) + + if(LINUX) + register_compiler_definitions( + DESCRIPTION "Enable glibc++ assertions" + _GLIBCXX_ASSERTIONS=1 + ) + endif() +else() + register_compiler_definitions( + DESCRIPTION "Disable debug assertions" + NDEBUG=1 + ) + + register_compiler_definitions( + DESCRIPTION "Disable libc++ assertions" + _LIBCPP_ENABLE_ASSERTIONS=0 + _LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE + ) + + if(LINUX) + register_compiler_definitions( + DESCRIPTION "Disable glibc++ assertions" + _GLIBCXX_ASSERTIONS=0 + ) + endif() +endif() + +# --- Diagnostics --- +if(UNIX) + register_compiler_flags( + DESCRIPTION "Enable color diagnostics" + -fdiagnostics-color=always + ) +endif() + +register_compiler_flags( + DESCRIPTION "Set C/C++ error limit" + -ferror-limit=${ERROR_LIMIT} +) + +# --- LTO --- +if(ENABLE_LTO) + register_compiler_flags( + DESCRIPTION "Enable link-time optimization (LTO)" + -flto=full ${UNIX} + -flto ${WIN32} + ) + + if(UNIX) + register_compiler_flags( + DESCRIPTION "Enable virtual tables" + LANGUAGES CXX + -fforce-emit-vtables + -fwhole-program-vtables + ) + + register_linker_flags( + DESCRIPTION "Enable link-time optimization (LTO)" + -flto=full + -fwhole-program-vtables + -fforce-emit-vtables + ) + endif() +endif() + +# --- Remapping --- +if(UNIX AND CI) + register_compiler_flags( + DESCRIPTION "Remap source files" + -ffile-prefix-map=${CWD}=. + -ffile-prefix-map=${VENDOR_PATH}=vendor + -ffile-prefix-map=${CACHE_PATH}=cache + ) +endif() + +# --- Features --- + +# Valgrind cannot handle SSE4.2 instructions +# This is needed for picohttpparser +if(ENABLE_VALGRIND AND ARCH STREQUAL "x64") + register_compiler_definitions(__SSE4_2__=0) +endif() + +# --- Other --- + +# Workaround for CMake and clang-cl bug. +# https://github.com/ninja-build/ninja/issues/2280 +if(WIN32 AND NOT CMAKE_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "Note: including file:") +endif() + +# WebKit uses -std=gnu++20 on non-macOS non-Windows. +# If we do not set this, it will crash at startup on the first memory allocation. +if(NOT WIN32 AND NOT APPLE) + set(CMAKE_CXX_EXTENSIONS ON) + set(CMAKE_POSITION_INDEPENDENT_CODE OFF) +endif() diff --git a/cmake/Globals.cmake b/cmake/Globals.cmake new file mode 100644 index 0000000000..af66b00f08 --- /dev/null +++ b/cmake/Globals.cmake @@ -0,0 +1,936 @@ +include(CMakeParseArguments) + +# --- Global macros --- + +# setx() +# Description: +# Sets a variable, similar to `set()`, but also prints the value. +# Arguments: +# variable string - The variable to set +# value string - The value to set the variable to +macro(setx) + set(${ARGV}) + message(STATUS "Set ${ARGV0}: ${${ARGV0}}") +endmacro() + +# optionx() +# Description: +# Defines an option, similar to `option()`, but allows for bool, string, and regex types. +# Arguments: +# variable string - The variable to set +# type string - The type of the variable +# description string - The description of the variable +# DEFAULT string - The default value of the variable +# PREVIEW string - The preview value of the variable +# REGEX string - The regex to match the value +# REQUIRED bool - Whether the variable is required +macro(optionx variable type description) + set(options REQUIRED) + set(oneValueArgs DEFAULT PREVIEW REGEX) + set(multiValueArgs) + cmake_parse_arguments(${variable} "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(DEFINED ${variable}) + set(${variable}_VALUE ${${variable}}) + endif() + + if(NOT ${type} MATCHES "^(BOOL|STRING|FILEPATH|PATH|INTERNAL)$") + set(${variable}_REGEX ${type}) + set(${variable}_TYPE STRING) + else() + set(${variable}_TYPE ${type}) + endif() + + set(${variable} ${${variable}_DEFAULT} CACHE ${${variable}_TYPE} ${description}) + set(${variable}_SOURCE "argument") + set(${variable}_PREVIEW -D${variable}) + + if(DEFINED ENV{${variable}}) + set(${variable} $ENV{${variable}} CACHE ${${variable}_TYPE} ${description} FORCE) + set(${variable}_SOURCE "environment variable") + set(${variable}_PREVIEW ${variable}) + endif() + + if(NOT ${variable} AND ${${variable}_REQUIRED}) + message(FATAL_ERROR "Required ${${variable}_SOURCE} is missing: please set, ${${variable}_PREVIEW}=<${${variable}_REGEX}>") + endif() + + if(${type} STREQUAL "BOOL") + if("${${variable}}" MATCHES "^(TRUE|true|ON|on|YES|yes|1)$") + set(${variable} ON) + elseif("${${variable}}" MATCHES "^(FALSE|false|OFF|off|NO|no|0)$") + set(${variable} OFF) + else() + message(FATAL_ERROR "Invalid ${${variable}_SOURCE}: ${${variable}_PREVIEW}=\"${${variable}}\", please use ${${variable}_PREVIEW}=") + endif() + endif() + + if(DEFINED ${variable}_REGEX AND NOT "^(${${variable}_REGEX})$" MATCHES "${${variable}}") + message(FATAL_ERROR "Invalid ${${variable}_SOURCE}: ${${variable}_PREVIEW}=\"${${variable}}\", please use ${${variable}_PREVIEW}=<${${variable}_REGEX}>") + endif() + + if(NOT ${variable}_VALUE STREQUAL ${variable}) + message(STATUS "Set ${variable}: ${${variable}}") + endif() +endmacro() + +# unsupported() +# Description: +# Prints a message that the feature is not supported. +# Arguments: +# variable string - The variable that is not supported +macro(unsupported variable) + message(FATAL_ERROR "Unsupported ${variable}: \"${${variable}}\"") +endmacro() + +# --- CMake variables --- + +setx(CMAKE_VERSION ${CMAKE_VERSION}) +setx(CMAKE_COMMAND ${CMAKE_COMMAND}) +setx(CMAKE_HOST_SYSTEM_NAME ${CMAKE_HOST_SYSTEM_NAME}) + +# In script mode, using -P, this variable is not set +if(NOT DEFINED CMAKE_HOST_SYSTEM_PROCESSOR) + cmake_host_system_information(RESULT CMAKE_HOST_SYSTEM_PROCESSOR QUERY OS_PLATFORM) +endif() +setx(CMAKE_HOST_SYSTEM_PROCESSOR ${CMAKE_HOST_SYSTEM_PROCESSOR}) + +if(CMAKE_HOST_APPLE) + set(HOST_OS "darwin") +elseif(CMAKE_HOST_WIN32) + set(HOST_OS "windows") +elseif(CMAKE_HOST_LINUX) + set(HOST_OS "linux") +else() + unsupported(CMAKE_HOST_SYSTEM_NAME) +endif() + +if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64|ARM64|aarch64|AARCH64") + set(HOST_OS "aarch64") +elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64|X86_64|x64|X64|amd64|AMD64") + set(HOST_OS "x64") +else() + unsupported(CMAKE_HOST_SYSTEM_PROCESSOR) +endif() + +setx(CMAKE_EXPORT_COMPILE_COMMANDS ON) +setx(CMAKE_COLOR_DIAGNOSTICS ON) + +cmake_host_system_information(RESULT CORE_COUNT QUERY NUMBER_OF_LOGICAL_CORES) +optionx(CMAKE_BUILD_PARALLEL_LEVEL STRING "The number of parallel build jobs" DEFAULT ${CORE_COUNT}) + +# --- Global variables --- + +setx(CWD ${CMAKE_SOURCE_DIR}) +setx(BUILD_PATH ${CMAKE_BINARY_DIR}) + +optionx(CACHE_PATH FILEPATH "The path to the cache directory" DEFAULT ${BUILD_PATH}/cache) +optionx(CACHE_STRATEGY "read-write|read-only|write-only|none" "The strategy to use for caching" DEFAULT "read-write") + +optionx(CI BOOL "If CI is enabled" DEFAULT OFF) +optionx(ENABLE_ANALYSIS BOOL "If static analysis targets should be enabled" DEFAULT OFF) + +if(CI) + set(WARNING FATAL_ERROR) +else() + set(WARNING WARNING) +endif() + +# TODO: This causes flaky zig builds in CI, so temporarily disable it. +# if(CI) +# set(DEFAULT_VENDOR_PATH ${CACHE_PATH}/vendor) +# else() +# set(DEFAULT_VENDOR_PATH ${CWD}/vendor) +# endif() + +optionx(VENDOR_PATH FILEPATH "The path to the vendor directory" DEFAULT ${CWD}/vendor) +optionx(TMP_PATH FILEPATH "The path to the temporary directory" DEFAULT ${BUILD_PATH}/tmp) + +# --- Helper functions --- + +# setenv() +# Description: +# Sets an environment variable during the build step, and writes it to a .env file. +# Arguments: +# variable string - The variable to set +# value string - The value to set the variable to +function(setenv variable value) + set(ENV_PATH ${BUILD_PATH}/.env) + if(value MATCHES "/|\\\\") + file(TO_NATIVE_PATH ${value} value) + endif() + set(ENV_LINE "${variable}=${value}") + + if(EXISTS ${ENV_PATH}) + file(STRINGS ${ENV_PATH} ENV_FILE ENCODING UTF-8) + + foreach(line ${ENV_FILE}) + if(line MATCHES "^${variable}=") + list(REMOVE_ITEM ENV_FILE ${line}) + set(ENV_MODIFIED ON) + endif() + endforeach() + + if(ENV_MODIFIED) + list(APPEND ENV_FILE "${variable}=${value}") + list(JOIN ENV_FILE "\n" ENV_FILE) + file(WRITE ${ENV_PATH} ${ENV_FILE}) + else() + file(APPEND ${ENV_PATH} "\n${variable}=${value}") + endif() + else() + file(WRITE ${ENV_PATH} ${ENV_LINE}) + endif() + + message(STATUS "Set ENV ${variable}: ${value}") +endfunction() + +# satisfies_range() +# Description: +# Check if a version satisfies a version range +# Arguments: +# version string - The version to check (e.g. "1.2.3") +# range string - The range to check against (e.g. ">=1.2.3") +# variable string - The variable to store the result in +function(satisfies_range version range variable) + if(range STREQUAL "ignore") + set(${variable} ON PARENT_SCOPE) + return() + endif() + + set(${variable} OFF PARENT_SCOPE) + + string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" match "${version}") + if(NOT match) + return() + endif() + set(version ${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}) + + string(REGEX MATCH "(>=|<=|>|<)?([0-9]+)\\.([0-9]+)\\.([0-9]+)" match "${range}") + if(NOT match) + return() + endif() + set(comparator ${CMAKE_MATCH_1}) + set(range ${CMAKE_MATCH_2}.${CMAKE_MATCH_3}.${CMAKE_MATCH_4}) + + if(comparator STREQUAL ">=") + set(comparator VERSION_GREATER_EQUAL) + elseif(comparator STREQUAL ">") + set(comparator VERSION_GREATER) + elseif(comparator STREQUAL "<=") + set(comparator VERSION_LESS_EQUAL) + elseif(comparator STREQUAL "<") + set(comparator VERSION_LESS) + else() + set(comparator VERSION_EQUAL) + endif() + + if(version ${comparator} ${range}) + set(${variable} ON PARENT_SCOPE) + endif() +endfunction() + +# find_command() +# Description: +# Finds a command, similar to `find_program()`, but allows for version checking. +# Arguments: +# VARIABLE string - The variable to set +# VERSION_VARIABLE string - The variable to check for the version +# COMMAND string[] - The names of the command to find +# PATHS string[] - The paths to search for the command +# REQUIRED bool - If false, the command is optional +# VERSION string - The version of the command to find (e.g. "1.2.3" or ">1.2.3") +function(find_command) + set(args VARIABLE VERSION_VARIABLE REQUIRED VERSION) + set(multiArgs COMMAND PATHS) + cmake_parse_arguments(FIND "" "${args}" "${multiArgs}" ${ARGN}) + + if(NOT FIND_VARIABLE OR NOT FIND_COMMAND) + message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION}: VARIABLE and COMMAND are required") + endif() + + if(NOT FIND_VERSION_VARIABLE) + set(FIND_VERSION_VARIABLE ${FIND_VARIABLE}_VERSION) + endif() + + list(GET FIND_COMMAND 0 FIND_NAME) + if(FIND_VERSION) + optionx(${FIND_VERSION_VARIABLE} STRING "The version of ${FIND_NAME} to find" DEFAULT "${FIND_VERSION}") + + function(find_command_version variable exe) + set(${variable} OFF PARENT_SCOPE) + + if(${exe} MATCHES "(go|zig)(\.exe)?$") + set(command ${exe} version) + else() + set(command ${exe} --version) + endif() + + execute_process( + COMMAND ${command} + RESULT_VARIABLE result + OUTPUT_VARIABLE output + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + + if(NOT result EQUAL 0) + set(reason "exited with ${result}") + elseif(NOT output) + set(reason "no output") + else() + string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" match "${output}") + if(match) + set(version ${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}) + set(reason "\"${version}\"") + else() + set(reason "no version") + endif() + endif() + + set_property(GLOBAL PROPERTY ${FIND_NAME} "${exe}: ${reason}" APPEND) + + if(version) + satisfies_range(${version} ${FIND_VERSION} ${variable}) + set(${variable} ${${variable}} PARENT_SCOPE) + endif() + endfunction() + + set(FIND_VALIDATOR VALIDATOR find_command_version) + endif() + + find_program( + ${FIND_VARIABLE} + NAMES ${FIND_COMMAND} + PATHS ${FIND_PATHS} + ${FIND_VALIDATOR} + ) + + if(NOT FIND_REQUIRED STREQUAL "OFF" AND ${FIND_VARIABLE} MATCHES "NOTFOUND") + set(error "Command not found: \"${FIND_NAME}\"") + + if(FIND_VERSION) + set(error "${error} that satisfies version \"${${FIND_VERSION_VARIABLE}}\"") + endif() + + get_property(FIND_RESULTS GLOBAL PROPERTY ${FIND_NAME}) + if(NOT FIND_RESULTS MATCHES "NOTFOUND") + set(error "${error}\nThe following commands did not satisfy the requirement:") + foreach(result ${FIND_RESULTS}) + set(error "${error}\n ${result}") + endforeach() + endif() + + set(error "${error}\nTo fix this, either: + 1. Install ${FIND_NAME} ${${FIND_VERSION_VARIABLE}} + 2. Set -D${FIND_VERSION_VARIABLE}= to require a different version + 3. Set -D${FIND_VERSION_VARIABLE}=ignore to allow any version +") + message(FATAL_ERROR ${error}) + endif() + + if(${FIND_VARIABLE} MATCHES "NOTFOUND") + unset(${FIND_VARIABLE} PARENT_SCOPE) + else() + setx(${FIND_VARIABLE} ${${FIND_VARIABLE}} PARENT_SCOPE) + endif() +endfunction() + +# register_command() +# Description: +# Registers a command, similar to `add_custom_command()`, but has more validation and features. +# Arguments: +# COMMAND string[] - The command to run +# COMMENT string - The comment to display in the log +# CWD string - The working directory to run the command in +# ENVIRONMENT string[] - The environment variables to set (e.g. "DEBUG=1") +# TARGETS string[] - The targets that this command depends on +# SOURCES string[] - The files that this command depends on +# OUTPUTS string[] - The files that this command produces +# ARTIFACTS string[] - The files that this command produces, and uploads as an artifact in CI +# ALWAYS_RUN bool - If true, the command will always run +# TARGET string - The target to register the command with +# TARGET_PHASE string - The target phase to register the command with (e.g. PRE_BUILD, PRE_LINK, POST_BUILD) +# GROUP string - The group to register the command with (e.g. similar to JOB_POOL) +function(register_command) + set(options ALWAYS_RUN) + set(args COMMENT CWD TARGET TARGET_PHASE GROUP) + set(multiArgs COMMAND ENVIRONMENT TARGETS SOURCES OUTPUTS ARTIFACTS) + cmake_parse_arguments(CMD "${options}" "${args}" "${multiArgs}" ${ARGN}) + + if(NOT CMD_COMMAND) + message(FATAL_ERROR "register_command: COMMAND is required") + endif() + + if(NOT CMD_CWD) + set(CMD_CWD ${CWD}) + endif() + + if(CMD_ENVIRONMENT) + set(CMD_COMMAND ${CMAKE_COMMAND} -E env ${CMD_ENVIRONMENT} ${CMD_COMMAND}) + endif() + + if(NOT CMD_COMMENT) + string(JOIN " " CMD_COMMENT ${CMD_COMMAND}) + endif() + + set(CMD_COMMANDS COMMAND ${CMD_COMMAND}) + set(CMD_EFFECTIVE_DEPENDS) + + list(GET CMD_COMMAND 0 CMD_EXECUTABLE) + if(CMD_EXECUTABLE MATCHES "/|\\\\") + list(APPEND CMD_EFFECTIVE_DEPENDS ${CMD_EXECUTABLE}) + endif() + + foreach(target ${CMD_TARGETS}) + if(target MATCHES "/|\\\\") + message(FATAL_ERROR "register_command: TARGETS contains \"${target}\", if it's a path add it to SOURCES instead") + endif() + if(NOT TARGET ${target}) + message(FATAL_ERROR "register_command: TARGETS contains \"${target}\", but it's not a target") + endif() + list(APPEND CMD_EFFECTIVE_DEPENDS ${target}) + endforeach() + + foreach(source ${CMD_SOURCES}) + if(NOT source MATCHES "^(${CWD}|${BUILD_PATH}|${CACHE_PATH}|${VENDOR_PATH})") + message(FATAL_ERROR "register_command: SOURCES contains \"${source}\", if it's a path, make it absolute, otherwise add it to TARGETS instead") + endif() + list(APPEND CMD_EFFECTIVE_DEPENDS ${source}) + endforeach() + + if(NOT CMD_EFFECTIVE_DEPENDS AND NOT CMD_ALWAYS_RUN) + message(FATAL_ERROR "register_command: TARGETS or SOURCES is required") + endif() + + set(CMD_EFFECTIVE_OUTPUTS) + + foreach(output ${CMD_OUTPUTS}) + if(NOT output MATCHES "^(${CWD}|${BUILD_PATH}|${CACHE_PATH}|${VENDOR_PATH})") + message(FATAL_ERROR "register_command: OUTPUTS contains \"${output}\", if it's a path, make it absolute") + endif() + list(APPEND CMD_EFFECTIVE_OUTPUTS ${output}) + endforeach() + + foreach(artifact ${CMD_ARTIFACTS}) + if(NOT artifact MATCHES "^(${CWD}|${BUILD_PATH}|${CACHE_PATH}|${VENDOR_PATH})") + message(FATAL_ERROR "register_command: ARTIFACTS contains \"${artifact}\", if it's a path, make it absolute") + endif() + list(APPEND CMD_EFFECTIVE_OUTPUTS ${artifact}) + if(BUILDKITE) + file(RELATIVE_PATH filename ${BUILD_PATH} ${artifact}) + list(APPEND CMD_COMMANDS COMMAND ${CMAKE_COMMAND} -E chdir ${BUILD_PATH} buildkite-agent artifact upload ${filename}) + endif() + endforeach() + + foreach(output ${CMD_EFFECTIVE_OUTPUTS}) + get_source_file_property(generated ${output} GENERATED) + if(generated) + list(REMOVE_ITEM CMD_EFFECTIVE_OUTPUTS ${output}) + list(APPEND CMD_EFFECTIVE_OUTPUTS ${output}.always_run_${CMD_TARGET}) + endif() + endforeach() + + if(CMD_ALWAYS_RUN) + list(APPEND CMD_EFFECTIVE_OUTPUTS ${CMD_CWD}/.always_run_${CMD_TARGET}) + endif() + + if(CMD_TARGET_PHASE) + if(NOT CMD_TARGET) + message(FATAL_ERROR "register_command: TARGET is required when TARGET_PHASE is set") + endif() + if(NOT TARGET ${CMD_TARGET}) + message(FATAL_ERROR "register_command: TARGET is not a valid target: ${CMD_TARGET}") + endif() + add_custom_command( + TARGET ${CMD_TARGET} ${CMD_TARGET_PHASE} + COMMENT ${CMD_COMMENT} + WORKING_DIRECTORY ${CMD_CWD} + VERBATIM ${CMD_COMMANDS} + ) + set_property(TARGET ${CMD_TARGET} PROPERTY OUTPUT ${CMD_EFFECTIVE_OUTPUTS} APPEND) + set_property(TARGET ${CMD_TARGET} PROPERTY DEPENDS ${CMD_EFFECTIVE_DEPENDS} APPEND) + return() + endif() + + if(NOT CMD_EFFECTIVE_OUTPUTS) + message(FATAL_ERROR "register_command: OUTPUTS or ARTIFACTS is required, or set ALWAYS_RUN") + endif() + + if(CMD_TARGET) + if(TARGET ${CMD_TARGET}) + message(FATAL_ERROR "register_command: TARGET is already registered: ${CMD_TARGET}") + endif() + add_custom_target(${CMD_TARGET} + COMMENT ${CMD_COMMENT} + DEPENDS ${CMD_EFFECTIVE_OUTPUTS} + JOB_POOL ${CMD_GROUP} + ) + if(TARGET clone-${CMD_TARGET}) + add_dependencies(${CMD_TARGET} clone-${CMD_TARGET}) + endif() + endif() + + add_custom_command( + VERBATIM ${CMD_COMMANDS} + WORKING_DIRECTORY ${CMD_CWD} + COMMENT ${CMD_COMMENT} + DEPENDS ${CMD_EFFECTIVE_DEPENDS} + OUTPUT ${CMD_EFFECTIVE_OUTPUTS} + JOB_POOL ${CMD_GROUP} + ) +endfunction() + +# parse_package_json() +# Description: +# Parses a package.json file. +# Arguments: +# CWD string - The directory to look for the package.json file +# VERSION_VARIABLE string - The variable to set to the package version +# NODE_MODULES_VARIABLE string - The variable to set to list of node_modules sources +function(parse_package_json) + set(args CWD VERSION_VARIABLE NODE_MODULES_VARIABLE) + cmake_parse_arguments(NPM "" "${args}" "" ${ARGN}) + + if(NOT NPM_CWD) + set(NPM_CWD ${CWD}) + endif() + + set(NPM_PACKAGE_JSON_PATH ${NPM_CWD}/package.json) + + if(NOT EXISTS ${NPM_PACKAGE_JSON_PATH}) + message(FATAL_ERROR "parse_package_json: package.json not found: ${NPM_PACKAGE_JSON_PATH}") + endif() + + file(READ ${NPM_PACKAGE_JSON_PATH} NPM_PACKAGE_JSON) + if(NOT NPM_PACKAGE_JSON) + message(FATAL_ERROR "parse_package_json: failed to read package.json: ${NPM_PACKAGE_JSON_PATH}") + endif() + + if(NPM_VERSION_VARIABLE) + string(JSON NPM_VERSION ERROR_VARIABLE error GET "${NPM_PACKAGE_JSON}" version) + if(error) + message(FATAL_ERROR "parse_package_json: failed to read 'version': ${error}") + endif() + set(${NPM_VERSION_VARIABLE} ${NPM_VERSION} PARENT_SCOPE) + endif() + + if(NPM_NODE_MODULES_VARIABLE) + set(NPM_NODE_MODULES) + set(NPM_NODE_MODULES_PATH ${NPM_CWD}/node_modules) + set(NPM_NODE_MODULES_PROPERTIES "devDependencies" "dependencies") + + foreach(property ${NPM_NODE_MODULES_PROPERTIES}) + string(JSON NPM_${property} ERROR_VARIABLE error GET "${NPM_PACKAGE_JSON}" "${property}") + if(error MATCHES "not found") + continue() + endif() + if(error) + message(FATAL_ERROR "parse_package_json: failed to read '${property}': ${error}") + endif() + + string(JSON NPM_${property}_LENGTH ERROR_VARIABLE error LENGTH "${NPM_${property}}") + if(error) + message(FATAL_ERROR "parse_package_json: failed to read '${property}' length: ${error}") + endif() + + math(EXPR NPM_${property}_MAX_INDEX "${NPM_${property}_LENGTH} - 1") + foreach(i RANGE 0 ${NPM_${property}_MAX_INDEX}) + string(JSON NPM_${property}_${i} ERROR_VARIABLE error MEMBER "${NPM_${property}}" ${i}) + if(error) + message(FATAL_ERROR "parse_package_json: failed to index '${property}' at ${i}: ${error}") + endif() + list(APPEND NPM_NODE_MODULES ${NPM_NODE_MODULES_PATH}/${NPM_${property}_${i}}/package.json) + endforeach() + endforeach() + + set(${NPM_NODE_MODULES_VARIABLE} ${NPM_NODE_MODULES} PARENT_SCOPE) + endif() +endfunction() + +# register_bun_install() +# Description: +# Registers a command to run `bun install` in a directory. +# Arguments: +# CWD string - The directory to run `bun install` +# NODE_MODULES_VARIABLE string - The variable to set to list of node_modules sources +function(register_bun_install) + set(args CWD NODE_MODULES_VARIABLE) + cmake_parse_arguments(NPM "" "${args}" "" ${ARGN}) + + if(NOT NPM_CWD) + set(NPM_CWD ${CWD}) + endif() + + if(NPM_CWD STREQUAL ${CWD}) + set(NPM_COMMENT "bun install") + else() + set(NPM_COMMENT "bun install --cwd ${NPM_CWD}") + endif() + + parse_package_json( + CWD + ${NPM_CWD} + NODE_MODULES_VARIABLE + NPM_NODE_MODULES + ) + + if(NOT NPM_NODE_MODULES) + message(FATAL_ERROR "register_bun_install: ${NPM_CWD}/package.json does not have dependencies?") + endif() + + register_command( + COMMENT + ${NPM_COMMENT} + CWD + ${NPM_CWD} + COMMAND + ${BUN_EXECUTABLE} + install + --frozen-lockfile + SOURCES + ${NPM_CWD}/package.json + OUTPUTS + ${NPM_NODE_MODULES} + ) + + set(${NPM_NODE_MODULES_VARIABLE} ${NPM_NODE_MODULES} PARENT_SCOPE) +endfunction() + +# register_repository() +# Description: +# Registers a git repository. +# Arguments: +# NAME string - The name of the repository +# REPOSITORY string - The repository to clone +# BRANCH string - The branch to clone +# TAG string - The tag to clone +# COMMIT string - The commit to clone +# PATH string - The path to clone the repository to +# OUTPUTS string - The outputs of the repository +function(register_repository) + set(args NAME REPOSITORY BRANCH TAG COMMIT PATH) + set(multiArgs OUTPUTS) + cmake_parse_arguments(GIT "" "${args}" "${multiArgs}" ${ARGN}) + + if(NOT GIT_REPOSITORY) + message(FATAL_ERROR "git_clone: REPOSITORY is required") + endif() + + if(NOT GIT_BRANCH AND NOT GIT_TAG AND NOT GIT_COMMIT) + message(FATAL_ERROR "git_clone: COMMIT, TAG, or BRANCH is required") + endif() + + if(NOT GIT_PATH) + set(GIT_PATH ${VENDOR_PATH}/${GIT_NAME}) + endif() + + set(GIT_EFFECTIVE_OUTPUTS) + foreach(output ${GIT_OUTPUTS}) + list(APPEND GIT_EFFECTIVE_OUTPUTS ${GIT_PATH}/${output}) + endforeach() + + register_command( + TARGET + clone-${GIT_NAME} + COMMENT + "Cloning ${GIT_NAME}" + COMMAND + ${CMAKE_COMMAND} + -DGIT_PATH=${GIT_PATH} + -DGIT_REPOSITORY=${GIT_REPOSITORY} + -DGIT_NAME=${GIT_NAME} + -DGIT_COMMIT=${GIT_COMMIT} + -DGIT_TAG=${GIT_TAG} + -DGIT_BRANCH=${GIT_BRANCH} + -P ${CWD}/cmake/scripts/GitClone.cmake + OUTPUTS + ${GIT_PATH} + ${GIT_EFFECTIVE_OUTPUTS} + ) +endfunction() + +# register_cmake_command() +# Description: +# Registers a command that builds an external CMake project. +# Arguments: +# TARGET string - The target to register the command with +# ARGS string[] - The arguments to pass to CMake (e.g. -DKEY=VALUE) +# CWD string - The directory where the CMake files are located +# BUILD_PATH string - The path to build the project to +# LIB_PATH string - The path to the libraries +# TARGETS string[] - The targets to build from CMake +# LIBRARIES string[] - The libraries that are built +# INCLUDES string[] - The include paths +function(register_cmake_command) + set(args TARGET CWD BUILD_PATH LIB_PATH) + set(multiArgs ARGS TARGETS LIBRARIES INCLUDES) + # Use "MAKE" instead of "CMAKE" to prevent conflicts with CMake's own CMAKE_* variables + cmake_parse_arguments(MAKE "" "${args}" "${multiArgs}" ${ARGN}) + + if(NOT MAKE_TARGET) + message(FATAL_ERROR "register_cmake_command: TARGET is required") + endif() + + if(TARGET ${MAKE_TARGET}) + message(FATAL_ERROR "register_cmake_command: TARGET is already a target: ${MAKE_TARGET}") + endif() + + if(NOT MAKE_CWD) + set(MAKE_CWD ${VENDOR_PATH}/${MAKE_TARGET}) + endif() + + if(NOT MAKE_BUILD_PATH) + set(MAKE_BUILD_PATH ${BUILD_PATH}/${MAKE_TARGET}) + endif() + + if(MAKE_LIB_PATH) + set(MAKE_LIB_PATH ${MAKE_BUILD_PATH}/${MAKE_LIB_PATH}) + else() + set(MAKE_LIB_PATH ${MAKE_BUILD_PATH}) + endif() + + set(MAKE_EFFECTIVE_ARGS -B${MAKE_BUILD_PATH} ${CMAKE_ARGS}) + + set(setFlags GENERATOR BUILD_TYPE) + set(appendFlags C_FLAGS CXX_FLAGS LINKER_FLAGS) + set(specialFlags POSITION_INDEPENDENT_CODE) + set(flags ${setFlags} ${appendFlags} ${specialFlags}) + + foreach(arg ${MAKE_ARGS}) + foreach(flag ${flags}) + if(arg MATCHES "-DCMAKE_${flag}=(.*)") + if(DEFINED MAKE_${flag}) + message(FATAL_ERROR "register_cmake_command: CMAKE_${flag} was already set: \"${MAKE_${flag}}\"") + endif() + set(MAKE_${flag} ${CMAKE_MATCH_1}) + set(${arg}_USED ON) + endif() + endforeach() + if(NOT ${arg}_USED) + list(APPEND MAKE_EFFECTIVE_ARGS ${arg}) + endif() + endforeach() + + foreach(flag ${setFlags}) + if(NOT DEFINED MAKE_${flag} AND DEFINED CMAKE_${flag}) + set(MAKE_${flag} ${CMAKE_${flag}}) + endif() + endforeach() + + foreach(flag ${appendFlags}) + if(MAKE_${flag}) + set(MAKE_${flag} "${CMAKE_${flag}} ${MAKE_${flag}}") + else() + set(MAKE_${flag} ${CMAKE_${flag}}) + endif() + endforeach() + + if(MAKE_POSITION_INDEPENDENT_CODE AND NOT WIN32) + set(MAKE_C_FLAGS "${MAKE_C_FLAGS} -fPIC") + set(MAKE_CXX_FLAGS "${MAKE_CXX_FLAGS} -fPIC") + elseif(APPLE) + set(MAKE_C_FLAGS "${MAKE_C_FLAGS} -fno-pic -fno-pie") + set(MAKE_CXX_FLAGS "${MAKE_CXX_FLAGS} -fno-pic -fno-pie") + endif() + + set(effectiveFlags ${setFlags} ${appendFlags}) + foreach(flag ${effectiveFlags}) + list(APPEND MAKE_EFFECTIVE_ARGS "-DCMAKE_${flag}=${MAKE_${flag}}") + endforeach() + + if(DEFINED FRESH) + list(APPEND MAKE_EFFECTIVE_ARGS --fresh) + endif() + + register_command( + COMMENT "Configuring ${MAKE_TARGET}" + TARGET configure-${MAKE_TARGET} + COMMAND ${CMAKE_COMMAND} ${MAKE_EFFECTIVE_ARGS} + CWD ${MAKE_CWD} + OUTPUTS ${MAKE_BUILD_PATH}/CMakeCache.txt + ) + + if(TARGET clone-${MAKE_TARGET}) + add_dependencies(configure-${MAKE_TARGET} clone-${MAKE_TARGET}) + endif() + + set(MAKE_BUILD_ARGS --build ${MAKE_BUILD_PATH} --config ${MAKE_BUILD_TYPE}) + + set(MAKE_EFFECTIVE_LIBRARIES) + set(MAKE_ARTIFACTS) + foreach(lib ${MAKE_LIBRARIES}) + if(lib MATCHES "^(WIN32|UNIX|APPLE)$") + if(${lib}) + continue() + else() + list(POP_BACK MAKE_ARTIFACTS) + endif() + else() + list(APPEND MAKE_EFFECTIVE_LIBRARIES ${lib}) + if(lib MATCHES "\\.") + list(APPEND MAKE_ARTIFACTS ${MAKE_LIB_PATH}/${lib}) + else() + list(APPEND MAKE_ARTIFACTS ${MAKE_LIB_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${CMAKE_STATIC_LIBRARY_SUFFIX}) + endif() + endif() + endforeach() + + if(NOT MAKE_TARGETS) + set(MAKE_TARGETS ${MAKE_EFFECTIVE_LIBRARIES}) + endif() + + foreach(target ${MAKE_TARGETS}) + list(APPEND MAKE_BUILD_ARGS --target ${target}) + endforeach() + + set(MAKE_EFFECTIVE_INCLUDES) + foreach(include ${MAKE_INCLUDES}) + if(include STREQUAL ".") + list(APPEND MAKE_EFFECTIVE_INCLUDES ${MAKE_CWD}) + else() + list(APPEND MAKE_EFFECTIVE_INCLUDES ${MAKE_CWD}/${include}) + endif() + endforeach() + + register_command( + COMMENT "Building ${MAKE_TARGET}" + TARGET ${MAKE_TARGET} + TARGETS configure-${MAKE_TARGET} + COMMAND ${CMAKE_COMMAND} ${MAKE_BUILD_ARGS} + CWD ${MAKE_CWD} + ARTIFACTS ${MAKE_ARTIFACTS} + ) + + if(MAKE_EFFECTIVE_INCLUDES) + target_include_directories(${bun} PRIVATE ${MAKE_EFFECTIVE_INCLUDES}) + if(TARGET clone-${MAKE_TARGET} AND NOT BUN_LINK_ONLY) + add_dependencies(${bun} clone-${MAKE_TARGET}) + endif() + endif() + + # HACK: Workaround for duplicate symbols when linking mimalloc.o + # >| duplicate symbol '_mi_page_queue_append(mi_heap_s*, mi_page_queue_s*, mi_page_queue_s*)' in: + # >| mimalloc/CMakeFiles/mimalloc-obj.dir/src/static.c.o + # >| ld: 287 duplicate symbols for architecture arm64 + if(NOT BUN_LINK_ONLY OR NOT MAKE_ARTIFACTS MATCHES "static.c.o") + target_link_libraries(${bun} PRIVATE ${MAKE_ARTIFACTS}) + endif() + + if(BUN_LINK_ONLY) + target_sources(${bun} PRIVATE ${MAKE_ARTIFACTS}) + endif() +endfunction() + +# register_compiler_flag() +# Description: +# Registers a compiler flag, similar to `add_compile_options()`, but has more validation and features. +# Arguments: +# flags string[] - The flags to register +# DESCRIPTION string - The description of the flag +# LANGUAGES string[] - The languages to register the flag (default: C, CXX) +# TARGETS string[] - The targets to register the flag (default: all) +function(register_compiler_flags) + set(args DESCRIPTION) + set(multiArgs LANGUAGES TARGETS) + cmake_parse_arguments(COMPILER "" "${args}" "${multiArgs}" ${ARGN}) + + if(NOT COMPILER_LANGUAGES) + set(COMPILER_LANGUAGES C CXX) + endif() + + set(COMPILER_FLAGS) + foreach(flag ${COMPILER_UNPARSED_ARGUMENTS}) + if(flag STREQUAL "ON") + continue() + elseif(flag STREQUAL "OFF") + list(POP_BACK COMPILER_FLAGS) + elseif(flag MATCHES "^(-|/)") + list(APPEND COMPILER_FLAGS ${flag}) + else() + message(FATAL_ERROR "register_compiler_flags: Invalid flag: \"${flag}\"") + endif() + endforeach() + + foreach(target ${COMPILER_TARGETS}) + if(NOT TARGET ${target}) + message(FATAL_ERROR "register_compiler_flags: \"${target}\" is not a target") + endif() + endforeach() + + foreach(lang ${COMPILER_LANGUAGES}) + list(JOIN COMPILER_FLAGS " " COMPILER_FLAGS_STRING) + + if(NOT COMPILER_TARGETS) + set(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS} ${COMPILER_FLAGS_STRING}" PARENT_SCOPE) + endif() + + foreach(target ${COMPILER_TARGETS}) + set(${target}_CMAKE_${lang}_FLAGS "${${target}_CMAKE_${lang}_FLAGS} ${COMPILER_FLAGS_STRING}" PARENT_SCOPE) + endforeach() + endforeach() + + foreach(lang ${COMPILER_LANGUAGES}) + foreach(flag ${COMPILER_FLAGS}) + if(NOT COMPILER_TARGETS) + add_compile_options($<$:${flag}>) + endif() + + foreach(target ${COMPILER_TARGETS}) + get_target_property(type ${target} TYPE) + if(type MATCHES "EXECUTABLE|LIBRARY") + target_compile_options(${target} PRIVATE $<$:${flag}>) + endif() + endforeach() + endforeach() + endforeach() +endfunction() + +function(register_compiler_definitions) + +endfunction() + +# register_linker_flags() +# Description: +# Registers a linker flag, similar to `add_link_options()`. +# Arguments: +# flags string[] - The flags to register +# DESCRIPTION string - The description of the flag +function(register_linker_flags) + set(args DESCRIPTION) + cmake_parse_arguments(LINKER "" "${args}" "" ${ARGN}) + + foreach(flag ${LINKER_UNPARSED_ARGUMENTS}) + if(flag STREQUAL "ON") + continue() + elseif(flag STREQUAL "OFF") + list(POP_FRONT LINKER_FLAGS) + elseif(flag MATCHES "^(-|/)") + list(APPEND LINKER_FLAGS ${flag}) + else() + message(FATAL_ERROR "register_linker_flags: Invalid flag: \"${flag}\"") + endif() + endforeach() + + add_link_options(${LINKER_FLAGS}) +endfunction() + +function(print_compiler_flags) + get_property(targets DIRECTORY PROPERTY BUILDSYSTEM_TARGETS) + set(languages C CXX) + foreach(target ${targets}) + get_target_property(type ${target} TYPE) + message(STATUS "Target: ${target}") + foreach(lang ${languages}) + if(${target}_CMAKE_${lang}_FLAGS) + message(STATUS " ${lang} Flags: ${${target}_CMAKE_${lang}_FLAGS}") + endif() + endforeach() + endforeach() + foreach(lang ${languages}) + message(STATUS "Language: ${lang}") + if(CMAKE_${lang}_FLAGS) + message(STATUS " Flags: ${CMAKE_${lang}_FLAGS}") + endif() + endforeach() +endfunction() diff --git a/cmake/Options.cmake b/cmake/Options.cmake new file mode 100644 index 0000000000..5874cf644e --- /dev/null +++ b/cmake/Options.cmake @@ -0,0 +1,159 @@ +if(NOT CMAKE_SYSTEM_NAME OR NOT CMAKE_SYSTEM_PROCESSOR) + message(FATAL_ERROR "CMake included this file before project() was called") +endif() + +optionx(BUN_LINK_ONLY BOOL "If only the linking step should be built" DEFAULT OFF) +optionx(BUN_CPP_ONLY BOOL "If only the C++ part of Bun should be built" DEFAULT OFF) + +optionx(BUILDKITE BOOL "If Buildkite is enabled" DEFAULT OFF) +optionx(GITHUB_ACTIONS BOOL "If GitHub Actions is enabled" DEFAULT OFF) + +if(BUILDKITE) + optionx(BUILDKITE_COMMIT STRING "The commit hash") +endif() + +optionx(CMAKE_BUILD_TYPE "Debug|Release|RelWithDebInfo|MinSizeRel" "The build type to use" REQUIRED) + +if(CMAKE_BUILD_TYPE MATCHES "Release|RelWithDebInfo|MinSizeRel") + setx(RELEASE ON) +else() + setx(RELEASE OFF) +endif() + +if(CMAKE_BUILD_TYPE MATCHES "Debug") + setx(DEBUG ON) +else() + setx(DEBUG OFF) +endif() + +if(CMAKE_BUILD_TYPE MATCHES "MinSizeRel") + setx(ENABLE_SMOL ON) +endif() + +if(APPLE) + setx(OS "darwin") +elseif(WIN32) + setx(OS "windows") +elseif(LINUX) + setx(OS "linux") +else() + message(FATAL_ERROR "Unsupported operating system: ${CMAKE_SYSTEM_NAME}") +endif() + +if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64|arm") + setx(ARCH "aarch64") +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|x64|AMD64") + setx(ARCH "x64") +else() + message(FATAL_ERROR "Unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}") +endif() + +if(LINUX) + if(EXISTS "/etc/alpine-release") + set(DEFAULT_ABI "musl") + else() + set(DEFAULT_ABI "gnu") + endif() + + optionx(ABI "musl|gnu" "The ABI to use (e.g. musl, gnu)" DEFAULT ${DEFAULT_ABI}) +endif() + +if(ARCH STREQUAL "x64") + optionx(ENABLE_BASELINE BOOL "If baseline features should be used for older CPUs (e.g. disables AVX, AVX2)" DEFAULT OFF) +endif() + +optionx(ENABLE_LOGS BOOL "If debug logs should be enabled" DEFAULT ${DEBUG}) +optionx(ENABLE_ASSERTIONS BOOL "If debug assertions should be enabled" DEFAULT ${DEBUG}) + +optionx(ENABLE_CANARY BOOL "If canary features should be enabled" DEFAULT ON) + +if(ENABLE_CANARY) + set(DEFAULT_CANARY_REVISION "1") +else() + set(DEFAULT_CANARY_REVISION "0") +endif() + +optionx(CANARY_REVISION STRING "The canary revision of the build" DEFAULT ${DEFAULT_CANARY_REVISION}) + +if(RELEASE AND LINUX AND CI) + set(DEFAULT_LTO ON) +else() + set(DEFAULT_LTO OFF) +endif() + +optionx(ENABLE_LTO BOOL "If LTO (link-time optimization) should be used" DEFAULT ${DEFAULT_LTO}) + +if(LINUX) + optionx(ENABLE_VALGRIND BOOL "If Valgrind support should be enabled" DEFAULT OFF) +endif() +if(DEBUG AND APPLE AND CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64") + optionx(ENABLE_ASAN BOOL "If ASAN support should be enabled" DEFAULT ON) +else() + optionx(ENABLE_ASAN BOOL "If ASAN support should be enabled" DEFAULT OFF) +endif() + +optionx(ENABLE_PRETTIER BOOL "If prettier should be ran" DEFAULT OFF) + +if(USE_VALGRIND AND NOT USE_BASELINE) + message(WARNING "If valgrind is enabled, baseline must also be enabled") + setx(USE_BASELINE ON) +endif() + +if(BUILDKITE_COMMIT) + set(DEFAULT_REVISION ${BUILDKITE_COMMIT}) +else() + execute_process( + COMMAND git rev-parse HEAD + WORKING_DIRECTORY ${CWD} + OUTPUT_VARIABLE DEFAULT_REVISION + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + if(NOT DEFAULT_REVISION AND NOT DEFINED ENV{GIT_SHA} AND NOT DEFINED ENV{GITHUB_SHA}) + set(DEFAULT_REVISION "unknown") + endif() +endif() + +optionx(REVISION STRING "The git revision of the build" DEFAULT ${DEFAULT_REVISION}) + +# Used in process.version, process.versions.node, napi, and elsewhere +optionx(NODEJS_VERSION STRING "The version of Node.js to report" DEFAULT "22.6.0") + +# Used in process.versions.modules and compared while loading V8 modules +optionx(NODEJS_ABI_VERSION STRING "The ABI version of Node.js to report" DEFAULT "127") + +if(APPLE) + set(DEFAULT_STATIC_SQLITE OFF) +else() + set(DEFAULT_STATIC_SQLITE ON) +endif() + +optionx(USE_STATIC_SQLITE BOOL "If SQLite should be statically linked" DEFAULT ${DEFAULT_STATIC_SQLITE}) + +set(DEFAULT_STATIC_LIBATOMIC ON) + +if(CMAKE_HOST_LINUX AND NOT WIN32 AND NOT APPLE) + execute_process( + COMMAND grep -w "NAME" /etc/os-release + OUTPUT_VARIABLE LINUX_DISTRO + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + if(LINUX_DISTRO MATCHES "NAME=\"(Arch|Manjaro|Artix) Linux( ARM)?\"|NAME=\"openSUSE Tumbleweed\"") + set(DEFAULT_STATIC_LIBATOMIC OFF) + endif() +endif() + +optionx(USE_STATIC_LIBATOMIC BOOL "If libatomic should be statically linked" DEFAULT ${DEFAULT_STATIC_LIBATOMIC}) + +if(APPLE) + set(DEFAULT_WEBKIT_ICU OFF) +else() + set(DEFAULT_WEBKIT_ICU ON) +endif() + +optionx(USE_WEBKIT_ICU BOOL "Use the ICU libraries from WebKit" DEFAULT ${DEFAULT_WEBKIT_ICU}) + +optionx(ERROR_LIMIT STRING "Maximum number of errors to show when compiling C++ code" DEFAULT "100") + +list(APPEND CMAKE_ARGS -DCMAKE_EXPORT_COMPILE_COMMANDS=ON) diff --git a/cmake/Policies.cmake b/cmake/Policies.cmake new file mode 100644 index 0000000000..d55a4ae021 --- /dev/null +++ b/cmake/Policies.cmake @@ -0,0 +1,11 @@ +# Let the MSVC runtime be set using CMAKE_MSVC_RUNTIME_LIBRARY, instead of automatically. +# Since CMake 3.15. +cmake_policy(SET CMP0091 NEW) + +# If INTERPROCEDURAL_OPTIMIZATION is enabled and not supported by the compiler, throw an error. +# Since CMake 3.9. +cmake_policy(SET CMP0069 NEW) + +# Use CMAKE_{C,CXX}_STANDARD when evaluating try_compile(). +# Since CMake 3.8. +cmake_policy(SET CMP0067 NEW) diff --git a/cmake/analysis/RunClangFormat.cmake b/cmake/analysis/RunClangFormat.cmake new file mode 100644 index 0000000000..106ac54ef6 --- /dev/null +++ b/cmake/analysis/RunClangFormat.cmake @@ -0,0 +1,67 @@ +# https://clang.llvm.org/docs/ClangFormat.html + +file(GLOB BUN_H_SOURCES LIST_DIRECTORIES false ${CONFIGURE_DEPENDS} + ${CWD}/src/bun.js/bindings/*.h + ${CWD}/src/bun.js/modules/*.h +) + +set(CLANG_FORMAT_SOURCES ${BUN_C_SOURCES} ${BUN_CXX_SOURCES} ${BUN_H_SOURCES}) + +register_command( + TARGET + clang-format-check + COMMENT + "Running clang-format" + COMMAND + ${CLANG_FORMAT_PROGRAM} + -Werror + --dry-run + --verbose + ${CLANG_FORMAT_SOURCES} + ALWAYS_RUN +) + +register_command( + TARGET + clang-format + COMMENT + "Fixing clang-format" + COMMAND + ${CLANG_FORMAT_PROGRAM} + -i # edits files in-place + --verbose + ${CLANG_FORMAT_SOURCES} + ALWAYS_RUN +) + +if(GIT_CHANGED_SOURCES) + set(CLANG_FORMAT_CHANGED_SOURCES) + foreach(source ${CLANG_FORMAT_SOURCES}) + list(FIND GIT_CHANGED_SOURCES ${source} index) + if(NOT ${index} EQUAL -1) + list(APPEND CLANG_FORMAT_CHANGED_SOURCES ${source}) + endif() + endforeach() +endif() + +if(CLANG_FORMAT_CHANGED_SOURCES) + set(CLANG_FORMAT_DIFF_COMMAND ${CLANG_FORMAT_PROGRAM} + -i # edits files in-place + --verbose + ${CLANG_FORMAT_CHANGED_SOURCES} + ) +else() + set(CLANG_FORMAT_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for clang-format") +endif() + +register_command( + TARGET + clang-format-diff + COMMENT + "Running clang-format on changed files" + COMMAND + ${CLANG_FORMAT_DIFF_COMMAND} + CWD + ${BUILD_PATH} + ALWAYS_RUN +) diff --git a/cmake/analysis/RunClangTidy.cmake b/cmake/analysis/RunClangTidy.cmake new file mode 100644 index 0000000000..ee5782ade8 --- /dev/null +++ b/cmake/analysis/RunClangTidy.cmake @@ -0,0 +1,74 @@ +# https://clang.llvm.org/extra/clang-tidy/ + +set(CLANG_TIDY_SOURCES ${BUN_C_SOURCES} ${BUN_CXX_SOURCES}) + +set(CLANG_TIDY_COMMAND ${CLANG_TIDY_PROGRAM} + -p ${BUILD_PATH} + --config-file=${CWD}/.clang-tidy +) + +if(CMAKE_COLOR_DIAGNOSTICS) + list(APPEND CLANG_TIDY_COMMAND --use-color) +endif() + +register_command( + TARGET + clang-tidy + COMMENT + "Running clang-tidy" + COMMAND + ${CLANG_TIDY_COMMAND} + ${CLANG_TIDY_SOURCES} + --fix + --fix-errors + --fix-notes + CWD + ${BUILD_PATH} + ALWAYS_RUN +) + +register_command( + TARGET + clang-tidy-check + COMMENT + "Checking clang-tidy" + COMMAND + ${CLANG_TIDY_COMMAND} + ${CLANG_TIDY_SOURCES} + CWD + ${BUILD_PATH} + ALWAYS_RUN +) + +if(GIT_CHANGED_SOURCES) + set(CLANG_TIDY_CHANGED_SOURCES) + foreach(source ${CLANG_TIDY_SOURCES}) + list(FIND GIT_CHANGED_SOURCES ${source} index) + if(NOT ${index} EQUAL -1) + list(APPEND CLANG_TIDY_CHANGED_SOURCES ${source}) + endif() + endforeach() +endif() + +if(CLANG_TIDY_CHANGED_SOURCES) + set(CLANG_TIDY_DIFF_COMMAND ${CLANG_TIDY_PROGRAM} + ${CLANG_TIDY_CHANGED_SOURCES} + --fix + --fix-errors + --fix-notes + ) +else() + set(CLANG_TIDY_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for clang-tidy") +endif() + +register_command( + TARGET + clang-tidy-diff + COMMENT + "Running clang-tidy on changed files" + COMMAND + ${CLANG_TIDY_DIFF_COMMAND} + CWD + ${BUILD_PATH} + ALWAYS_RUN +) diff --git a/cmake/analysis/RunCppCheck.cmake b/cmake/analysis/RunCppCheck.cmake new file mode 100644 index 0000000000..a384a44863 --- /dev/null +++ b/cmake/analysis/RunCppCheck.cmake @@ -0,0 +1,33 @@ +# https://cppcheck.sourceforge.io/ + +find_command( + VARIABLE + CPPCHECK_EXECUTABLE + COMMAND + cppcheck + REQUIRED + OFF +) + +set(CPPCHECK_COMMAND ${CPPCHECK_EXECUTABLE} + --cppcheck-build-dir=${BUILD_PATH}/cppcheck + --project=${BUILD_PATH}/compile_commands.json + --clang=${CMAKE_CXX_COMPILER} + --std=c++${CMAKE_CXX_STANDARD} + --report-progress + --showtime=summary +) + +register_command( + TARGET + cppcheck + COMMENT + "Running cppcheck" + COMMAND + ${CMAKE_COMMAND} -E make_directory cppcheck + && ${CPPCHECK_COMMAND} + CWD + ${BUILD_PATH} + TARGETS + ${bun} +) diff --git a/cmake/analysis/RunCppLint.cmake b/cmake/analysis/RunCppLint.cmake new file mode 100644 index 0000000000..5b9264ecf5 --- /dev/null +++ b/cmake/analysis/RunCppLint.cmake @@ -0,0 +1,22 @@ +find_command( + VARIABLE + CPPLINT_PROGRAM + COMMAND + cpplint + REQUIRED + OFF +) + +register_command( + TARGET + cpplint + COMMENT + "Running cpplint" + COMMAND + ${CPPLINT_PROGRAM} + ${BUN_CPP_SOURCES} + CWD + ${BUILD_PATH} + TARGETS + ${bun} +) diff --git a/cmake/analysis/RunIWYU.cmake b/cmake/analysis/RunIWYU.cmake new file mode 100644 index 0000000000..0ea555f2f5 --- /dev/null +++ b/cmake/analysis/RunIWYU.cmake @@ -0,0 +1,67 @@ +# IWYU = "Include What You Use" +# https://include-what-you-use.org/ + +setx(IWYU_SOURCE_PATH ${CACHE_PATH}/iwyu-${LLVM_VERSION}) +setx(IWYU_BUILD_PATH ${IWYU_SOURCE_PATH}/build) +setx(IWYU_PROGRAM ${IWYU_BUILD_PATH}/bin/include-what-you-use) + +register_repository( + NAME + iwyu + REPOSITORY + include-what-you-use/include-what-you-use + BRANCH + clang_${LLVM_VERSION} + PATH + ${IWYU_SOURCE_PATH} +) + +register_command( + TARGET + build-iwyu + COMMENT + "Building iwyu" + COMMAND + ${CMAKE_COMMAND} + -B${IWYU_BUILD_PATH} + -G${CMAKE_GENERATOR} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER} + -DIWYU_LLVM_ROOT_PATH=${LLVM_PREFIX} + && ${CMAKE_COMMAND} + --build ${IWYU_BUILD_PATH} + CWD + ${IWYU_SOURCE_PATH} + TARGETS + clone-iwyu +) + +find_command( + VARIABLE + PYTHON_EXECUTABLE + COMMAND + python3 + python + VERSION + >=3.0.0 + REQUIRED + OFF +) + +register_command( + TARGET + iwyu + COMMENT + "Running iwyu" + COMMAND + ${CMAKE_COMMAND} + -E env IWYU_BINARY=${IWYU_PROGRAM} + ${PYTHON_EXECUTABLE} + ${IWYU_SOURCE_PATH}/iwyu_tool.py + -p ${BUILD_PATH} + CWD + ${BUILD_PATH} + TARGETS + build-iwyu + ${bun} +) diff --git a/cmake/analysis/RunPrettier.cmake b/cmake/analysis/RunPrettier.cmake new file mode 100644 index 0000000000..8c8ceb1ba1 --- /dev/null +++ b/cmake/analysis/RunPrettier.cmake @@ -0,0 +1,123 @@ +if(CMAKE_HOST_WIN32) + setx(PRETTIER_EXECUTABLE ${CWD}/node_modules/.bin/prettier.exe) +else() + setx(PRETTIER_EXECUTABLE ${CWD}/node_modules/.bin/prettier) +endif() + +set(PRETTIER_PATHS + ${CWD}/src + ${CWD}/packages/bun-error + ${CWD}/packages/bun-types + ${CWD}/packages/bun-inspector-protocol + ${CWD}/packages/bun-inspector-frontend + ${CWD}/packages/bun-debug-adapter-protocol + ${CWD}/packages/bun-vscode + ${CWD}/test + ${CWD}/bench + ${CWD}/.vscode + ${CWD}/.buildkite + ${CWD}/.github +) + +set(PRETTIER_EXTENSIONS + *.jsonc? + *.ya?ml + *.jsx? + *.tsx? + *.mjs + *.cjs + *.mts + *.cts +) + +set(PRETTIER_GLOBS) +foreach(path ${PRETTIER_PATHS}) + foreach(extension ${PRETTIER_EXTENSIONS}) + list(APPEND PRETTIER_GLOBS ${path}/${extension}) + endforeach() +endforeach() + +file(GLOB_RECURSE PRETTIER_SOURCES ${PRETTIER_GLOBS}) + +register_command( + COMMAND + ${BUN_EXECUTABLE} + install + --frozen-lockfile + SOURCES + ${CWD}/package.json + OUTPUTS + ${PRETTIER_EXECUTABLE} +) + +set(PRETTIER_COMMAND ${PRETTIER_EXECUTABLE} + --config=${CWD}/.prettierrc + --cache +) + +register_command( + TARGET + prettier + COMMENT + "Running prettier" + COMMAND + ${PRETTIER_COMMAND} + --write + ${PRETTIER_SOURCES} + ALWAYS_RUN +) + +register_command( + TARGET + prettier-extra + COMMENT + "Running prettier with extra plugins" + COMMAND + ${PRETTIER_COMMAND} + --write + --plugin=prettier-plugin-organize-imports + ${PRETTIER_SOURCES} + ALWAYS_RUN +) + +register_command( + TARGET + prettier-check + COMMENT + "Checking prettier" + COMMAND + ${PRETTIER_COMMAND} + --check + ${PRETTIER_SOURCES} + ALWAYS_RUN +) + +if(GIT_CHANGED_SOURCES) + set(PRETTIER_CHANGED_SOURCES) + foreach(source ${PRETTIER_SOURCES}) + list(FIND GIT_CHANGED_SOURCES ${source} index) + if(NOT ${index} EQUAL -1) + list(APPEND PRETTIER_CHANGED_SOURCES ${source}) + endif() + endforeach() +endif() + +if(PRETTIER_CHANGED_SOURCES) + set(PRETTIER_DIFF_COMMAND ${PRETTIER_COMMAND} + --write + --plugin=prettier-plugin-organize-imports + ${PRETTIER_CHANGED_SOURCES} + ) +else() + set(PRETTIER_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for prettier") +endif() + +register_command( + TARGET + prettier-diff + COMMENT + "Running prettier on changed files" + COMMAND + ${PRETTIER_DIFF_COMMAND} + ALWAYS_RUN +) diff --git a/cmake/analysis/RunZigFormat.cmake b/cmake/analysis/RunZigFormat.cmake new file mode 100644 index 0000000000..0ff7c23865 --- /dev/null +++ b/cmake/analysis/RunZigFormat.cmake @@ -0,0 +1,57 @@ +set(ZIG_FORMAT_SOURCES ${BUN_ZIG_SOURCES}) + +register_command( + TARGET + zig-format-check + COMMENT + "Checking zig fmt" + COMMAND + ${ZIG_EXECUTABLE} + fmt + --check + ${ZIG_FORMAT_SOURCES} + ALWAYS_RUN +) + +register_command( + TARGET + zig-format + COMMENT + "Running zig fmt" + COMMAND + ${ZIG_EXECUTABLE} + fmt + ${ZIG_FORMAT_SOURCES} + ALWAYS_RUN +) + +if(GIT_CHANGED_SOURCES) + set(ZIG_FORMAT_CHANGED_SOURCES) + foreach(source ${ZIG_FORMAT_SOURCES}) + list(FIND GIT_CHANGED_SOURCES ${source} index) + if(NOT ${index} EQUAL -1) + list(APPEND ZIG_FORMAT_CHANGED_SOURCES ${source}) + endif() + endforeach() +endif() + +if(ZIG_FORMAT_CHANGED_SOURCES) + set(ZIG_FORMAT_DIFF_COMMAND ${ZIG_EXECUTABLE} + fmt + ${ZIG_FORMAT_CHANGED_SOURCES} + ) +else() + set(ZIG_FORMAT_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for zig-format") +endif() + +register_command( + TARGET + zig-format-diff + COMMENT + "Running zig fmt on changed files" + COMMAND + ${ZIG_FORMAT_DIFF_COMMAND} + CWD + ${BUILD_PATH} + ALWAYS_RUN +) diff --git a/cmake/scripts/DownloadUrl.cmake b/cmake/scripts/DownloadUrl.cmake new file mode 100644 index 0000000000..c8801de005 --- /dev/null +++ b/cmake/scripts/DownloadUrl.cmake @@ -0,0 +1,129 @@ +get_filename_component(SCRIPT_NAME ${CMAKE_CURRENT_LIST_FILE} NAME) +message(STATUS "Running script: ${SCRIPT_NAME}") + +if(NOT DOWNLOAD_URL OR NOT DOWNLOAD_PATH) + message(FATAL_ERROR "DOWNLOAD_URL and DOWNLOAD_PATH are required") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + set(TMP_PATH $ENV{TEMP}) +else() + set(TMP_PATH $ENV{TMPDIR}) +endif() + +if(NOT TMP_PATH) + set(TMP_PATH ${CMAKE_BINARY_DIR}/tmp) +endif() + +string(REGEX REPLACE "/+$" "" TMP_PATH ${TMP_PATH}) +string(REGEX REPLACE "[^a-zA-Z0-9]" "-" DOWNLOAD_ID ${DOWNLOAD_URL}) +string(RANDOM LENGTH 8 RANDOM_ID) + +set(DOWNLOAD_TMP_PATH ${TMP_PATH}/${DOWNLOAD_ID}-${RANDOM_ID}) +set(DOWNLOAD_TMP_FILE ${DOWNLOAD_TMP_PATH}/tmp) + +file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH}) + +if(DOWNLOAD_ACCEPT_HEADER) + set(DOWNLOAD_ACCEPT_HEADER "Accept: ${DOWNLOAD_ACCEPT_HEADER}") +else() + set(DOWNLOAD_ACCEPT_HEADER "Accept: */*") +endif() + +foreach(i RANGE 10) + set(DOWNLOAD_TMP_FILE_${i} ${DOWNLOAD_TMP_FILE}.${i}) + + if(i EQUAL 0) + message(STATUS "Downloading ${DOWNLOAD_URL}...") + else() + message(STATUS "Downloading ${DOWNLOAD_URL}... (retry ${i})") + endif() + + file(DOWNLOAD + ${DOWNLOAD_URL} + ${DOWNLOAD_TMP_FILE_${i}} + HTTPHEADER "User-Agent: cmake/${CMAKE_VERSION}" + HTTPHEADER ${DOWNLOAD_ACCEPT_HEADER} + STATUS DOWNLOAD_STATUS + INACTIVITY_TIMEOUT 60 + TIMEOUT 180 + SHOW_PROGRESS + ) + + list(GET DOWNLOAD_STATUS 0 DOWNLOAD_STATUS_CODE) + if(DOWNLOAD_STATUS_CODE EQUAL 0) + if(NOT EXISTS ${DOWNLOAD_TMP_FILE_${i}}) + message(WARNING "Download failed: result is ok, but file does not exist: ${DOWNLOAD_TMP_FILE_${i}}") + continue() + endif() + + file(RENAME ${DOWNLOAD_TMP_FILE_${i}} ${DOWNLOAD_TMP_FILE}) + break() + endif() + + list(GET DOWNLOAD_STATUS 1 DOWNLOAD_STATUS_TEXT) + file(REMOVE ${DOWNLOAD_TMP_FILE_${i}}) + message(WARNING "Download failed: ${DOWNLOAD_STATUS_CODE} ${DOWNLOAD_STATUS_TEXT}") +endforeach() + +if(NOT EXISTS ${DOWNLOAD_TMP_FILE}) + file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH}) + message(FATAL_ERROR "Download failed after too many attempts: ${DOWNLOAD_URL}") +endif() + +get_filename_component(DOWNLOAD_FILENAME ${DOWNLOAD_URL} NAME) +if(DOWNLOAD_FILENAME MATCHES "\\.(zip|tar|gz|xz)$") + message(STATUS "Extracting ${DOWNLOAD_FILENAME}...") + + set(DOWNLOAD_TMP_EXTRACT ${DOWNLOAD_TMP_PATH}/extract) + file(ARCHIVE_EXTRACT + INPUT ${DOWNLOAD_TMP_FILE} + DESTINATION ${DOWNLOAD_TMP_EXTRACT} + TOUCH + ) + + file(REMOVE ${DOWNLOAD_TMP_FILE}) + + if(DOWNLOAD_FILTERS) + list(TRANSFORM DOWNLOAD_FILTERS PREPEND ${DOWNLOAD_TMP_EXTRACT}/ OUTPUT_VARIABLE DOWNLOAD_GLOBS) + else() + set(DOWNLOAD_GLOBS ${DOWNLOAD_TMP_EXTRACT}/*) + endif() + + file(GLOB DOWNLOAD_TMP_EXTRACT_PATHS LIST_DIRECTORIES ON ${DOWNLOAD_GLOBS}) + list(LENGTH DOWNLOAD_TMP_EXTRACT_PATHS DOWNLOAD_COUNT) + + if(DOWNLOAD_COUNT EQUAL 0) + file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH}) + + if(DOWNLOAD_FILTERS) + message(FATAL_ERROR "Extract failed: No files found matching ${DOWNLOAD_FILTERS}") + else() + message(FATAL_ERROR "Extract failed: No files found") + endif() + endif() + + if(DOWNLOAD_FILTERS) + set(DOWNLOAD_TMP_FILE ${DOWNLOAD_TMP_EXTRACT_PATHS}) + elseif(DOWNLOAD_COUNT EQUAL 1) + list(GET DOWNLOAD_TMP_EXTRACT_PATHS 0 DOWNLOAD_TMP_FILE) + get_filename_component(DOWNLOAD_FILENAME ${DOWNLOAD_TMP_FILE} NAME) + message(STATUS "Hoisting ${DOWNLOAD_FILENAME}...") + else() + set(DOWNLOAD_TMP_FILE ${DOWNLOAD_TMP_EXTRACT}) + endif() +endif() + +if(DOWNLOAD_FILTERS) + foreach(file ${DOWNLOAD_TMP_FILE}) + file(RENAME ${file} ${DOWNLOAD_PATH}) + endforeach() +else() + file(REMOVE_RECURSE ${DOWNLOAD_PATH}) + get_filename_component(DOWNLOAD_PARENT_PATH ${DOWNLOAD_PATH} DIRECTORY) + file(MAKE_DIRECTORY ${DOWNLOAD_PARENT_PATH}) + file(RENAME ${DOWNLOAD_TMP_FILE} ${DOWNLOAD_PATH}) +endif() + +file(REMOVE_RECURSE ${DOWNLOAD_TMP_PATH}) +message(STATUS "Saved ${DOWNLOAD_PATH}") diff --git a/cmake/scripts/DownloadZig.cmake b/cmake/scripts/DownloadZig.cmake new file mode 100644 index 0000000000..d5bced5b71 --- /dev/null +++ b/cmake/scripts/DownloadZig.cmake @@ -0,0 +1,68 @@ +get_filename_component(SCRIPT_NAME ${CMAKE_CURRENT_LIST_FILE} NAME) +message(STATUS "Running script: ${SCRIPT_NAME}") + +if(NOT ZIG_PATH OR NOT ZIG_COMMIT) + message(FATAL_ERROR "ZIG_PATH and ZIG_COMMIT required") +endif() + +if(CMAKE_HOST_APPLE) + set(ZIG_OS_ABI "macos-none") +elseif(CMAKE_HOST_WIN32) + set(ZIG_OS_ABI "windows-gnu") +elseif(CMAKE_HOST_UNIX) + set(ZIG_OS_ABI "linux-musl") +else() + message(FATAL_ERROR "Unsupported operating system: ${CMAKE_HOST_SYSTEM_NAME}") +endif() + +# In script mode, using -P, this variable is not set +if(NOT DEFINED CMAKE_HOST_SYSTEM_PROCESSOR) + cmake_host_system_information(RESULT CMAKE_HOST_SYSTEM_PROCESSOR QUERY OS_PLATFORM) +endif() + +if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64|ARM64|aarch64|AARCH64") + set(ZIG_ARCH "aarch64") +elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|AMD64|x86_64|X86_64|x64|X64") + set(ZIG_ARCH "x86_64") +else() + message(FATAL_ERROR "Unsupported architecture: ${CMAKE_HOST_SYSTEM_PROCESSOR}") +endif() + +set(ZIG_NAME bootstrap-${ZIG_ARCH}-${ZIG_OS_ABI}) +set(ZIG_FILENAME ${ZIG_NAME}.zip) + +if(CMAKE_HOST_WIN32) + set(ZIG_EXE "zig.exe") +else() + set(ZIG_EXE "zig") +endif() + +set(ZIG_DOWNLOAD_URL https://github.com/oven-sh/zig/releases/download/autobuild-${ZIG_COMMIT}/${ZIG_FILENAME}) + +execute_process( + COMMAND + ${CMAKE_COMMAND} + -DDOWNLOAD_URL=${ZIG_DOWNLOAD_URL} + -DDOWNLOAD_PATH=${ZIG_PATH} + -P ${CMAKE_CURRENT_LIST_DIR}/DownloadUrl.cmake + ERROR_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE + ZIG_DOWNLOAD_ERROR + RESULT_VARIABLE + ZIG_DOWNLOAD_RESULT +) + +if(NOT ZIG_DOWNLOAD_RESULT EQUAL 0) + message(FATAL_ERROR "Download failed: ${ZIG_DOWNLOAD_ERROR}") +endif() + +if(NOT EXISTS ${ZIG_PATH}/${ZIG_EXE}) + message(FATAL_ERROR "Executable not found: \"${ZIG_PATH}/${ZIG_EXE}\"") +endif() + +# Tools like VSCode need a stable path to the zig executable, on both Unix and Windows +# To workaround this, we create a `zig.exe` & `zls.exe` symlink on Unix. +if(NOT WIN32) + file(CREATE_LINK ${ZIG_PATH}/${ZIG_EXE} ${ZIG_PATH}/zig.exe SYMBOLIC) + file(CREATE_LINK ${ZIG_PATH}/zls ${ZIG_PATH}/zls.exe SYMBOLIC) +endif() diff --git a/cmake/scripts/GitClone.cmake b/cmake/scripts/GitClone.cmake new file mode 100644 index 0000000000..d02f0228b3 --- /dev/null +++ b/cmake/scripts/GitClone.cmake @@ -0,0 +1,85 @@ +get_filename_component(SCRIPT_NAME ${CMAKE_CURRENT_LIST_FILE} NAME) +message(STATUS "Running script: ${SCRIPT_NAME}") + +if(NOT GIT_PATH OR NOT GIT_REPOSITORY) + message(FATAL_ERROR "GIT_PATH and GIT_REPOSITORY are required") +endif() + +if(GIT_COMMIT) + set(GIT_REF ${GIT_COMMIT}) +elseif(GIT_TAG) + set(GIT_REF refs/tags/${GIT_TAG}) +elseif(GIT_BRANCH) + set(GIT_REF refs/heads/${GIT_BRANCH}) +else() + message(FATAL_ERROR "GIT_COMMIT, GIT_TAG, or GIT_BRANCH are required") +endif() + +string(REGEX MATCH "([^/]+)$" GIT_ORIGINAL_NAME ${GIT_REPOSITORY}) +if(NOT GIT_NAME) + set(GIT_NAME ${GIT_ORIGINAL_NAME}) +endif() + +set(GIT_DOWNLOAD_URL https://github.com/${GIT_REPOSITORY}/archive/${GIT_REF}.tar.gz) + +message(STATUS "Cloning ${GIT_REPOSITORY} at ${GIT_REF}...") +execute_process( + COMMAND + ${CMAKE_COMMAND} + -DDOWNLOAD_URL=${GIT_DOWNLOAD_URL} + -DDOWNLOAD_PATH=${GIT_PATH} + -DDOWNLOAD_FILTERS=${GIT_FILTERS} + -P ${CMAKE_CURRENT_LIST_DIR}/DownloadUrl.cmake + ERROR_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE + GIT_ERROR + RESULT_VARIABLE + GIT_RESULT +) + +if(NOT GIT_RESULT EQUAL 0) + message(FATAL_ERROR "Clone failed: ${GIT_ERROR}") +endif() + +file(GLOB_RECURSE GIT_PATCH_PATHS ${CMAKE_SOURCE_DIR}/patches/${GIT_NAME}/*) +list(LENGTH GIT_PATCH_PATHS GIT_PATCH_COUNT) + +if(GIT_PATCH_COUNT GREATER 0) + find_program(GIT_PROGRAM git REQUIRED) + + foreach(GIT_PATCH ${GIT_PATCH_PATHS}) + get_filename_component(GIT_PATCH_NAME ${GIT_PATCH} NAME) + + if(GIT_PATCH_NAME MATCHES "\\.patch$") + message(STATUS "Applying patch ${GIT_PATCH_NAME}...") + execute_process( + COMMAND + ${GIT_PROGRAM} + apply + --ignore-whitespace + --ignore-space-change + --no-index + --verbose + ${GIT_PATCH} + WORKING_DIRECTORY + ${GIT_PATH} + ERROR_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE + GIT_PATCH_ERROR + RESULT_VARIABLE + GIT_PATCH_RESULT + ) + + if(NOT GIT_PATCH_RESULT EQUAL 0 AND NOT GIT_PATCH_ERROR MATCHES "cleanly") + file(REMOVE_RECURSE ${GIT_PATH}) + message(FATAL_ERROR "Failed to apply patch: ${GIT_PATCH_ERROR}") + endif() + else() + message(STATUS "Copying file ${GIT_PATCH_NAME}...") + file(COPY ${GIT_PATCH} DESTINATION ${GIT_PATH}) + endif() + endforeach() +endif() + +file(WRITE ${GIT_PATH}/.ref ${GIT_REF}) +message(STATUS "Cloned ${GIT_REPOSITORY}") diff --git a/cmake/targets/BuildBoringSSL.cmake b/cmake/targets/BuildBoringSSL.cmake new file mode 100644 index 0000000000..8b709b3de2 --- /dev/null +++ b/cmake/targets/BuildBoringSSL.cmake @@ -0,0 +1,21 @@ +register_repository( + NAME + boringssl + REPOSITORY + oven-sh/boringssl + COMMIT + 914b005ef3ece44159dca0ffad74eb42a9f6679f +) + +register_cmake_command( + TARGET + boringssl + LIBRARIES + crypto + ssl + decrepit + ARGS + -DBUILD_SHARED_LIBS=OFF + INCLUDES + include +) diff --git a/cmake/targets/BuildBrotli.cmake b/cmake/targets/BuildBrotli.cmake new file mode 100644 index 0000000000..f9bc8d9601 --- /dev/null +++ b/cmake/targets/BuildBrotli.cmake @@ -0,0 +1,31 @@ +register_repository( + NAME + brotli + REPOSITORY + google/brotli + TAG + v1.1.0 +) + +# Tests fail with "BrotliDecompressionError" when LTO is enabled +# only on Linux x64 (non-baseline). It's a mystery. +if(LINUX AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|X86_64|x64|X64|amd64|AMD64" AND NOT ENABLE_BASELINE) + set(BROTLI_CMAKE_ARGS "-DCMAKE_C_FLAGS=-fno-lto") +endif() + +register_cmake_command( + TARGET + brotli + LIBRARIES + brotlicommon + brotlidec + brotlienc + ARGS + -DBUILD_SHARED_LIBS=OFF + -DBROTLI_BUILD_TOOLS=OFF + -DBROTLI_EMSCRIPTEN=OFF + -DBROTLI_DISABLE_TESTS=ON + ${BROTLI_CMAKE_ARGS} + INCLUDES + c/include +) diff --git a/cmake/targets/BuildBun.cmake b/cmake/targets/BuildBun.cmake new file mode 100644 index 0000000000..f9b60e2dff --- /dev/null +++ b/cmake/targets/BuildBun.cmake @@ -0,0 +1,1300 @@ +if(DEBUG) + set(bun bun-debug) +# elseif(ENABLE_SMOL) +# set(bun bun-smol-profile) +# set(bunStrip bun-smol) +elseif(ENABLE_VALGRIND) + set(bun bun-valgrind) +elseif(ENABLE_ASSERTIONS) + set(bun bun-assertions) +else() + set(bun bun-profile) + set(bunStrip bun) +endif() + +set(bunExe ${bun}${CMAKE_EXECUTABLE_SUFFIX}) + +if(bunStrip) + set(bunStripExe ${bunStrip}${CMAKE_EXECUTABLE_SUFFIX}) + set(buns ${bun} ${bunStrip}) +else() + set(buns ${bun}) +endif() + +optionx(CODEGEN_PATH FILEPATH "Path to the codegen directory" DEFAULT ${BUILD_PATH}/codegen) + +if(RELEASE OR CI) + set(DEFAULT_CODEGEN_EMBED ON) +else() + set(DEFAULT_CODEGEN_EMBED OFF) +endif() + +optionx(CODEGEN_EMBED BOOL "If codegen files should be embedded in the binary" DEFAULT ${DEFAULT_CODEGEN_EMBED}) + +if((NOT DEFINED CONFIGURE_DEPENDS AND NOT CI) OR CONFIGURE_DEPENDS) + set(CONFIGURE_DEPENDS "CONFIGURE_DEPENDS") +else() + set(CONFIGURE_DEPENDS "") +endif() + +# --- Codegen --- + +set(BUN_ERROR_SOURCE ${CWD}/packages/bun-error) + +file(GLOB BUN_ERROR_SOURCES ${CONFIGURE_DEPENDS} + ${BUN_ERROR_SOURCE}/*.json + ${BUN_ERROR_SOURCE}/*.ts + ${BUN_ERROR_SOURCE}/*.tsx + ${BUN_ERROR_SOURCE}/*.css + ${BUN_ERROR_SOURCE}/img/* +) + +set(BUN_ERROR_OUTPUT ${CODEGEN_PATH}/bun-error) +set(BUN_ERROR_OUTPUTS + ${BUN_ERROR_OUTPUT}/index.js + ${BUN_ERROR_OUTPUT}/bun-error.css +) + +register_bun_install( + CWD + ${BUN_ERROR_SOURCE} + NODE_MODULES_VARIABLE + BUN_ERROR_NODE_MODULES +) + +register_command( + TARGET + bun-error + COMMENT + "Building bun-error" + CWD + ${BUN_ERROR_SOURCE} + COMMAND + ${ESBUILD_EXECUTABLE} ${ESBUILD_ARGS} + index.tsx + bun-error.css + --outdir=${BUN_ERROR_OUTPUT} + --define:process.env.NODE_ENV=\"'production'\" + --minify + --bundle + --platform=browser + --format=esm + SOURCES + ${BUN_ERROR_SOURCES} + ${BUN_ERROR_NODE_MODULES} + OUTPUTS + ${BUN_ERROR_OUTPUTS} +) + +set(BUN_FALLBACK_DECODER_SOURCE ${CWD}/src/fallback.ts) +set(BUN_FALLBACK_DECODER_OUTPUT ${CODEGEN_PATH}/fallback-decoder.js) + +register_command( + TARGET + bun-fallback-decoder + COMMENT + "Building fallback-decoder.js" + COMMAND + ${ESBUILD_EXECUTABLE} ${ESBUILD_ARGS} + ${BUN_FALLBACK_DECODER_SOURCE} + --outfile=${BUN_FALLBACK_DECODER_OUTPUT} + --target=esnext + --bundle + --format=iife + --platform=browser + --minify + SOURCES + ${BUN_FALLBACK_DECODER_SOURCE} + OUTPUTS + ${BUN_FALLBACK_DECODER_OUTPUT} +) + +set(BUN_RUNTIME_JS_SOURCE ${CWD}/src/runtime.bun.js) +set(BUN_RUNTIME_JS_OUTPUT ${CODEGEN_PATH}/runtime.out.js) + +register_command( + TARGET + bun-runtime-js + COMMENT + "Building src/runtime.out.js" + COMMAND + ${ESBUILD_EXECUTABLE} ${ESBUILD_ARGS} + ${BUN_RUNTIME_JS_SOURCE} + --outfile=${BUN_RUNTIME_JS_OUTPUT} + --define:process.env.NODE_ENV=\"'production'\" + --target=esnext + --bundle + --format=esm + --platform=node + --minify + --external:/bun:* + SOURCES + ${BUN_RUNTIME_JS_SOURCE} + OUTPUTS + ${BUN_RUNTIME_JS_OUTPUT} +) + +set(BUN_NODE_FALLBACKS_SOURCE ${CWD}/src/node-fallbacks) + +file(GLOB BUN_NODE_FALLBACKS_SOURCES ${CONFIGURE_DEPENDS} + ${BUN_NODE_FALLBACKS_SOURCE}/*.js +) + +set(BUN_NODE_FALLBACKS_OUTPUT ${CODEGEN_PATH}/node-fallbacks) +set(BUN_NODE_FALLBACKS_OUTPUTS) +foreach(source ${BUN_NODE_FALLBACKS_SOURCES}) + get_filename_component(filename ${source} NAME) + list(APPEND BUN_NODE_FALLBACKS_OUTPUTS ${BUN_NODE_FALLBACKS_OUTPUT}/${filename}) +endforeach() + +register_bun_install( + CWD + ${BUN_NODE_FALLBACKS_SOURCE} + NODE_MODULES_VARIABLE + BUN_NODE_FALLBACKS_NODE_MODULES +) + +# This command relies on an older version of `esbuild`, which is why +# it uses ${BUN_EXECUTABLE} x instead of ${ESBUILD_EXECUTABLE}. +register_command( + TARGET + bun-node-fallbacks + COMMENT + "Building node-fallbacks/*.js" + CWD + ${BUN_NODE_FALLBACKS_SOURCE} + COMMAND + ${BUN_EXECUTABLE} x + esbuild ${ESBUILD_ARGS} + ${BUN_NODE_FALLBACKS_SOURCES} + --outdir=${BUN_NODE_FALLBACKS_OUTPUT} + --format=esm + --minify + --bundle + --platform=browser + SOURCES + ${BUN_NODE_FALLBACKS_SOURCES} + ${BUN_NODE_FALLBACKS_NODE_MODULES} + OUTPUTS + ${BUN_NODE_FALLBACKS_OUTPUTS} +) + +# An embedded copy of react-refresh is used when the user forgets to install it. +# The library is not versioned alongside React. +set(BUN_REACT_REFRESH_OUTPUT ${BUN_NODE_FALLBACKS_OUTPUT}/react-refresh.js) +register_command( + TARGET + bun-node-fallbacks-react-refresh + COMMENT + "Building node-fallbacks/react-refresh.js" + CWD + ${BUN_NODE_FALLBACKS_SOURCE} + COMMAND + ${BUN_EXECUTABLE} build + ${BUN_NODE_FALLBACKS_SOURCE}/node_modules/react-refresh/cjs/react-refresh-runtime.development.js + --outfile=${BUN_REACT_REFRESH_OUTPUT} + --target=browser + --format=cjs + --minify + --define:process.env.NODE_ENV=\"'development'\" + SOURCES + ${BUN_NODE_FALLBACKS_SOURCE}/package.json + ${BUN_NODE_FALLBACKS_SOURCE}/bun.lock + ${BUN_NODE_FALLBACKS_NODE_MODULES} + OUTPUTS + ${BUN_REACT_REFRESH_OUTPUT} +) + +set(BUN_ERROR_CODE_SCRIPT ${CWD}/src/codegen/generate-node-errors.ts) + +set(BUN_ERROR_CODE_SOURCES + ${BUN_ERROR_CODE_SCRIPT} + ${CWD}/src/bun.js/bindings/ErrorCode.ts + ${CWD}/src/bun.js/bindings/ErrorCode.cpp + ${CWD}/src/bun.js/bindings/ErrorCode.h +) + +set(BUN_ERROR_CODE_OUTPUTS + ${CODEGEN_PATH}/ErrorCode+List.h + ${CODEGEN_PATH}/ErrorCode+Data.h + ${CODEGEN_PATH}/ErrorCode.zig +) + +register_command( + TARGET + bun-error-code + COMMENT + "Generating ErrorCode.{zig,h}" + COMMAND + ${BUN_EXECUTABLE} + run + ${BUN_ERROR_CODE_SCRIPT} + ${CODEGEN_PATH} + SOURCES + ${BUN_ERROR_CODE_SOURCES} + OUTPUTS + ${BUN_ERROR_CODE_OUTPUTS} +) + +set(BUN_ZIG_GENERATED_CLASSES_SCRIPT ${CWD}/src/codegen/generate-classes.ts) + +file(GLOB BUN_ZIG_GENERATED_CLASSES_SOURCES ${CONFIGURE_DEPENDS} + ${CWD}/src/bun.js/*.classes.ts + ${CWD}/src/bun.js/api/*.classes.ts + ${CWD}/src/bun.js/node/*.classes.ts + ${CWD}/src/bun.js/test/*.classes.ts + ${CWD}/src/bun.js/webcore/*.classes.ts +) + +set(BUN_ZIG_GENERATED_CLASSES_OUTPUTS + ${CODEGEN_PATH}/ZigGeneratedClasses.h + ${CODEGEN_PATH}/ZigGeneratedClasses.cpp + ${CODEGEN_PATH}/ZigGeneratedClasses+lazyStructureHeader.h + ${CODEGEN_PATH}/ZigGeneratedClasses+DOMClientIsoSubspaces.h + ${CODEGEN_PATH}/ZigGeneratedClasses+DOMIsoSubspaces.h + ${CODEGEN_PATH}/ZigGeneratedClasses+lazyStructureImpl.h + ${CODEGEN_PATH}/ZigGeneratedClasses.zig + ${CODEGEN_PATH}/ZigGeneratedClasses.lut.txt +) + +register_command( + TARGET + bun-zig-generated-classes + COMMENT + "Generating ZigGeneratedClasses.{zig,cpp,h}" + COMMAND + ${BUN_EXECUTABLE} + run + ${BUN_ZIG_GENERATED_CLASSES_SCRIPT} + ${BUN_ZIG_GENERATED_CLASSES_SOURCES} + ${CODEGEN_PATH} + SOURCES + ${BUN_ZIG_GENERATED_CLASSES_SCRIPT} + ${BUN_ZIG_GENERATED_CLASSES_SOURCES} + OUTPUTS + ${BUN_ZIG_GENERATED_CLASSES_OUTPUTS} +) + +set(BUN_JAVASCRIPT_CODEGEN_SCRIPT ${CWD}/src/codegen/bundle-modules.ts) + +file(GLOB_RECURSE BUN_JAVASCRIPT_SOURCES ${CONFIGURE_DEPENDS} + ${CWD}/src/js/*.js + ${CWD}/src/js/*.ts +) + +file(GLOB BUN_JAVASCRIPT_CODEGEN_SOURCES ${CONFIGURE_DEPENDS} + ${CWD}/src/codegen/*.ts +) + +list(APPEND BUN_JAVASCRIPT_CODEGEN_SOURCES + ${CWD}/src/bun.js/bindings/InternalModuleRegistry.cpp +) + +set(BUN_JAVASCRIPT_OUTPUTS + ${CODEGEN_PATH}/WebCoreJSBuiltins.cpp + ${CODEGEN_PATH}/WebCoreJSBuiltins.h + ${CODEGEN_PATH}/InternalModuleRegistryConstants.h + ${CODEGEN_PATH}/InternalModuleRegistry+createInternalModuleById.h + ${CODEGEN_PATH}/InternalModuleRegistry+enum.h + ${CODEGEN_PATH}/InternalModuleRegistry+numberOfModules.h + ${CODEGEN_PATH}/NativeModuleImpl.h + ${CODEGEN_PATH}/ResolvedSourceTag.zig + ${CODEGEN_PATH}/SyntheticModuleType.h + ${CODEGEN_PATH}/GeneratedJS2Native.h + # Zig will complain if files are outside of the source directory + ${CWD}/src/bun.js/bindings/GeneratedJS2Native.zig +) + +register_command( + TARGET + bun-js-modules + COMMENT + "Generating JavaScript modules" + COMMAND + ${BUN_EXECUTABLE} + run + ${BUN_JAVASCRIPT_CODEGEN_SCRIPT} + --debug=${DEBUG} + ${BUILD_PATH} + SOURCES + ${BUN_JAVASCRIPT_SOURCES} + ${BUN_JAVASCRIPT_CODEGEN_SOURCES} + ${BUN_JAVASCRIPT_CODEGEN_SCRIPT} + OUTPUTS + ${BUN_JAVASCRIPT_OUTPUTS} +) + +set(BUN_BAKE_RUNTIME_CODEGEN_SCRIPT ${CWD}/src/codegen/bake-codegen.ts) + +file(GLOB_RECURSE BUN_BAKE_RUNTIME_SOURCES ${CONFIGURE_DEPENDS} + ${CWD}/src/bake/*.ts + ${CWD}/src/bake/*/*.ts + ${CWD}/src/bake/*/*.css +) + +list(APPEND BUN_BAKE_RUNTIME_CODEGEN_SOURCES + ${CWD}/src/bun.js/bindings/InternalModuleRegistry.cpp +) + +set(BUN_BAKE_RUNTIME_OUTPUTS + ${CODEGEN_PATH}/bake.client.js + ${CODEGEN_PATH}/bake.server.js +) + +register_command( + TARGET + bun-bake-codegen + COMMENT + "Bundling Bake Runtime" + COMMAND + ${BUN_EXECUTABLE} + run + ${BUN_BAKE_RUNTIME_CODEGEN_SCRIPT} + --debug=${DEBUG} + --codegen-root=${CODEGEN_PATH} + SOURCES + ${BUN_BAKE_RUNTIME_SOURCES} + ${BUN_BAKE_RUNTIME_CODEGEN_SOURCES} + ${BUN_BAKE_RUNTIME_CODEGEN_SCRIPT} + OUTPUTS + ${CODEGEN_PATH}/bake_empty_file + ${BUN_BAKE_RUNTIME_OUTPUTS} +) + +set(BUN_BINDGEN_SCRIPT ${CWD}/src/codegen/bindgen.ts) + +file(GLOB_RECURSE BUN_BINDGEN_SOURCES ${CONFIGURE_DEPENDS} + ${CWD}/src/**/*.bind.ts +) + +set(BUN_BINDGEN_CPP_OUTPUTS + ${CODEGEN_PATH}/GeneratedBindings.cpp +) + +set(BUN_BINDGEN_ZIG_OUTPUTS + ${CWD}/src/bun.js/bindings/GeneratedBindings.zig +) + +register_command( + TARGET + bun-binding-generator + COMMENT + "Processing \".bind.ts\" files" + COMMAND + ${BUN_EXECUTABLE} + run + ${BUN_BINDGEN_SCRIPT} + --debug=${DEBUG} + --codegen-root=${CODEGEN_PATH} + SOURCES + ${BUN_BINDGEN_SOURCES} + ${BUN_BINDGEN_SCRIPT} + OUTPUTS + ${BUN_BINDGEN_CPP_OUTPUTS} + ${BUN_BINDGEN_ZIG_OUTPUTS} +) + +set(BUN_JS_SINK_SCRIPT ${CWD}/src/codegen/generate-jssink.ts) + +set(BUN_JS_SINK_SOURCES + ${BUN_JS_SINK_SCRIPT} + ${CWD}/src/codegen/create-hash-table.ts +) + +set(BUN_JS_SINK_OUTPUTS + ${CODEGEN_PATH}/JSSink.cpp + ${CODEGEN_PATH}/JSSink.h + ${CODEGEN_PATH}/JSSink.lut.h +) + +register_command( + TARGET + bun-js-sink + COMMENT + "Generating JSSink.{cpp,h}" + COMMAND + ${BUN_EXECUTABLE} + run + ${BUN_JS_SINK_SCRIPT} + ${CODEGEN_PATH} + SOURCES + ${BUN_JS_SINK_SOURCES} + OUTPUTS + ${BUN_JS_SINK_OUTPUTS} +) + +set(BUN_OBJECT_LUT_SCRIPT ${CWD}/src/codegen/create-hash-table.ts) + +set(BUN_OBJECT_LUT_SOURCES + ${CWD}/src/bun.js/bindings/BunObject.cpp + ${CWD}/src/bun.js/bindings/ZigGlobalObject.lut.txt + ${CWD}/src/bun.js/bindings/JSBuffer.cpp + ${CWD}/src/bun.js/bindings/BunProcess.cpp + ${CWD}/src/bun.js/bindings/ProcessBindingBuffer.cpp + ${CWD}/src/bun.js/bindings/ProcessBindingConstants.cpp + ${CWD}/src/bun.js/bindings/ProcessBindingFs.cpp + ${CWD}/src/bun.js/bindings/ProcessBindingNatives.cpp + ${CWD}/src/bun.js/modules/NodeModuleModule.cpp + ${CODEGEN_PATH}/ZigGeneratedClasses.lut.txt +) + +set(BUN_OBJECT_LUT_OUTPUTS + ${CODEGEN_PATH}/BunObject.lut.h + ${CODEGEN_PATH}/ZigGlobalObject.lut.h + ${CODEGEN_PATH}/JSBuffer.lut.h + ${CODEGEN_PATH}/BunProcess.lut.h + ${CODEGEN_PATH}/ProcessBindingBuffer.lut.h + ${CODEGEN_PATH}/ProcessBindingConstants.lut.h + ${CODEGEN_PATH}/ProcessBindingFs.lut.h + ${CODEGEN_PATH}/ProcessBindingNatives.lut.h + ${CODEGEN_PATH}/NodeModuleModule.lut.h + ${CODEGEN_PATH}/ZigGeneratedClasses.lut.h +) + +macro(WEBKIT_ADD_SOURCE_DEPENDENCIES _source _deps) + set(_tmp) + get_source_file_property(_tmp ${_source} OBJECT_DEPENDS) + + if(NOT _tmp) + set(_tmp "") + endif() + + foreach(f ${_deps}) + list(APPEND _tmp "${f}") + endforeach() + + set_source_files_properties(${_source} PROPERTIES OBJECT_DEPENDS "${_tmp}") + unset(_tmp) +endmacro() + +list(LENGTH BUN_OBJECT_LUT_SOURCES BUN_OBJECT_LUT_SOURCES_COUNT) +math(EXPR BUN_OBJECT_LUT_SOURCES_MAX_INDEX "${BUN_OBJECT_LUT_SOURCES_COUNT} - 1") + +foreach(i RANGE 0 ${BUN_OBJECT_LUT_SOURCES_MAX_INDEX}) + list(GET BUN_OBJECT_LUT_SOURCES ${i} BUN_OBJECT_LUT_SOURCE) + list(GET BUN_OBJECT_LUT_OUTPUTS ${i} BUN_OBJECT_LUT_OUTPUT) + + get_filename_component(filename ${BUN_OBJECT_LUT_SOURCE} NAME_WE) + register_command( + TARGET + bun-codegen-lut-${filename} + COMMENT + "Generating ${filename}.lut.h" + DEPENDS + ${BUN_OBJECT_LUT_SOURCE} + COMMAND + ${BUN_EXECUTABLE} + run + ${BUN_OBJECT_LUT_SCRIPT} + ${BUN_OBJECT_LUT_SOURCE} + ${BUN_OBJECT_LUT_OUTPUT} + SOURCES + ${BUN_OBJECT_LUT_SCRIPT} + ${BUN_OBJECT_LUT_SOURCE} + OUTPUTS + ${BUN_OBJECT_LUT_OUTPUT} + ) + + WEBKIT_ADD_SOURCE_DEPENDENCIES(${BUN_OBJECT_LUT_SOURCE} ${BUN_OBJECT_LUT_OUTPUT}) +endforeach() + +WEBKIT_ADD_SOURCE_DEPENDENCIES( + ${CWD}/src/bun.js/bindings/ErrorCode.cpp + ${CODEGEN_PATH}/ErrorCode+List.h +) + +WEBKIT_ADD_SOURCE_DEPENDENCIES( + ${CWD}/src/bun.js/bindings/ErrorCode.h + ${CODEGEN_PATH}/ErrorCode+Data.h +) + +WEBKIT_ADD_SOURCE_DEPENDENCIES( + ${CWD}/src/bun.js/bindings/ZigGlobalObject.cpp + ${CODEGEN_PATH}/ZigGlobalObject.lut.h +) + + + +WEBKIT_ADD_SOURCE_DEPENDENCIES( + ${CWD}/src/bun.js/bindings/InternalModuleRegistry.cpp + ${CODEGEN_PATH}/InternalModuleRegistryConstants.h +) + +# --- Zig --- + +file(GLOB_RECURSE BUN_ZIG_SOURCES ${CONFIGURE_DEPENDS} + ${CWD}/src/*.zig +) + +list(APPEND BUN_ZIG_SOURCES + ${CWD}/build.zig + ${CWD}/src/main.zig + ${BUN_BINDGEN_ZIG_OUTPUTS} +) + +set(BUN_ZIG_GENERATED_SOURCES + ${BUN_ERROR_OUTPUTS} + ${BUN_FALLBACK_DECODER_OUTPUT} + ${BUN_RUNTIME_JS_OUTPUT} + ${BUN_NODE_FALLBACKS_OUTPUTS} + ${BUN_REACT_REFRESH_OUTPUT} + ${BUN_ERROR_CODE_OUTPUTS} + ${BUN_ZIG_GENERATED_CLASSES_OUTPUTS} + ${BUN_JAVASCRIPT_OUTPUTS} +) + +# In debug builds, these are not embedded, but rather referenced at runtime. +if (DEBUG) + list(APPEND BUN_ZIG_GENERATED_SOURCES ${CODEGEN_PATH}/bake_empty_file) +else() + list(APPEND BUN_ZIG_GENERATED_SOURCES ${BUN_BAKE_RUNTIME_OUTPUTS}) +endif() + +set(BUN_ZIG_OUTPUT ${BUILD_PATH}/bun-zig.o) + +if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|ARM|arm64|ARM64|aarch64|AARCH64") + if(APPLE) + set(ZIG_CPU "apple_m1") + else() + set(ZIG_CPU "native") + endif() +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|X86_64|x64|X64|amd64|AMD64") + if(ENABLE_BASELINE) + set(ZIG_CPU "nehalem") + else() + set(ZIG_CPU "haswell") + endif() +else() + unsupported(CMAKE_SYSTEM_PROCESSOR) +endif() + +set(ZIG_FLAGS_BUN) +if(NOT "${REVISION}" STREQUAL "") + set(ZIG_FLAGS_BUN ${ZIG_FLAGS_BUN} -Dsha=${REVISION}) +endif() + +register_command( + TARGET + bun-zig + GROUP + console + COMMENT + "Building src/*.zig for ${ZIG_TARGET}" + COMMAND + ${ZIG_EXECUTABLE} + build obj + ${CMAKE_ZIG_FLAGS} + --prefix ${BUILD_PATH} + -Dobj_format=${ZIG_OBJECT_FORMAT} + -Dtarget=${ZIG_TARGET} + -Doptimize=${ZIG_OPTIMIZE} + -Dcpu=${ZIG_CPU} + -Denable_logs=$,true,false> + -Dversion=${VERSION} + -Dreported_nodejs_version=${NODEJS_VERSION} + -Dcanary=${CANARY_REVISION} + -Dcodegen_path=${CODEGEN_PATH} + -Dcodegen_embed=$,true,false> + --prominent-compile-errors + ${ZIG_FLAGS_BUN} + ARTIFACTS + ${BUN_ZIG_OUTPUT} + TARGETS + clone-zig + SOURCES + ${BUN_ZIG_SOURCES} + ${BUN_ZIG_GENERATED_SOURCES} +) + +set_property(TARGET bun-zig PROPERTY JOB_POOL compile_pool) +set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "build.zig") + +# --- C/C++ Sources --- + +set(BUN_USOCKETS_SOURCE ${CWD}/packages/bun-usockets) + +# hand written cpp source files. Full list of "source" code (including codegen) is in BUN_CPP_SOURCES +file(GLOB BUN_CXX_SOURCES ${CONFIGURE_DEPENDS} + ${CWD}/src/io/*.cpp + ${CWD}/src/bun.js/modules/*.cpp + ${CWD}/src/bun.js/bindings/*.cpp + ${CWD}/src/bun.js/bindings/webcore/*.cpp + ${CWD}/src/bun.js/bindings/sqlite/*.cpp + ${CWD}/src/bun.js/bindings/webcrypto/*.cpp + ${CWD}/src/bun.js/bindings/webcrypto/*/*.cpp + ${CWD}/src/bun.js/bindings/node/crypto/*.cpp + ${CWD}/src/bun.js/bindings/v8/*.cpp + ${CWD}/src/bun.js/bindings/v8/shim/*.cpp + ${CWD}/src/bake/*.cpp + ${CWD}/src/deps/*.cpp + ${BUN_USOCKETS_SOURCE}/src/crypto/*.cpp +) + +file(GLOB BUN_C_SOURCES ${CONFIGURE_DEPENDS} + ${BUN_USOCKETS_SOURCE}/src/*.c + ${BUN_USOCKETS_SOURCE}/src/eventing/*.c + ${BUN_USOCKETS_SOURCE}/src/internal/*.c + ${BUN_USOCKETS_SOURCE}/src/crypto/*.c +) + +if(WIN32) + list(APPEND BUN_CXX_SOURCES ${CWD}/src/bun.js/bindings/windows/rescle.cpp) + list(APPEND BUN_CXX_SOURCES ${CWD}/src/bun.js/bindings/windows/rescle-binding.cpp) +endif() + +register_repository( + NAME + picohttpparser + REPOSITORY + h2o/picohttpparser + COMMIT + 066d2b1e9ab820703db0837a7255d92d30f0c9f5 + OUTPUTS + picohttpparser.c +) + +set(NODEJS_HEADERS_PATH ${VENDOR_PATH}/nodejs) + +register_command( + TARGET + bun-node-headers + COMMENT + "Download node ${NODEJS_VERSION} headers" + COMMAND + ${CMAKE_COMMAND} + -DDOWNLOAD_PATH=${NODEJS_HEADERS_PATH} + -DDOWNLOAD_URL=https://nodejs.org/dist/v${NODEJS_VERSION}/node-v${NODEJS_VERSION}-headers.tar.gz + -P ${CWD}/cmake/scripts/DownloadUrl.cmake + OUTPUTS + ${NODEJS_HEADERS_PATH}/include/node/node_version.h +) + +list(APPEND BUN_CPP_SOURCES + ${BUN_C_SOURCES} + ${BUN_CXX_SOURCES} + ${BUN_ERROR_CODE_OUTPUTS} + ${VENDOR_PATH}/picohttpparser/picohttpparser.c + ${NODEJS_HEADERS_PATH}/include/node/node_version.h + ${BUN_ZIG_GENERATED_CLASSES_OUTPUTS} + ${BUN_JS_SINK_OUTPUTS} + ${BUN_JAVASCRIPT_OUTPUTS} + ${BUN_OBJECT_LUT_OUTPUTS} + ${BUN_BINDGEN_CPP_OUTPUTS} +) + +if(WIN32) + if(ENABLE_CANARY) + set(Bun_VERSION_WITH_TAG ${VERSION}-canary.${CANARY_REVISION}) + else() + set(Bun_VERSION_WITH_TAG ${VERSION}) + endif() + set(BUN_ICO_PATH ${CWD}/src/bun.ico) + configure_file(${CWD}/src/bun.ico ${CODEGEN_PATH}/bun.ico COPYONLY) + configure_file( + ${CWD}/src/windows-app-info.rc + ${CODEGEN_PATH}/windows-app-info.rc + @ONLY + ) + add_custom_command( + OUTPUT ${CODEGEN_PATH}/windows-app-info.res + COMMAND rc.exe /fo ${CODEGEN_PATH}/windows-app-info.res ${CODEGEN_PATH}/windows-app-info.rc + DEPENDS ${CODEGEN_PATH}/windows-app-info.rc ${CODEGEN_PATH}/bun.ico + COMMENT "Adding Windows resource file ${CODEGEN_PATH}/windows-app-info.res with ico in ${CODEGEN_PATH}/bun.ico" + ) + set(WINDOWS_RESOURCES ${CODEGEN_PATH}/windows-app-info.res) +endif() + +# --- Executable --- + +set(BUN_CPP_OUTPUT ${BUILD_PATH}/${CMAKE_STATIC_LIBRARY_PREFIX}${bun}${CMAKE_STATIC_LIBRARY_SUFFIX}) + +if(BUN_LINK_ONLY) + add_executable(${bun} ${BUN_CPP_OUTPUT} ${BUN_ZIG_OUTPUT} ${WINDOWS_RESOURCES}) + set_target_properties(${bun} PROPERTIES LINKER_LANGUAGE CXX) + target_link_libraries(${bun} PRIVATE ${BUN_CPP_OUTPUT}) +elseif(BUN_CPP_ONLY) + add_library(${bun} STATIC ${BUN_CPP_SOURCES}) + register_command( + TARGET + ${bun} + TARGET_PHASE + POST_BUILD + COMMENT + "Uploading ${bun}" + COMMAND + ${CMAKE_COMMAND} -E true + ARTIFACTS + ${BUN_CPP_OUTPUT} + ) +else() + add_executable(${bun} ${BUN_CPP_SOURCES} ${WINDOWS_RESOURCES}) + target_link_libraries(${bun} PRIVATE ${BUN_ZIG_OUTPUT}) +endif() + +if(NOT bun STREQUAL "bun") + add_custom_target(bun DEPENDS ${bun}) +endif() + +# --- C/C++ Properties --- + +set_target_properties(${bun} PROPERTIES + CXX_STANDARD 20 + CXX_STANDARD_REQUIRED YES + CXX_EXTENSIONS YES + CXX_VISIBILITY_PRESET hidden + C_STANDARD 17 + C_STANDARD_REQUIRED YES + VISIBILITY_INLINES_HIDDEN YES +) + +# --- C/C++ Includes --- + +if(WIN32) + target_include_directories(${bun} PRIVATE ${CWD}/src/bun.js/bindings/windows) +endif() + +target_include_directories(${bun} PRIVATE + ${CWD}/packages + ${CWD}/packages/bun-usockets + ${CWD}/packages/bun-usockets/src + ${CWD}/src/bun.js/bindings + ${CWD}/src/bun.js/bindings/webcore + ${CWD}/src/bun.js/bindings/webcrypto + ${CWD}/src/bun.js/bindings/node/crypto + ${CWD}/src/bun.js/bindings/sqlite + ${CWD}/src/bun.js/bindings/v8 + ${CWD}/src/bun.js/modules + ${CWD}/src/js/builtins + ${CWD}/src/napi + ${CWD}/src/deps + ${CODEGEN_PATH} + ${VENDOR_PATH} + ${VENDOR_PATH}/picohttpparser + ${NODEJS_HEADERS_PATH}/include +) + +if(LINUX) + include(CheckIncludeFiles) + check_include_files("sys/queue.h" HAVE_SYS_QUEUE_H) + if(NOT HAVE_SYS_QUEUE_H) + target_include_directories(${bun} PRIVATE vendor/lshpack/compat/queue) + endif() +endif() + +# --- C/C++ Definitions --- + +if(ENABLE_ASSERTIONS) + target_compile_definitions(${bun} PRIVATE ASSERT_ENABLED=1) +endif() + +if(DEBUG) + target_compile_definitions(${bun} PRIVATE BUN_DEBUG=1) +endif() + +if(APPLE) + target_compile_definitions(${bun} PRIVATE _DARWIN_NON_CANCELABLE=1) +endif() + +if(WIN32) + target_compile_definitions(${bun} PRIVATE + WIN32 + _WINDOWS + WIN32_LEAN_AND_MEAN=1 + _CRT_SECURE_NO_WARNINGS + BORINGSSL_NO_CXX=1 # lol + ) +endif() + +target_compile_definitions(${bun} PRIVATE + _HAS_EXCEPTIONS=0 + LIBUS_USE_OPENSSL=1 + LIBUS_USE_BORINGSSL=1 + WITH_BORINGSSL=1 + STATICALLY_LINKED_WITH_JavaScriptCore=1 + STATICALLY_LINKED_WITH_BMALLOC=1 + BUILDING_WITH_CMAKE=1 + JSC_OBJC_API_ENABLED=0 + BUN_SINGLE_THREADED_PER_VM_ENTRY_SCOPE=1 + NAPI_EXPERIMENTAL=ON + NOMINMAX + IS_BUILD + BUILDING_JSCONLY__ + REPORTED_NODEJS_VERSION=\"${NODEJS_VERSION}\" + REPORTED_NODEJS_ABI_VERSION=${NODEJS_ABI_VERSION} +) + +if(DEBUG AND NOT CI) + target_compile_definitions(${bun} PRIVATE + BUN_DYNAMIC_JS_LOAD_PATH=\"${BUILD_PATH}/js\" + ) +endif() + + +# --- Compiler options --- + +if(NOT WIN32) + target_compile_options(${bun} PUBLIC + -fconstexpr-steps=2542484 + -fconstexpr-depth=54 + -fno-pic + -fno-pie + -faddrsig + ) + if(DEBUG) + # TODO: this shouldn't be necessary long term + if (NOT ABI STREQUAL "musl") + target_compile_options(${bun} PUBLIC + -fsanitize=null + -fsanitize-recover=all + -fsanitize=bounds + -fsanitize=return + -fsanitize=nullability-arg + -fsanitize=nullability-assign + -fsanitize=nullability-return + -fsanitize=returns-nonnull-attribute + -fsanitize=unreachable + ) + target_link_libraries(${bun} PRIVATE + -fsanitize=null + ) + endif() + + if (ENABLE_ASAN) + target_compile_options(${bun} PUBLIC + -fsanitize=address + ) + target_link_libraries(${bun} PUBLIC + -fsanitize=address + ) + endif() + + target_compile_options(${bun} PUBLIC + -Werror=return-type + -Werror=return-stack-address + -Werror=implicit-function-declaration + -Werror=uninitialized + -Werror=conditional-uninitialized + -Werror=suspicious-memaccess + -Werror=int-conversion + -Werror=nonnull + -Werror=move + -Werror=sometimes-uninitialized + -Werror=unused + -Wno-unused-function + -Wno-nullability-completeness + -Werror + ) + else() + # Leave -Werror=unused off in release builds so we avoid errors from being used in ASSERT + target_compile_options(${bun} PUBLIC ${LTO_FLAG} + -Werror=return-type + -Werror=return-stack-address + -Werror=implicit-function-declaration + -Werror=uninitialized + -Werror=conditional-uninitialized + -Werror=suspicious-memaccess + -Werror=int-conversion + -Werror=nonnull + -Werror=move + -Werror=sometimes-uninitialized + -Wno-nullability-completeness + -Werror + ) + endif() +endif() + +# --- Linker options --- + +if(WIN32) + target_link_options(${bun} PUBLIC + /STACK:0x1200000,0x200000 + /errorlimit:0 + ) + if(RELEASE) + target_link_options(${bun} PUBLIC + /LTCG + /OPT:REF + /OPT:NOICF + /DEBUG:FULL + /delayload:ole32.dll + /delayload:WINMM.dll + /delayload:dbghelp.dll + /delayload:VCRUNTIME140_1.dll + # libuv loads these two immediately, but for some reason it seems to still be slightly faster to delayload them + /delayload:WS2_32.dll + /delayload:WSOCK32.dll + /delayload:ADVAPI32.dll + /delayload:IPHLPAPI.dll + ) + endif() +endif() + +if(APPLE) + target_link_options(${bun} PUBLIC + -dead_strip + -dead_strip_dylibs + -Wl,-ld_new + -Wl,-no_compact_unwind + -Wl,-stack_size,0x1200000 + -fno-keep-static-consts + -Wl,-map,${bun}.linker-map + ) +endif() + +if(LINUX) + if(NOT ABI STREQUAL "musl") + # on arm64 + if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm|ARM|arm64|ARM64|aarch64|AARCH64") + target_link_options(${bun} PUBLIC + -Wl,--wrap=exp + -Wl,--wrap=expf + -Wl,--wrap=fcntl64 + -Wl,--wrap=log + -Wl,--wrap=log2 + -Wl,--wrap=log2f + -Wl,--wrap=logf + -Wl,--wrap=pow + -Wl,--wrap=powf + ) + else() + target_link_options(${bun} PUBLIC + -Wl,--wrap=exp + -Wl,--wrap=expf + -Wl,--wrap=log2f + -Wl,--wrap=logf + -Wl,--wrap=powf + ) + endif() + endif() + + if(NOT ABI STREQUAL "musl") + target_link_options(${bun} PUBLIC + -static-libstdc++ + -static-libgcc + ) + else() + target_link_options(${bun} PUBLIC + -lstdc++ + -lgcc + ) + endif() + + target_link_options(${bun} PUBLIC + --ld-path=${LLD_PROGRAM} + -fno-pic + -Wl,-no-pie + -Wl,-icf=safe + -Wl,--as-needed + -Wl,--gc-sections + -Wl,-z,stack-size=12800000 + -Wl,--compress-debug-sections=zlib + -Wl,-z,lazy + -Wl,-z,norelro + -Wl,-z,combreloc + -Wl,--no-eh-frame-hdr + -Wl,--sort-section=name + -Wl,--hash-style=both + -Wl,--build-id=sha1 # Better for debugging than default + -Wl,-Map=${bun}.linker-map + ) +endif() + +# --- Symbols list --- + +if(WIN32) + set(BUN_SYMBOLS_PATH ${CWD}/src/symbols.def) + target_link_options(${bun} PUBLIC /DEF:${BUN_SYMBOLS_PATH}) +elseif(APPLE) + + set(BUN_SYMBOLS_PATH ${CWD}/src/symbols.txt) + target_link_options(${bun} PUBLIC -exported_symbols_list ${BUN_SYMBOLS_PATH}) +else() + set(BUN_SYMBOLS_PATH ${CWD}/src/symbols.dyn) + set(BUN_LINKER_LDS_PATH ${CWD}/src/linker.lds) + target_link_options(${bun} PUBLIC + -Bsymbolics-functions + -rdynamic + -Wl,--dynamic-list=${BUN_SYMBOLS_PATH} + -Wl,--version-script=${BUN_LINKER_LDS_PATH} + ) + set_target_properties(${bun} PROPERTIES LINK_DEPENDS ${BUN_LINKER_LDS_PATH}) +endif() + +set_target_properties(${bun} PROPERTIES LINK_DEPENDS ${BUN_SYMBOLS_PATH}) + +# --- WebKit --- + +include(SetupWebKit) + +if(WIN32) + if(DEBUG) + target_link_libraries(${bun} PRIVATE + ${WEBKIT_LIB_PATH}/WTF.lib + ${WEBKIT_LIB_PATH}/JavaScriptCore.lib + ${WEBKIT_LIB_PATH}/sicudtd.lib + ${WEBKIT_LIB_PATH}/sicuind.lib + ${WEBKIT_LIB_PATH}/sicuucd.lib + ) + else() + target_link_libraries(${bun} PRIVATE + ${WEBKIT_LIB_PATH}/WTF.lib + ${WEBKIT_LIB_PATH}/JavaScriptCore.lib + ${WEBKIT_LIB_PATH}/sicudt.lib + ${WEBKIT_LIB_PATH}/sicuin.lib + ${WEBKIT_LIB_PATH}/sicuuc.lib + ) + endif() +else() + target_link_libraries(${bun} PRIVATE + ${WEBKIT_LIB_PATH}/libWTF.a + ${WEBKIT_LIB_PATH}/libJavaScriptCore.a + ) + if(NOT APPLE OR EXISTS ${WEBKIT_LIB_PATH}/libbmalloc.a) + target_link_libraries(${bun} PRIVATE ${WEBKIT_LIB_PATH}/libbmalloc.a) + endif() +endif() + +include_directories(${WEBKIT_INCLUDE_PATH}) + +if(NOT WEBKIT_LOCAL AND NOT APPLE) + include_directories(${WEBKIT_INCLUDE_PATH}/wtf/unicode) +endif() + +# --- Dependencies --- + +set(BUN_DEPENDENCIES + BoringSSL + Brotli + Cares + LibDeflate + LolHtml + Lshpack + Mimalloc + TinyCC + Zlib + LibArchive # must be loaded after zlib + Zstd +) + +if(WIN32) + list(APPEND BUN_DEPENDENCIES Libuv) +endif() + +if(USE_STATIC_SQLITE) + list(APPEND BUN_DEPENDENCIES SQLite) +endif() + +foreach(dependency ${BUN_DEPENDENCIES}) + include(Build${dependency}) +endforeach() + +list(TRANSFORM BUN_DEPENDENCIES TOLOWER OUTPUT_VARIABLE BUN_TARGETS) +add_custom_target(dependencies DEPENDS ${BUN_TARGETS}) + +if(APPLE) + target_link_libraries(${bun} PRIVATE icucore resolv) + target_compile_definitions(${bun} PRIVATE U_DISABLE_RENAMING=1) +endif() + +if(USE_STATIC_SQLITE) + target_compile_definitions(${bun} PRIVATE LAZY_LOAD_SQLITE=0) +else() + target_compile_definitions(${bun} PRIVATE LAZY_LOAD_SQLITE=1) +endif() + +if(LINUX) + target_link_libraries(${bun} PRIVATE c pthread dl) + + if(USE_STATIC_LIBATOMIC) + target_link_libraries(${bun} PRIVATE libatomic.a) + else() + target_link_libraries(${bun} PUBLIC libatomic.so) + endif() + + if(USE_SYSTEM_ICU) + target_link_libraries(${bun} PRIVATE libicudata.a) + target_link_libraries(${bun} PRIVATE libicui18n.a) + target_link_libraries(${bun} PRIVATE libicuuc.a) + else() + target_link_libraries(${bun} PRIVATE ${WEBKIT_LIB_PATH}/libicudata.a) + target_link_libraries(${bun} PRIVATE ${WEBKIT_LIB_PATH}/libicui18n.a) + target_link_libraries(${bun} PRIVATE ${WEBKIT_LIB_PATH}/libicuuc.a) + endif() +endif() + +if(WIN32) + target_link_libraries(${bun} PRIVATE + winmm + bcrypt + ntdll + userenv + dbghelp + wsock32 # ws2_32 required by TransmitFile aka sendfile on windows + delayimp.lib + ) +endif() + +# --- Packaging --- + +if(NOT BUN_CPP_ONLY) + set(CMAKE_STRIP_FLAGS "") + if(APPLE) + # We do not build with exceptions enabled. These are generated by lolhtml + # and other dependencies. We build lolhtml with abort on panic, so it + # shouldn't be including these in the first place. + set(CMAKE_STRIP_FLAGS --remove-section=__TEXT,__eh_frame --remove-section=__TEXT,__unwind_info --remove-section=__TEXT,__gcc_except_tab) + elseif(LINUX AND NOT ABI STREQUAL "musl") + # When you use llvm-strip to do this, it doesn't delete it from the binary and instead keeps it as [LOAD #2 [R]] + # So, we must use GNU strip to do this. + set(CMAKE_STRIP_FLAGS -R .eh_frame -R .gcc_except_table) + endif() + + if(bunStrip) + register_command( + TARGET + ${bun} + TARGET_PHASE + POST_BUILD + COMMENT + "Stripping ${bun}" + COMMAND + ${CMAKE_STRIP} + ${bunExe} + ${CMAKE_STRIP_FLAGS} + --strip-all + --strip-debug + --discard-all + -o ${bunStripExe} + CWD + ${BUILD_PATH} + OUTPUTS + ${BUILD_PATH}/${bunStripExe} + ) + endif() + + register_command( + TARGET + ${bun} + TARGET_PHASE + POST_BUILD + COMMENT + "Testing ${bun}" + COMMAND + ${CMAKE_COMMAND} + -E env BUN_DEBUG_QUIET_LOGS=1 + ${BUILD_PATH}/${bunExe} + --revision + CWD + ${BUILD_PATH} + ) + + if(CI) + set(BUN_FEATURES_SCRIPT ${CWD}/scripts/features.mjs) + register_command( + TARGET + ${bun} + TARGET_PHASE + POST_BUILD + COMMENT + "Generating features.json" + COMMAND + ${CMAKE_COMMAND} + -E env + BUN_GARBAGE_COLLECTOR_LEVEL=1 + BUN_DEBUG_QUIET_LOGS=1 + BUN_FEATURE_FLAG_INTERNAL_FOR_TESTING=1 + ${BUILD_PATH}/${bunExe} + ${BUN_FEATURES_SCRIPT} + CWD + ${BUILD_PATH} + ARTIFACTS + ${BUILD_PATH}/features.json + ) + endif() + + if(CMAKE_HOST_APPLE AND bunStrip) + register_command( + TARGET + ${bun} + TARGET_PHASE + POST_BUILD + COMMENT + "Generating ${bun}.dSYM" + COMMAND + ${CMAKE_DSYMUTIL} + ${bun} + --flat + --keep-function-for-static + --object-prefix-map .=${CWD} + -o ${bun}.dSYM + -j ${CMAKE_BUILD_PARALLEL_LEVEL} + CWD + ${BUILD_PATH} + OUTPUTS + ${BUILD_PATH}/${bun}.dSYM + ) + endif() + + if(CI) + set(bunTriplet bun-${OS}-${ARCH}) + if(LINUX AND ABI STREQUAL "musl") + set(bunTriplet ${bunTriplet}-musl) + endif() + if(ENABLE_BASELINE) + set(bunTriplet ${bunTriplet}-baseline) + endif() + string(REPLACE bun ${bunTriplet} bunPath ${bun}) + set(bunFiles ${bunExe} features.json) + if(WIN32) + list(APPEND bunFiles ${bun}.pdb) + elseif(APPLE) + list(APPEND bunFiles ${bun}.dSYM) + endif() + + if(APPLE OR LINUX) + list(APPEND bunFiles ${bun}.linker-map) + endif() + + + register_command( + TARGET + ${bun} + TARGET_PHASE + POST_BUILD + COMMENT + "Generating ${bunPath}.zip" + COMMAND + ${CMAKE_COMMAND} -E rm -rf ${bunPath} ${bunPath}.zip + && ${CMAKE_COMMAND} -E make_directory ${bunPath} + && ${CMAKE_COMMAND} -E copy ${bunFiles} ${bunPath} + && ${CMAKE_COMMAND} -E tar cfv ${bunPath}.zip --format=zip ${bunPath} + && ${CMAKE_COMMAND} -E rm -rf ${bunPath} + CWD + ${BUILD_PATH} + ARTIFACTS + ${BUILD_PATH}/${bunPath}.zip + ) + + if(bunStrip) + string(REPLACE bun ${bunTriplet} bunStripPath ${bunStrip}) + register_command( + TARGET + ${bun} + TARGET_PHASE + POST_BUILD + COMMENT + "Generating ${bunStripPath}.zip" + COMMAND + ${CMAKE_COMMAND} -E rm -rf ${bunStripPath} ${bunStripPath}.zip + && ${CMAKE_COMMAND} -E make_directory ${bunStripPath} + && ${CMAKE_COMMAND} -E copy ${bunStripExe} ${bunStripPath} + && ${CMAKE_COMMAND} -E tar cfv ${bunStripPath}.zip --format=zip ${bunStripPath} + && ${CMAKE_COMMAND} -E rm -rf ${bunStripPath} + CWD + ${BUILD_PATH} + ARTIFACTS + ${BUILD_PATH}/${bunStripPath}.zip + ) + endif() + endif() +endif() diff --git a/cmake/targets/BuildCares.cmake b/cmake/targets/BuildCares.cmake new file mode 100644 index 0000000000..761f6d1998 --- /dev/null +++ b/cmake/targets/BuildCares.cmake @@ -0,0 +1,28 @@ +register_repository( + NAME + cares + REPOSITORY + c-ares/c-ares + COMMIT + 4f4912bce7374f787b10576851b687935f018e17 +) + +register_cmake_command( + TARGET + cares + TARGETS + c-ares + ARGS + -DCARES_STATIC=ON + -DCARES_STATIC_PIC=ON # FORCE_PIC was set to 1, but CARES_STATIC_PIC was set to OFF?? + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DCARES_SHARED=OFF + -DCARES_BUILD_TOOLS=OFF # this was set to ON? + -DCMAKE_INSTALL_LIBDIR=lib + LIB_PATH + lib + LIBRARIES + cares + INCLUDES + include +) diff --git a/cmake/targets/BuildLibArchive.cmake b/cmake/targets/BuildLibArchive.cmake new file mode 100644 index 0000000000..da8bfcb7cd --- /dev/null +++ b/cmake/targets/BuildLibArchive.cmake @@ -0,0 +1,53 @@ +register_repository( + NAME + libarchive + REPOSITORY + libarchive/libarchive + COMMIT + 898dc8319355b7e985f68a9819f182aaed61b53a +) + +register_cmake_command( + TARGET + libarchive + TARGETS + archive_static + ARGS + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DBUILD_SHARED_LIBS=OFF + -DENABLE_INSTALL=OFF + -DENABLE_TEST=OFF + -DENABLE_WERROR=OFF + -DENABLE_BZip2=OFF + -DENABLE_CAT=OFF + -DENABLE_EXPAT=OFF + -DENABLE_ICONV=OFF + -DENABLE_LIBB2=OFF + -DENABLE_LibGCC=OFF + -DENABLE_LIBXML2=OFF + -DENABLE_LZ4=OFF + -DENABLE_LZMA=OFF + -DENABLE_LZO=OFF + -DENABLE_MBEDTLS=OFF + -DENABLE_NETTLE=OFF + -DENABLE_OPENSSL=OFF + -DENABLE_PCRE2POSIX=OFF + -DENABLE_PCREPOSIX=OFF + -DENABLE_ZSTD=OFF + # libarchive depends on zlib headers, otherwise it will + # spawn a processes to compress instead of using the library. + -DENABLE_ZLIB=OFF + -DHAVE_ZLIB_H=ON + -DCMAKE_C_FLAGS="-I${VENDOR_PATH}/zlib" + LIB_PATH + libarchive + LIBRARIES + archive + INCLUDES + include +) + +# Must be loaded after zlib is defined +if(TARGET clone-zlib) + add_dependencies(libarchive clone-zlib) +endif() diff --git a/cmake/targets/BuildLibDeflate.cmake b/cmake/targets/BuildLibDeflate.cmake new file mode 100644 index 0000000000..f2820e3e79 --- /dev/null +++ b/cmake/targets/BuildLibDeflate.cmake @@ -0,0 +1,24 @@ +register_repository( + NAME + libdeflate + REPOSITORY + ebiggers/libdeflate + COMMIT + 733848901289eca058804ca0737f8796875204c8 +) + +register_cmake_command( + TARGET + libdeflate + TARGETS + libdeflate_static + ARGS + -DLIBDEFLATE_BUILD_STATIC_LIB=ON + -DLIBDEFLATE_BUILD_SHARED_LIB=OFF + -DLIBDEFLATE_BUILD_GZIP=OFF + LIBRARIES + deflatestatic WIN32 + deflate UNIX + INCLUDES + . +) diff --git a/cmake/targets/BuildLibuv.cmake b/cmake/targets/BuildLibuv.cmake new file mode 100644 index 0000000000..feba612c44 --- /dev/null +++ b/cmake/targets/BuildLibuv.cmake @@ -0,0 +1,29 @@ +register_repository( + NAME + libuv + REPOSITORY + libuv/libuv + COMMIT + da527d8d2a908b824def74382761566371439003 +) + +if(WIN32) + set(LIBUV_CMAKE_C_FLAGS "/DWIN32 /D_WINDOWS -Wno-int-conversion") +endif() + +register_cmake_command( + TARGET + libuv + TARGETS + uv_a + ARGS + -DLIBUV_BUILD_SHARED=OFF + -DLIBUV_BUILD_TESTS=OFF + -DLIBUV_BUILD_BENCH=OFF + -DCMAKE_C_FLAGS=${LIBUV_CMAKE_C_FLAGS} + LIBRARIES + libuv WIN32 + uv UNIX + INCLUDES + include +) diff --git a/cmake/targets/BuildLolHtml.cmake b/cmake/targets/BuildLolHtml.cmake new file mode 100644 index 0000000000..3b0d80a723 --- /dev/null +++ b/cmake/targets/BuildLolHtml.cmake @@ -0,0 +1,59 @@ +register_repository( + NAME + lolhtml + REPOSITORY + cloudflare/lol-html + COMMIT + 4f8becea13a0021c8b71abd2dcc5899384973b66 +) + +set(LOLHTML_CWD ${VENDOR_PATH}/lolhtml/c-api) +set(LOLHTML_BUILD_PATH ${BUILD_PATH}/lolhtml) + +if(DEBUG) + set(LOLHTML_BUILD_TYPE debug) +else() + set(LOLHTML_BUILD_TYPE release) +endif() + +set(LOLHTML_LIBRARY ${LOLHTML_BUILD_PATH}/${LOLHTML_BUILD_TYPE}/${CMAKE_STATIC_LIBRARY_PREFIX}lolhtml${CMAKE_STATIC_LIBRARY_SUFFIX}) + +set(LOLHTML_BUILD_ARGS + --target-dir ${BUILD_PATH}/lolhtml +) + +if(RELEASE) + list(APPEND LOLHTML_BUILD_ARGS --release) +endif() + +# Windows requires unwind tables, apparently. +if (NOT WIN32) + # The encoded escape sequences are intentional. They're how you delimit multiple arguments in a single environment variable. + # Also add rust optimization flag for smaller binary size, but not huge speed penalty. + set(RUSTFLAGS "-Cpanic=abort-Cdebuginfo=0-Cforce-unwind-tables=no-Copt-level=s") +endif() + +register_command( + TARGET + lolhtml + CWD + ${LOLHTML_CWD} + COMMAND + ${CARGO_EXECUTABLE} + build + ${LOLHTML_BUILD_ARGS} + ARTIFACTS + ${LOLHTML_LIBRARY} + ENVIRONMENT + CARGO_TERM_COLOR=always + CARGO_TERM_VERBOSE=true + CARGO_TERM_DIAGNOSTIC=true + CARGO_ENCODED_RUSTFLAGS=${RUSTFLAGS} + CARGO_HOME=${CARGO_HOME} + RUSTUP_HOME=${RUSTUP_HOME} +) + +target_link_libraries(${bun} PRIVATE ${LOLHTML_LIBRARY}) +if(BUN_LINK_ONLY) + target_sources(${bun} PRIVATE ${LOLHTML_LIBRARY}) +endif() diff --git a/cmake/targets/BuildLshpack.cmake b/cmake/targets/BuildLshpack.cmake new file mode 100644 index 0000000000..39d311f87a --- /dev/null +++ b/cmake/targets/BuildLshpack.cmake @@ -0,0 +1,33 @@ +register_repository( + NAME + lshpack + REPOSITORY + litespeedtech/ls-hpack + COMMIT + 8905c024b6d052f083a3d11d0a169b3c2735c8a1 +) + +if(WIN32) + set(LSHPACK_INCLUDES . compat/queue) +else() + set(LSHPACK_INCLUDES .) +endif() + +register_cmake_command( + TARGET + lshpack + LIBRARIES + ls-hpack + ARGS + -DSHARED=OFF + -DLSHPACK_XXH=ON + # There are linking errors when built with non-Release + # Undefined symbols for architecture arm64: + # "___asan_handle_no_return", referenced from: + # _lshpack_enc_get_static_nameval in libls-hpack.a(lshpack.c.o) + # _lshpack_enc_get_static_name in libls-hpack.a(lshpack.c.o) + # _update_hash in libls-hpack.a(lshpack.c.o) + -DCMAKE_BUILD_TYPE=Release + INCLUDES + ${LSHPACK_INCLUDES} +) diff --git a/cmake/targets/BuildMimalloc.cmake b/cmake/targets/BuildMimalloc.cmake new file mode 100644 index 0000000000..3ce366a03a --- /dev/null +++ b/cmake/targets/BuildMimalloc.cmake @@ -0,0 +1,64 @@ +register_repository( + NAME + mimalloc + REPOSITORY + oven-sh/mimalloc + COMMIT + 1beadf9651a7bfdec6b5367c380ecc3fe1c40d1a +) + +set(MIMALLOC_CMAKE_ARGS + -DMI_BUILD_STATIC=ON + -DMI_BUILD_OBJECT=ON + -DMI_BUILD_SHARED=OFF + -DMI_BUILD_TESTS=OFF + -DMI_USE_CXX=ON + -DMI_OVERRIDE=OFF + -DMI_OSX_ZONE=OFF + -DMI_OSX_INTERPOSE=OFF + -DMI_SKIP_COLLECT_ON_EXIT=ON +) + +if(ENABLE_ASAN) + list(APPEND MIMALLOC_CMAKE_ARGS -DMI_TRACK_ASAN=ON) +endif() + +if(DEBUG) + list(APPEND MIMALLOC_CMAKE_ARGS -DMI_DEBUG_FULL=ON) +endif() + +if(ENABLE_VALGRIND) + list(APPEND MIMALLOC_CMAKE_ARGS -DMI_VALGRIND=ON) +endif() + +if(WIN32) + if(DEBUG) + set(MIMALLOC_LIBRARY mimalloc-static-debug) + else() + set(MIMALLOC_LIBRARY mimalloc-static) + endif() +elseif(DEBUG) + set(MIMALLOC_LIBRARY mimalloc-debug) +else() + set(MIMALLOC_LIBRARY mimalloc) +endif() + +# Workaround for linker issue on macOS and Linux x64 +# https://github.com/microsoft/mimalloc/issues/512 +if(APPLE OR (LINUX AND NOT DEBUG)) + set(MIMALLOC_LIBRARY CMakeFiles/mimalloc-obj.dir/src/static.c.o) +endif() + +register_cmake_command( + TARGET + mimalloc + TARGETS + mimalloc-static + mimalloc-obj + ARGS + ${MIMALLOC_CMAKE_ARGS} + LIBRARIES + ${MIMALLOC_LIBRARY} + INCLUDES + include +) diff --git a/cmake/targets/BuildSQLite.cmake b/cmake/targets/BuildSQLite.cmake new file mode 100644 index 0000000000..ce4cd8da24 --- /dev/null +++ b/cmake/targets/BuildSQLite.cmake @@ -0,0 +1,10 @@ +register_cmake_command( + TARGET + sqlite + CWD + ${CWD}/src/bun.js/bindings/sqlite + LIBRARIES + sqlite3 + INCLUDES + . +) diff --git a/cmake/targets/BuildTinyCC.cmake b/cmake/targets/BuildTinyCC.cmake new file mode 100644 index 0000000000..050eac4613 --- /dev/null +++ b/cmake/targets/BuildTinyCC.cmake @@ -0,0 +1,15 @@ +register_repository( + NAME + tinycc + REPOSITORY + oven-sh/tinycc + COMMIT + 29985a3b59898861442fa3b43f663fc1af2591d7 +) + +register_cmake_command( + TARGET + tinycc + LIBRARIES + tcc +) diff --git a/cmake/targets/BuildZlib.cmake b/cmake/targets/BuildZlib.cmake new file mode 100644 index 0000000000..1940bb2e33 --- /dev/null +++ b/cmake/targets/BuildZlib.cmake @@ -0,0 +1,40 @@ +register_repository( + NAME + zlib + REPOSITORY + cloudflare/zlib + COMMIT + 886098f3f339617b4243b286f5ed364b9989e245 +) + +# https://gitlab.kitware.com/cmake/cmake/-/issues/25755 +if(APPLE) + set(ZLIB_CMAKE_C_FLAGS "-fno-define-target-os-macros") + set(ZLIB_CMAKE_CXX_FLAGS "-fno-define-target-os-macros") +endif() + +if(WIN32) + if(DEBUG) + set(ZLIB_LIBRARY "zlibd") + else() + set(ZLIB_LIBRARY "zlib") + endif() +else() + set(ZLIB_LIBRARY "z") +endif() + +register_cmake_command( + TARGET + zlib + TARGETS + zlib + ARGS + -DBUILD_SHARED_LIBS=OFF + -DBUILD_EXAMPLES=OFF + "-DCMAKE_C_FLAGS=${ZLIB_CMAKE_C_FLAGS}" + "-DCMAKE_CXX_FLAGS=${ZLIB_CMAKE_CXX_FLAGS}" + LIBRARIES + ${ZLIB_LIBRARY} + INCLUDES + . +) diff --git a/cmake/targets/BuildZstd.cmake b/cmake/targets/BuildZstd.cmake new file mode 100644 index 0000000000..f58c3793fa --- /dev/null +++ b/cmake/targets/BuildZstd.cmake @@ -0,0 +1,26 @@ +register_repository( + NAME + zstd + REPOSITORY + facebook/zstd + COMMIT + 794ea1b0afca0f020f4e57b6732332231fb23c70 +) + +register_cmake_command( + TARGET + zstd + TARGETS + libzstd_static + ARGS + -Sbuild/cmake + -DZSTD_BUILD_STATIC=ON + -DZSTD_BUILD_PROGRAMS=OFF + -DZSTD_BUILD_TESTS=OFF + -DZSTD_BUILD_CONTRIB=OFF + LIB_PATH + lib + LIBRARIES + zstd_static WIN32 + zstd UNIX +) diff --git a/cmake/toolchains/darwin-aarch64.cmake b/cmake/toolchains/darwin-aarch64.cmake new file mode 100644 index 0000000000..b5a52c3fb2 --- /dev/null +++ b/cmake/toolchains/darwin-aarch64.cmake @@ -0,0 +1,5 @@ +set(CMAKE_SYSTEM_NAME Darwin) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON) diff --git a/cmake/toolchains/darwin-x64.cmake b/cmake/toolchains/darwin-x64.cmake new file mode 100644 index 0000000000..aef2c72d12 --- /dev/null +++ b/cmake/toolchains/darwin-x64.cmake @@ -0,0 +1,6 @@ +set(CMAKE_SYSTEM_NAME Darwin) +set(CMAKE_SYSTEM_PROCESSOR x64) +set(CMAKE_OSX_ARCHITECTURES x86_64) + +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON) \ No newline at end of file diff --git a/cmake/toolchains/linux-aarch64-musl.cmake b/cmake/toolchains/linux-aarch64-musl.cmake new file mode 100644 index 0000000000..e4a33f709e --- /dev/null +++ b/cmake/toolchains/linux-aarch64-musl.cmake @@ -0,0 +1,6 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) +set(ABI musl) + +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON) \ No newline at end of file diff --git a/cmake/toolchains/linux-aarch64.cmake b/cmake/toolchains/linux-aarch64.cmake new file mode 100644 index 0000000000..657594dae8 --- /dev/null +++ b/cmake/toolchains/linux-aarch64.cmake @@ -0,0 +1,6 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) +set(ABI gnu) + +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON) \ No newline at end of file diff --git a/cmake/toolchains/linux-x64-baseline.cmake b/cmake/toolchains/linux-x64-baseline.cmake new file mode 100644 index 0000000000..73d6bc61e4 --- /dev/null +++ b/cmake/toolchains/linux-x64-baseline.cmake @@ -0,0 +1,7 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR x64) +set(ENABLE_BASELINE ON) +set(ABI gnu) + +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON) \ No newline at end of file diff --git a/cmake/toolchains/linux-x64-musl-baseline.cmake b/cmake/toolchains/linux-x64-musl-baseline.cmake new file mode 100644 index 0000000000..ea28a1757a --- /dev/null +++ b/cmake/toolchains/linux-x64-musl-baseline.cmake @@ -0,0 +1,7 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR x64) +set(ENABLE_BASELINE ON) +set(ABI musl) + +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON) \ No newline at end of file diff --git a/cmake/toolchains/linux-x64-musl.cmake b/cmake/toolchains/linux-x64-musl.cmake new file mode 100644 index 0000000000..db4998bba9 --- /dev/null +++ b/cmake/toolchains/linux-x64-musl.cmake @@ -0,0 +1,6 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR x64) +set(ABI musl) + +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON) diff --git a/cmake/toolchains/linux-x64.cmake b/cmake/toolchains/linux-x64.cmake new file mode 100644 index 0000000000..4104a1c5df --- /dev/null +++ b/cmake/toolchains/linux-x64.cmake @@ -0,0 +1,6 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR x64) +set(ABI gnu) + +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON) diff --git a/cmake/toolchains/windows-x64-baseline.cmake b/cmake/toolchains/windows-x64-baseline.cmake new file mode 100644 index 0000000000..fe2df9a930 --- /dev/null +++ b/cmake/toolchains/windows-x64-baseline.cmake @@ -0,0 +1,6 @@ +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x64) +set(ENABLE_BASELINE ON) + +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON) \ No newline at end of file diff --git a/cmake/toolchains/windows-x64.cmake b/cmake/toolchains/windows-x64.cmake new file mode 100644 index 0000000000..bb239656dc --- /dev/null +++ b/cmake/toolchains/windows-x64.cmake @@ -0,0 +1,5 @@ +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x64) + +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON) \ No newline at end of file diff --git a/cmake/tools/SetupBuildkite.cmake b/cmake/tools/SetupBuildkite.cmake new file mode 100644 index 0000000000..946ed25131 --- /dev/null +++ b/cmake/tools/SetupBuildkite.cmake @@ -0,0 +1,175 @@ +optionx(BUILDKITE_CACHE BOOL "If the build can use Buildkite caches, even if not running in Buildkite" DEFAULT ${BUILDKITE}) + +if(NOT BUILDKITE_CACHE OR NOT BUN_LINK_ONLY) + return() +endif() + +optionx(BUILDKITE_ORGANIZATION_SLUG STRING "The organization slug to use on Buildkite" DEFAULT "bun") +optionx(BUILDKITE_PIPELINE_SLUG STRING "The pipeline slug to use on Buildkite" DEFAULT "bun") +optionx(BUILDKITE_BUILD_ID STRING "The build ID to use on Buildkite") +optionx(BUILDKITE_GROUP_ID STRING "The group ID to use on Buildkite") + +if(ENABLE_BASELINE) + set(DEFAULT_BUILDKITE_GROUP_KEY ${OS}-${ARCH}-baseline) +else() + set(DEFAULT_BUILDKITE_GROUP_KEY ${OS}-${ARCH}) +endif() + +optionx(BUILDKITE_GROUP_KEY STRING "The group key to use on Buildkite" DEFAULT ${DEFAULT_BUILDKITE_GROUP_KEY}) + +if(BUILDKITE) + optionx(BUILDKITE_BUILD_ID_OVERRIDE STRING "The build ID to use on Buildkite") + if(BUILDKITE_BUILD_ID_OVERRIDE) + setx(BUILDKITE_BUILD_ID ${BUILDKITE_BUILD_ID_OVERRIDE}) + endif() +endif() + +set(BUILDKITE_PATH ${BUILD_PATH}/buildkite) +set(BUILDKITE_BUILDS_PATH ${BUILDKITE_PATH}/builds) + +if(NOT BUILDKITE_BUILD_ID) + # TODO: find the latest build on the main branch that passed + return() +endif() + +setx(BUILDKITE_BUILD_URL https://buildkite.com/${BUILDKITE_ORGANIZATION_SLUG}/${BUILDKITE_PIPELINE_SLUG}/builds/${BUILDKITE_BUILD_ID}) +setx(BUILDKITE_BUILD_PATH ${BUILDKITE_BUILDS_PATH}/builds/${BUILDKITE_BUILD_ID}) + +file( + DOWNLOAD ${BUILDKITE_BUILD_URL} + HTTPHEADER "Accept: application/json" + TIMEOUT 15 + STATUS BUILDKITE_BUILD_STATUS + ${BUILDKITE_BUILD_PATH}/build.json +) +if(NOT BUILDKITE_BUILD_STATUS EQUAL 0) + message(FATAL_ERROR "No build found: ${BUILDKITE_BUILD_STATUS} ${BUILDKITE_BUILD_URL}") + return() +endif() + +file(READ ${BUILDKITE_BUILD_PATH}/build.json BUILDKITE_BUILD) +string(JSON BUILDKITE_BUILD_UUID GET ${BUILDKITE_BUILD} id) +string(JSON BUILDKITE_JOBS GET ${BUILDKITE_BUILD} jobs) +string(JSON BUILDKITE_JOBS_COUNT LENGTH ${BUILDKITE_JOBS}) + +if(NOT BUILDKITE_JOBS_COUNT GREATER 0) + message(FATAL_ERROR "No jobs found: ${BUILDKITE_BUILD_URL}") + return() +endif() + +set(BUILDKITE_JOBS_FAILED) +set(BUILDKITE_JOBS_NOT_FOUND) +set(BUILDKITE_JOBS_NO_ARTIFACTS) +set(BUILDKITE_JOBS_NO_MATCH) +set(BUILDKITE_JOBS_MATCH) + +math(EXPR BUILDKITE_JOBS_MAX_INDEX "${BUILDKITE_JOBS_COUNT} - 1") +foreach(i RANGE ${BUILDKITE_JOBS_MAX_INDEX}) + string(JSON BUILDKITE_JOB GET ${BUILDKITE_JOBS} ${i}) + string(JSON BUILDKITE_JOB_ID GET ${BUILDKITE_JOB} id) + string(JSON BUILDKITE_JOB_PASSED GET ${BUILDKITE_JOB} passed) + string(JSON BUILDKITE_JOB_GROUP_ID GET ${BUILDKITE_JOB} group_uuid) + string(JSON BUILDKITE_JOB_GROUP_KEY GET ${BUILDKITE_JOB} group_identifier) + string(JSON BUILDKITE_JOB_NAME GET ${BUILDKITE_JOB} step_key) + if(NOT BUILDKITE_JOB_NAME) + string(JSON BUILDKITE_JOB_NAME GET ${BUILDKITE_JOB} name) + endif() + + if(NOT BUILDKITE_JOB_PASSED) + list(APPEND BUILDKITE_JOBS_FAILED ${BUILDKITE_JOB_NAME}) + continue() + endif() + + if(NOT (BUILDKITE_GROUP_ID AND BUILDKITE_GROUP_ID STREQUAL BUILDKITE_JOB_GROUP_ID) AND + NOT (BUILDKITE_GROUP_KEY AND BUILDKITE_GROUP_KEY STREQUAL BUILDKITE_JOB_GROUP_KEY)) + list(APPEND BUILDKITE_JOBS_NO_MATCH ${BUILDKITE_JOB_NAME}) + continue() + endif() + + set(BUILDKITE_ARTIFACTS_URL https://buildkite.com/organizations/${BUILDKITE_ORGANIZATION_SLUG}/pipelines/${BUILDKITE_PIPELINE_SLUG}/builds/${BUILDKITE_BUILD_UUID}/jobs/${BUILDKITE_JOB_ID}/artifacts) + set(BUILDKITE_ARTIFACTS_PATH ${BUILDKITE_BUILD_PATH}/artifacts/${BUILDKITE_JOB_ID}.json) + + file( + DOWNLOAD ${BUILDKITE_ARTIFACTS_URL} + HTTPHEADER "Accept: application/json" + TIMEOUT 15 + STATUS BUILDKITE_ARTIFACTS_STATUS + ${BUILDKITE_ARTIFACTS_PATH} + ) + + if(NOT BUILDKITE_ARTIFACTS_STATUS EQUAL 0) + list(APPEND BUILDKITE_JOBS_NOT_FOUND ${BUILDKITE_JOB_NAME}) + continue() + endif() + + file(READ ${BUILDKITE_ARTIFACTS_PATH} BUILDKITE_ARTIFACTS) + string(JSON BUILDKITE_ARTIFACTS_LENGTH LENGTH ${BUILDKITE_ARTIFACTS}) + if(NOT BUILDKITE_ARTIFACTS_LENGTH GREATER 0) + list(APPEND BUILDKITE_JOBS_NO_ARTIFACTS ${BUILDKITE_JOB_NAME}) + continue() + endif() + + math(EXPR BUILDKITE_ARTIFACTS_MAX_INDEX "${BUILDKITE_ARTIFACTS_LENGTH} - 1") + foreach(i RANGE 0 ${BUILDKITE_ARTIFACTS_MAX_INDEX}) + string(JSON BUILDKITE_ARTIFACT GET ${BUILDKITE_ARTIFACTS} ${i}) + string(JSON BUILDKITE_ARTIFACT_ID GET ${BUILDKITE_ARTIFACT} id) + string(JSON BUILDKITE_ARTIFACT_PATH GET ${BUILDKITE_ARTIFACT} path) + + if(NOT BUILDKITE_ARTIFACT_PATH MATCHES "\\.(o|a|lib|zip|tar|gz)") + continue() + endif() + + if(BUILDKITE) + set(BUILDKITE_DOWNLOAD_COMMAND buildkite-agent artifact download ${BUILDKITE_ARTIFACT_PATH} . --build ${BUILDKITE_BUILD_UUID} --step ${BUILDKITE_JOB_ID}) + else() + set(BUILDKITE_DOWNLOAD_COMMAND curl -L -o ${BUILDKITE_ARTIFACT_PATH} ${BUILDKITE_ARTIFACTS_URL}/${BUILDKITE_ARTIFACT_ID}) + endif() + + add_custom_command( + COMMENT + "Downloading ${BUILDKITE_ARTIFACT_PATH}" + VERBATIM COMMAND + ${BUILDKITE_DOWNLOAD_COMMAND} + WORKING_DIRECTORY + ${BUILD_PATH} + OUTPUT + ${BUILD_PATH}/${BUILDKITE_ARTIFACT_PATH} + ) + endforeach() + + list(APPEND BUILDKITE_JOBS_MATCH ${BUILDKITE_JOB_NAME}) +endforeach() + +if(BUILDKITE_JOBS_FAILED) + list(SORT BUILDKITE_JOBS_FAILED COMPARE STRING) + list(JOIN BUILDKITE_JOBS_FAILED " " BUILDKITE_JOBS_FAILED) + message(WARNING "The following jobs were found, but failed: ${BUILDKITE_JOBS_FAILED}") +endif() + +if(BUILDKITE_JOBS_NOT_FOUND) + list(SORT BUILDKITE_JOBS_NOT_FOUND COMPARE STRING) + list(JOIN BUILDKITE_JOBS_NOT_FOUND " " BUILDKITE_JOBS_NOT_FOUND) + message(WARNING "The following jobs were found, but could not fetch their data: ${BUILDKITE_JOBS_NOT_FOUND}") +endif() + +if(BUILDKITE_JOBS_NO_MATCH) + list(SORT BUILDKITE_JOBS_NO_MATCH COMPARE STRING) + list(JOIN BUILDKITE_JOBS_NO_MATCH " " BUILDKITE_JOBS_NO_MATCH) + message(WARNING "The following jobs were found, but did not match the group ID: ${BUILDKITE_JOBS_NO_MATCH}") +endif() + +if(BUILDKITE_JOBS_NO_ARTIFACTS) + list(SORT BUILDKITE_JOBS_NO_ARTIFACTS COMPARE STRING) + list(JOIN BUILDKITE_JOBS_NO_ARTIFACTS " " BUILDKITE_JOBS_NO_ARTIFACTS) + message(WARNING "The following jobs were found, but had no artifacts: ${BUILDKITE_JOBS_NO_ARTIFACTS}") +endif() + +if(BUILDKITE_JOBS_MATCH) + list(SORT BUILDKITE_JOBS_MATCH COMPARE STRING) + list(JOIN BUILDKITE_JOBS_MATCH " " BUILDKITE_JOBS_MATCH) + message(STATUS "The following jobs were found, and matched the group ID: ${BUILDKITE_JOBS_MATCH}") +endif() + +if(NOT BUILDKITE_JOBS_FAILED AND NOT BUILDKITE_JOBS_NOT_FOUND AND NOT BUILDKITE_JOBS_NO_MATCH AND NOT BUILDKITE_JOBS_NO_ARTIFACTS AND NOT BUILDKITE_JOBS_MATCH) + message(FATAL_ERROR "Something went wrong with Buildkite?") +endif() diff --git a/cmake/tools/SetupBun.cmake b/cmake/tools/SetupBun.cmake new file mode 100644 index 0000000000..3cb77ff4be --- /dev/null +++ b/cmake/tools/SetupBun.cmake @@ -0,0 +1,29 @@ +find_command( + VARIABLE + BUN_EXECUTABLE + COMMAND + bun + PATHS + $ENV{HOME}/.bun/bin + VERSION + >=1.1.26 +) + +if (NOT CI) + # If node.js is not installed, it is extremely easy to make this path point to + # a tempdir such as /private/tmp/bun-node-ce532901c/bun, which may cause this + # CMake configuration break after tempdir is cleaned up (ex. after reboot). + get_filename_component(BUN_EXECUTABLE ${BUN_EXECUTABLE} REALPATH) + set(BUN_EXECUTABLE ${BUN_EXECUTABLE} CACHE FILEPATH "Bun executable" FORCE) +endif() + +# If this is not set, some advanced features are not checked. +# https://github.com/oven-sh/bun/blob/cd7f6a1589db7f1e39dc4e3f4a17234afbe7826c/src/bun.js/javascript.zig#L1069-L1072 +setenv(BUN_GARBAGE_COLLECTOR_LEVEL 1) +setenv(BUN_FEATURE_FLAG_INTERNAL_FOR_TESTING 1) +setenv(BUN_DEBUG_QUIET_LOGS 1) + +# FIXME: https://github.com/oven-sh/bun/issues/11250 +if(NOT WIN32) + setenv(BUN_INSTALL_CACHE_DIR ${CACHE_PATH}/bun) +endif() diff --git a/cmake/tools/SetupCcache.cmake b/cmake/tools/SetupCcache.cmake new file mode 100644 index 0000000000..bc1db81494 --- /dev/null +++ b/cmake/tools/SetupCcache.cmake @@ -0,0 +1,51 @@ +optionx(ENABLE_CCACHE BOOL "If ccache should be enabled" DEFAULT ON) + +if(NOT ENABLE_CCACHE OR CACHE_STRATEGY STREQUAL "none") + setenv(CCACHE_DISABLE 1) + return() +endif() + +if (CI AND NOT APPLE) + setenv(CCACHE_DISABLE 1) + return() +endif() + +find_command( + VARIABLE + CCACHE_PROGRAM + COMMAND + ccache + REQUIRED + ${CI} +) + +if(NOT CCACHE_PROGRAM) + return() +endif() + +set(CCACHE_ARGS CMAKE_C_COMPILER_LAUNCHER CMAKE_CXX_COMPILER_LAUNCHER) +foreach(arg ${CCACHE_ARGS}) + setx(${arg} ${CCACHE_PROGRAM}) + list(APPEND CMAKE_ARGS -D${arg}=${${arg}}) +endforeach() + +setenv(CCACHE_DIR ${CACHE_PATH}/ccache) +setenv(CCACHE_BASEDIR ${CWD}) +setenv(CCACHE_NOHASHDIR 1) + +if(CACHE_STRATEGY STREQUAL "read-only") + setenv(CCACHE_READONLY 1) +elseif(CACHE_STRATEGY STREQUAL "write-only") + setenv(CCACHE_RECACHE 1) +endif() + +setenv(CCACHE_FILECLONE 1) +setenv(CCACHE_STATSLOG ${BUILD_PATH}/ccache.log) + +if(CI) + # FIXME: Does not work on Ubuntu 18.04 + # setenv(CCACHE_SLOPPINESS "pch_defines,time_macros,locale,clang_index_store,gcno_cwd,include_file_ctime,include_file_mtime") +else() + setenv(CCACHE_MAXSIZE 100G) + setenv(CCACHE_SLOPPINESS "pch_defines,time_macros,locale,random_seed,clang_index_store,gcno_cwd") +endif() diff --git a/cmake/tools/SetupEsbuild.cmake b/cmake/tools/SetupEsbuild.cmake new file mode 100644 index 0000000000..90989b711c --- /dev/null +++ b/cmake/tools/SetupEsbuild.cmake @@ -0,0 +1,20 @@ +if(CMAKE_HOST_WIN32) + setx(ESBUILD_EXECUTABLE ${CWD}/node_modules/.bin/esbuild.exe) +else() + setx(ESBUILD_EXECUTABLE ${CWD}/node_modules/.bin/esbuild) +endif() + +if(CMAKE_COLOR_DIAGNOSTICS) + set(ESBUILD_ARGS --color) +endif() + +register_command( + COMMAND + ${BUN_EXECUTABLE} + install + --frozen-lockfile + SOURCES + ${CWD}/package.json + OUTPUTS + ${ESBUILD_EXECUTABLE} +) diff --git a/cmake/tools/SetupGit.cmake b/cmake/tools/SetupGit.cmake new file mode 100644 index 0000000000..769735b7b0 --- /dev/null +++ b/cmake/tools/SetupGit.cmake @@ -0,0 +1,43 @@ +find_command( + VARIABLE + GIT_PROGRAM + COMMAND + git + REQUIRED + OFF +) + +if(NOT GIT_PROGRAM) + return() +endif() + +set(GIT_DIFF_COMMAND ${GIT_PROGRAM} diff --no-color --name-only --diff-filter=AMCR origin/main HEAD) + +execute_process( + COMMAND + ${GIT_DIFF_COMMAND} + WORKING_DIRECTORY + ${CWD} + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE + GIT_DIFF + ERROR_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE + GIT_DIFF_ERROR + RESULT_VARIABLE + GIT_DIFF_RESULT +) + +if(NOT GIT_DIFF_RESULT EQUAL 0) + message(WARNING "Command failed: ${GIT_DIFF_COMMAND} ${GIT_DIFF_ERROR}") + return() +endif() + +string(REPLACE "\n" ";" GIT_CHANGED_SOURCES "${GIT_DIFF}") + +if(CI) + setx(GIT_CHANGED_SOURCES ${GIT_CHANGED_SOURCES}) +endif() + +list(TRANSFORM GIT_CHANGED_SOURCES PREPEND ${CWD}/) +list(LENGTH GIT_CHANGED_SOURCES GIT_CHANGED_SOURCES_COUNT) diff --git a/cmake/tools/SetupLLVM.cmake b/cmake/tools/SetupLLVM.cmake new file mode 100644 index 0000000000..92423dc607 --- /dev/null +++ b/cmake/tools/SetupLLVM.cmake @@ -0,0 +1,141 @@ + +set(DEFAULT_ENABLE_LLVM ON) + +# if target is bun-zig, set ENABLE_LLVM to OFF +if(TARGET bun-zig) + set(DEFAULT_ENABLE_LLVM OFF) +endif() + +optionx(ENABLE_LLVM BOOL "If LLVM should be used for compilation" DEFAULT ${DEFAULT_ENABLE_LLVM}) + +if(NOT ENABLE_LLVM) + return() +endif() + +set(DEFAULT_LLVM_VERSION "18.1.8") + +optionx(LLVM_VERSION STRING "The version of LLVM to use" DEFAULT ${DEFAULT_LLVM_VERSION}) + +string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" USE_LLVM_VERSION ${LLVM_VERSION}) +if(USE_LLVM_VERSION) + set(LLVM_VERSION_MAJOR ${CMAKE_MATCH_1}) + set(LLVM_VERSION_MINOR ${CMAKE_MATCH_2}) + set(LLVM_VERSION_PATCH ${CMAKE_MATCH_3}) +endif() + +set(LLVM_PATHS) + +if(APPLE) + execute_process( + COMMAND brew --prefix + OUTPUT_VARIABLE HOMEBREW_PREFIX + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + + if(NOT HOMEBREW_PREFIX) + if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|ARM64|aarch64|AARCH64") + set(HOMEBREW_PREFIX /opt/homebrew) + else() + set(HOMEBREW_PREFIX /usr/local) + endif() + endif() + + if(USE_LLVM_VERSION) + list(APPEND LLVM_PATHS ${HOMEBREW_PREFIX}/opt/llvm@${LLVM_VERSION_MAJOR}/bin) + endif() + + list(APPEND LLVM_PATHS ${HOMEBREW_PREFIX}/opt/llvm/bin) +endif() + +if(UNIX) + list(APPEND LLVM_PATHS /usr/lib/llvm/bin) + + if(USE_LLVM_VERSION) + list(APPEND LLVM_PATHS + /usr/lib/llvm-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}/bin + /usr/lib/llvm-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}/bin + /usr/lib/llvm-${LLVM_VERSION_MAJOR}/bin + /usr/lib/llvm${LLVM_VERSION_MAJOR}/bin + ) + endif() +endif() + +macro(find_llvm_command variable command) + set(commands ${command}) + + if(USE_LLVM_VERSION) + list(APPEND commands + ${command}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH} + ${command}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} + ${command}-${LLVM_VERSION_MAJOR} + ) + endif() + + find_command( + VARIABLE ${variable} + VERSION_VARIABLE LLVM_VERSION + COMMAND ${commands} + PATHS ${LLVM_PATHS} + VERSION >=${LLVM_VERSION_MAJOR}.1.0 + ) + list(APPEND CMAKE_ARGS -D${variable}=${${variable}}) +endmacro() + +macro(find_llvm_command_no_version variable command) + set(commands ${command}) + + if(USE_LLVM_VERSION) + list(APPEND commands + ${command}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH} + ${command}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} + ${command}-${LLVM_VERSION_MAJOR} + ) + endif() + + find_command( + VARIABLE ${variable} + VERSION_VARIABLE LLVM_VERSION + COMMAND ${commands} + PATHS ${LLVM_PATHS} + ) + list(APPEND CMAKE_ARGS -D${variable}=${${variable}}) +endmacro() + +if(WIN32) + find_llvm_command(CMAKE_C_COMPILER clang-cl) + find_llvm_command(CMAKE_CXX_COMPILER clang-cl) + find_llvm_command_no_version(CMAKE_LINKER lld-link) + find_llvm_command_no_version(CMAKE_AR llvm-lib) + find_llvm_command_no_version(CMAKE_STRIP llvm-strip) +else() + find_llvm_command(CMAKE_C_COMPILER clang) + find_llvm_command(CMAKE_CXX_COMPILER clang++) + find_llvm_command(CMAKE_LINKER llvm-link) + find_llvm_command(CMAKE_AR llvm-ar) + if (LINUX) + # On Linux, strip ends up being more useful for us. + find_command( + VARIABLE + CMAKE_STRIP + COMMAND + strip + REQUIRED + ON + ) + else() + find_llvm_command(CMAKE_STRIP llvm-strip) + endif() + find_llvm_command(CMAKE_RANLIB llvm-ranlib) + if(LINUX) + find_llvm_command(LLD_PROGRAM ld.lld) + endif() + if(APPLE) + find_llvm_command(CMAKE_DSYMUTIL dsymutil) + endif() +endif() + +if(ENABLE_ANALYSIS) + find_llvm_command(CLANG_FORMAT_PROGRAM clang-format) + find_llvm_command(CLANG_TIDY_PROGRAM clang-tidy) +endif() diff --git a/cmake/tools/SetupMacSDK.cmake b/cmake/tools/SetupMacSDK.cmake new file mode 100644 index 0000000000..1eff438b79 --- /dev/null +++ b/cmake/tools/SetupMacSDK.cmake @@ -0,0 +1,59 @@ +set(MIN_OSX_DEPLOYMENT_TARGET "13.0") + +if(DEFINED ENV{CI}) + set(DEFAULT_OSX_DEPLOYMENT_TARGET ${MIN_OSX_DEPLOYMENT_TARGET}) +else() + execute_process( + COMMAND xcrun --sdk macosx --show-sdk-version + OUTPUT_VARIABLE CURRENT_OSX_DEPLOYMENT_TARGET + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE DEFAULT_OSX_DEPLOYMENT_TARGET_ERROR + ERROR_STRIP_TRAILING_WHITESPACE + ) + if(DEFAULT_OSX_DEPLOYMENT_TARGET_ERROR) + message(WARNING "Failed to find macOS SDK version, did you run `xcode-select --install`?") + message(FATAL_ERROR ${DEFAULT_OSX_DEPLOYMENT_TARGET_ERROR}) + endif() + + string(REGEX MATCH "^[0-9]*" DEFAULT_OSX_DEPLOYMENT_TARGET ${CURRENT_OSX_DEPLOYMENT_TARGET}) +endif() + +optionx(CMAKE_OSX_DEPLOYMENT_TARGET STRING "The macOS SDK version to target" DEFAULT ${DEFAULT_OSX_DEPLOYMENT_TARGET}) + +if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS ${MIN_OSX_DEPLOYMENT_TARGET}) + message(FATAL_ERROR "The target macOS SDK version, ${CMAKE_OSX_DEPLOYMENT_TARGET}, is older than the minimum supported version, ${MIN_OSX_DEPLOYMENT_TARGET}.") +endif() + +execute_process( + COMMAND sw_vers -productVersion + OUTPUT_VARIABLE MACOS_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET +) + +if(MACOS_VERSION VERSION_LESS ${CMAKE_OSX_DEPLOYMENT_TARGET}) + message(FATAL_ERROR "Your computer is running macOS ${MACOS_VERSION}, which is older than the target macOS SDK ${CMAKE_OSX_DEPLOYMENT_TARGET}. To fix this, either:\n" + " - Upgrade your computer to macOS ${CMAKE_OSX_DEPLOYMENT_TARGET} or newer\n" + " - Download a newer version of the macOS SDK from Apple: https://developer.apple.com/download/all/?q=xcode\n" + " - Set -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOS_VERSION}\n") +endif() + +execute_process( + COMMAND xcrun --sdk macosx --show-sdk-path + OUTPUT_VARIABLE DEFAULT_CMAKE_OSX_SYSROOT + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE DEFAULT_CMAKE_OSX_SYSROOT_ERROR + ERROR_STRIP_TRAILING_WHITESPACE +) + +if(CMAKE_OSX_SYSROOT_ERROR) + message(WARNING "Failed to find macOS SDK path, did you run `xcode-select --install`?") + message(FATAL_ERROR ${CMAKE_OSX_SYSROOT_ERROR}) +endif() + +optionx(CMAKE_OSX_SYSROOT STRING "The macOS SDK path to target" DEFAULT ${DEFAULT_CMAKE_OSX_SYSROOT}) + +list(APPEND CMAKE_ARGS + -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} + -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} +) diff --git a/cmake/tools/SetupRust.cmake b/cmake/tools/SetupRust.cmake new file mode 100644 index 0000000000..8a45d243eb --- /dev/null +++ b/cmake/tools/SetupRust.cmake @@ -0,0 +1,52 @@ +if(DEFINED ENV{CARGO_HOME}) + set(CARGO_HOME $ENV{CARGO_HOME}) +elseif(CMAKE_HOST_WIN32) + set(CARGO_HOME $ENV{USERPROFILE}/.cargo) + if(NOT EXISTS ${CARGO_HOME}) + set(CARGO_HOME $ENV{PROGRAMFILES}/Rust/cargo) + endif() +else() + set(CARGO_HOME $ENV{HOME}/.cargo) +endif() + +if(DEFINED ENV{RUSTUP_HOME}) + set(RUSTUP_HOME $ENV{RUSTUP_HOME}) +elseif(CMAKE_HOST_WIN32) + set(RUSTUP_HOME $ENV{USERPROFILE}/.rustup) + if(NOT EXISTS ${RUSTUP_HOME}) + set(RUSTUP_HOME $ENV{PROGRAMFILES}/Rust/rustup) + endif() +else() + set(RUSTUP_HOME $ENV{HOME}/.rustup) +endif() + +find_command( + VARIABLE + CARGO_EXECUTABLE + COMMAND + cargo + PATHS + ${CARGO_HOME}/bin + REQUIRED + OFF +) + +if(EXISTS ${CARGO_EXECUTABLE}) + if(CARGO_EXECUTABLE MATCHES "^${CARGO_HOME}") + setx(CARGO_HOME ${CARGO_HOME}) + setx(RUSTUP_HOME ${RUSTUP_HOME}) + endif() + + return() +endif() + +if(CMAKE_HOST_WIN32) + set(CARGO_INSTALL_COMMAND "choco install rust") +else() + set(CARGO_INSTALL_COMMAND "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh") +endif() + +message(FATAL_ERROR "Command not found: cargo\n" + "Do you have Rust installed? To fix this, try running:\n" + " ${CARGO_INSTALL_COMMAND}\n" +) diff --git a/cmake/tools/SetupWebKit.cmake b/cmake/tools/SetupWebKit.cmake new file mode 100644 index 0000000000..13868bd948 --- /dev/null +++ b/cmake/tools/SetupWebKit.cmake @@ -0,0 +1,98 @@ +option(WEBKIT_VERSION "The version of WebKit to use") +option(WEBKIT_LOCAL "If a local version of WebKit should be used instead of downloading") + +if(NOT WEBKIT_VERSION) + set(WEBKIT_VERSION 2be7f2f098210ce560f72ef95d93b008bc8eaaa1) +endif() + +string(SUBSTRING ${WEBKIT_VERSION} 0 16 WEBKIT_VERSION_PREFIX) + +if(WEBKIT_LOCAL) + set(DEFAULT_WEBKIT_PATH ${VENDOR_PATH}/WebKit/WebKitBuild/${CMAKE_BUILD_TYPE}) +else() + set(DEFAULT_WEBKIT_PATH ${CACHE_PATH}/webkit-${WEBKIT_VERSION_PREFIX}) +endif() + +option(WEBKIT_PATH "The path to the WebKit directory") + +if(NOT WEBKIT_PATH) + set(WEBKIT_PATH ${DEFAULT_WEBKIT_PATH}) +endif() + +set(WEBKIT_INCLUDE_PATH ${WEBKIT_PATH}/include) +set(WEBKIT_LIB_PATH ${WEBKIT_PATH}/lib) + +if(WEBKIT_LOCAL) + if(EXISTS ${WEBKIT_PATH}/cmakeconfig.h) + # You may need to run: + # make jsc-compile-debug jsc-copy-headers + include_directories( + ${WEBKIT_PATH} + ${WEBKIT_PATH}/JavaScriptCore/Headers/JavaScriptCore + ${WEBKIT_PATH}/JavaScriptCore/PrivateHeaders + ${WEBKIT_PATH}/bmalloc/Headers + ${WEBKIT_PATH}/WTF/Headers + ${WEBKIT_PATH}/JavaScriptCore/DerivedSources/inspector + ${WEBKIT_PATH}/JavaScriptCore/PrivateHeaders/JavaScriptCore + ) + endif() + + # After this point, only prebuilt WebKit is supported + return() +endif() + +if(EXISTS ${WEBKIT_PATH}/package.json) + file(READ ${WEBKIT_PATH}/package.json WEBKIT_PACKAGE_JSON) + + if(WEBKIT_PACKAGE_JSON MATCHES ${WEBKIT_VERSION}) + return() + endif() +endif() + +if(WIN32) + set(WEBKIT_OS "windows") +elseif(APPLE) + set(WEBKIT_OS "macos") +elseif(UNIX) + set(WEBKIT_OS "linux") +else() + message(FATAL_ERROR "Unsupported operating system: ${CMAKE_SYSTEM_NAME}") +endif() + +if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64") + set(WEBKIT_ARCH "arm64") +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|x64|AMD64") + set(WEBKIT_ARCH "amd64") +else() + message(FATAL_ERROR "Unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}") +endif() + +if(LINUX AND ABI STREQUAL "musl") + set(WEBKIT_SUFFIX "-musl") +endif() + +if(DEBUG) + set(WEBKIT_SUFFIX "${WEBKIT_SUFFIX}-debug") +elseif(ENABLE_LTO AND NOT WIN32) + set(WEBKIT_SUFFIX "${WEBKIT_SUFFIX}-lto") +else() + set(WEBKIT_SUFFIX "${WEBKIT_SUFFIX}") +endif() + +if(ENABLE_ASAN) + set(WEBKIT_SUFFIX "${WEBKIT_SUFFIX}-asan") +endif() + +set(WEBKIT_NAME bun-webkit-${WEBKIT_OS}-${WEBKIT_ARCH}${WEBKIT_SUFFIX}) +set(WEBKIT_FILENAME ${WEBKIT_NAME}.tar.gz) +setx(WEBKIT_DOWNLOAD_URL https://github.com/oven-sh/WebKit/releases/download/autobuild-${WEBKIT_VERSION}/${WEBKIT_FILENAME}) + +file(DOWNLOAD ${WEBKIT_DOWNLOAD_URL} ${CACHE_PATH}/${WEBKIT_FILENAME} SHOW_PROGRESS) +file(ARCHIVE_EXTRACT INPUT ${CACHE_PATH}/${WEBKIT_FILENAME} DESTINATION ${CACHE_PATH} TOUCH) +file(REMOVE ${CACHE_PATH}/${WEBKIT_FILENAME}) +file(REMOVE_RECURSE ${WEBKIT_PATH}) +file(RENAME ${CACHE_PATH}/bun-webkit ${WEBKIT_PATH}) + +if(APPLE) + file(REMOVE_RECURSE ${WEBKIT_INCLUDE_PATH}/unicode) +endif() diff --git a/cmake/tools/SetupZig.cmake b/cmake/tools/SetupZig.cmake new file mode 100644 index 0000000000..c64acc3425 --- /dev/null +++ b/cmake/tools/SetupZig.cmake @@ -0,0 +1,86 @@ +if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64") + set(DEFAULT_ZIG_ARCH "aarch64") +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|x64|AMD64") + set(DEFAULT_ZIG_ARCH "x86_64") +else() + unsupported(CMAKE_SYSTEM_PROCESSOR) +endif() + +if(APPLE) + set(DEFAULT_ZIG_TARGET ${DEFAULT_ZIG_ARCH}-macos-none) +elseif(WIN32) + set(DEFAULT_ZIG_TARGET ${DEFAULT_ZIG_ARCH}-windows-msvc) +elseif(LINUX) + if(ABI STREQUAL "musl") + set(DEFAULT_ZIG_TARGET ${DEFAULT_ZIG_ARCH}-linux-musl) + else() + set(DEFAULT_ZIG_TARGET ${DEFAULT_ZIG_ARCH}-linux-gnu) + endif() +else() + unsupported(CMAKE_SYSTEM_NAME) +endif() + +set(ZIG_COMMIT "bb9d6ab2c0bbbf20cc24dad03e88f3b3ffdb7de7") +optionx(ZIG_TARGET STRING "The zig target to use" DEFAULT ${DEFAULT_ZIG_TARGET}) + +if(CMAKE_BUILD_TYPE STREQUAL "Release") + set(DEFAULT_ZIG_OPTIMIZE "ReleaseFast") +elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") + set(DEFAULT_ZIG_OPTIMIZE "ReleaseSafe") +elseif(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") + set(DEFAULT_ZIG_OPTIMIZE "ReleaseSmall") +elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(DEFAULT_ZIG_OPTIMIZE "Debug") +else() + unsupported(CMAKE_BUILD_TYPE) +endif() + +# Since Bun 1.1, Windows has been built using ReleaseSafe. +# This is because it caught more crashes, but we can reconsider this in the future +if(WIN32 AND DEFAULT_ZIG_OPTIMIZE STREQUAL "ReleaseFast") + set(DEFAULT_ZIG_OPTIMIZE "ReleaseSafe") +endif() + +optionx(ZIG_OPTIMIZE "ReleaseFast|ReleaseSafe|ReleaseSmall|Debug" "The Zig optimize level to use" DEFAULT ${DEFAULT_ZIG_OPTIMIZE}) + +# To use LLVM bitcode from Zig, more work needs to be done. Currently, an install of +# LLVM 18.1.7 does not compatible with what bitcode Zig 0.13 outputs (has LLVM 18.1.7) +# Change to "bc" to experiment, "Invalid record" means it is not valid output. +optionx(ZIG_OBJECT_FORMAT "obj|bc" "Output file format for Zig object files" DEFAULT obj) + +optionx(ZIG_LOCAL_CACHE_DIR FILEPATH "The path to local the zig cache directory" DEFAULT ${CACHE_PATH}/zig/local) +optionx(ZIG_GLOBAL_CACHE_DIR FILEPATH "The path to the global zig cache directory" DEFAULT ${CACHE_PATH}/zig/global) + +setenv(ZIG_LOCAL_CACHE_DIR ${ZIG_LOCAL_CACHE_DIR}) +setenv(ZIG_GLOBAL_CACHE_DIR ${ZIG_GLOBAL_CACHE_DIR}) + +setx(ZIG_PATH ${VENDOR_PATH}/zig) + +if(WIN32) + setx(ZIG_EXECUTABLE ${ZIG_PATH}/zig.exe) +else() + setx(ZIG_EXECUTABLE ${ZIG_PATH}/zig) +endif() + +set(CMAKE_ZIG_FLAGS + --cache-dir ${ZIG_LOCAL_CACHE_DIR} + --global-cache-dir ${ZIG_GLOBAL_CACHE_DIR} + --zig-lib-dir ${ZIG_PATH}/lib +) + +register_command( + TARGET + clone-zig + COMMENT + "Downloading zig" + COMMAND + ${CMAKE_COMMAND} + -DZIG_PATH=${ZIG_PATH} + -DZIG_COMMIT=${ZIG_COMMIT} + -DENABLE_ASAN=${ENABLE_ASAN} + -P ${CWD}/cmake/scripts/DownloadZig.cmake + SOURCES + ${CWD}/cmake/scripts/DownloadZig.cmake + OUTPUTS + ${ZIG_EXECUTABLE} +) diff --git a/completions/bun.bash b/completions/bun.bash index ccabb1d73b..eabdc343fb 100644 --- a/completions/bun.bash +++ b/completions/bun.bash @@ -87,7 +87,7 @@ _bun_completions() { GLOBAL_OPTIONS[LONG_OPTIONS]="--use --cwd --bunfile --server-bunfile --config --disable-react-fast-refresh --disable-hmr --env-file --extension-order --jsx-factory --jsx-fragment --extension-order --jsx-factory --jsx-fragment --jsx-import-source --jsx-production --jsx-runtime --main-fields --no-summary --version --platform --public-dir --tsconfig-override --define --external --help --inject --loader --origin --port --dump-environment-variables --dump-limits --disable-bun-js"; GLOBAL_OPTIONS[SHORT_OPTIONS]="-c -v -d -e -h -i -l -u -p"; - PACKAGE_OPTIONS[ADD_OPTIONS_LONG]="--development --optional"; + PACKAGE_OPTIONS[ADD_OPTIONS_LONG]="--development --optional --peer"; PACKAGE_OPTIONS[ADD_OPTIONS_SHORT]="-d"; PACKAGE_OPTIONS[REMOVE_OPTIONS_LONG]=""; PACKAGE_OPTIONS[REMOVE_OPTIONS_SHORT]=""; diff --git a/completions/bun.fish b/completions/bun.fish index a5c51aef05..e262bb66da 100644 --- a/completions/bun.fish +++ b/completions/bun.fish @@ -33,7 +33,7 @@ function __fish__get_bun_bun_js_files end set -l bun_install_boolean_flags yarn production optional development no-save dry-run force no-cache silent verbose global -set -l bun_install_boolean_flags_descriptions "Write a yarn.lock file (yarn v1)" "Don't install devDependencies" "Add dependency to optionalDependencies" "Add dependency to devDependencies" "Don't install devDependencies" "Don't install anything" "Always request the latest versions from the registry & reinstall all dependencies" "Ignore manifest cache entirely" "Don't output anything" "Excessively verbose logging" "Use global folder" +set -l bun_install_boolean_flags_descriptions "Write a yarn.lock file (yarn v1)" "Don't install devDependencies" "Add dependency to optionalDependencies" "Add dependency to devDependencies" "Don't update package.json or save a lockfile" "Don't install anything" "Always request the latest versions from the registry & reinstall all dependencies" "Ignore manifest cache entirely" "Don't output anything" "Excessively verbose logging" "Use global folder" set -l bun_builtin_cmds_without_run dev create help bun upgrade discord install remove add init pm x set -l bun_builtin_cmds_accepting_flags create help bun upgrade discord run init link unlink pm x @@ -183,3 +183,4 @@ complete -c bun -n "__fish_use_subcommand" -a "unlink" -d "Unregister a local np complete -c bun -n "__fish_use_subcommand" -a "pm" -d "Additional package management utilities" -f complete -c bun -n "__fish_use_subcommand" -a "x" -d "Execute a package binary, installing if needed" -f complete -c bun -n "__fish_use_subcommand" -a "outdated" -d "Display the latest versions of outdated dependencies" -f +complete -c bun -n "__fish_use_subcommand" -a "publish" -d "Publish your package from local to npm" -f diff --git a/completions/bun.zsh b/completions/bun.zsh index d75f2aa2f0..f885ac03ad 100644 --- a/completions/bun.zsh +++ b/completions/bun.zsh @@ -35,6 +35,7 @@ _bun_add_completion() { '-D[]' \ '--development[]' \ '--optional[Add dependency to "optionalDependencies]' \ + '--peer[Add dependency to "peerDependencies]' \ '--exact[Add the exact version instead of the ^range]' && ret=0 @@ -339,6 +340,7 @@ _bun_install_completion() { '--development[]' \ '-D[]' \ '--optional[Add dependency to "optionalDependencies]' \ + '--peer[Add dependency to "peerDependencies]' \ '--exact[Add the exact version instead of the ^range]' && ret=0 @@ -671,7 +673,7 @@ _bun() { cmd) local -a scripts_list IFS=$'\n' scripts_list=($(SHELL=zsh bun getcompletes i)) - scripts="scripts:scripts:(($scripts_list))" + scripts="scripts:scripts:((${scripts_list//:/\\\\:}))" IFS=$'\n' files_list=($(SHELL=zsh bun getcompletes j)) main_commands=( @@ -871,8 +873,8 @@ _bun_run_param_script_completion() { IFS=$'\n' scripts_list=($(SHELL=zsh bun getcompletes s)) IFS=$'\n' bins=($(SHELL=zsh bun getcompletes b)) - _alternative "scripts:scripts:(($scripts_list))" - _alternative "bin:bin:(($bins))" + _alternative "scripts:scripts:((${scripts_list//:/\\\\:}))" + _alternative "bin:bin:((${bins//:/\\\\:}))" _alternative "files:file:_files -g '*.(js|ts|jsx|tsx|wasm)'" } diff --git a/dockerhub/alpine/Dockerfile b/dockerhub/alpine/Dockerfile index e2bbba7aa4..8d1ecbaddd 100644 --- a/dockerhub/alpine/Dockerfile +++ b/dockerhub/alpine/Dockerfile @@ -1,30 +1,13 @@ -FROM alpine:3.18 AS build +FROM alpine:3.20 AS build # https://github.com/oven-sh/bun/releases ARG BUN_VERSION=latest -# TODO: Instead of downloading glibc from a third-party source, we should -# build it from source. This is a temporary solution. -# See: https://github.com/sgerrand/alpine-pkg-glibc - -# https://github.com/sgerrand/alpine-pkg-glibc/releases -# https://github.com/sgerrand/alpine-pkg-glibc/issues/176 -ARG GLIBC_VERSION=2.34-r0 - -# https://github.com/oven-sh/bun/issues/5545#issuecomment-1722461083 -ARG GLIBC_VERSION_AARCH64=2.26-r1 - -RUN apk --no-cache add \ - ca-certificates \ - curl \ - dirmngr \ - gpg \ - gpg-agent \ - unzip \ +RUN apk --no-cache add ca-certificates curl dirmngr gpg gpg-agent unzip \ && arch="$(apk --print-arch)" \ && case "${arch##*-}" in \ - x86_64) build="x64-baseline";; \ - aarch64) build="aarch64";; \ + x86_64) build="x64-musl-baseline";; \ + aarch64) build="aarch64-musl";; \ *) echo "error: unsupported architecture: $arch"; exit 1 ;; \ esac \ && version="$BUN_VERSION" \ @@ -59,37 +42,9 @@ RUN apk --no-cache add \ && unzip "bun-linux-$build.zip" \ && mv "bun-linux-$build/bun" /usr/local/bin/bun \ && rm -f "bun-linux-$build.zip" SHASUMS256.txt.asc SHASUMS256.txt \ - && chmod +x /usr/local/bin/bun \ - && cd /tmp \ - && case "${arch##*-}" in \ - x86_64) curl "https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/glibc-${GLIBC_VERSION}.apk" \ - -fsSLO \ - --compressed \ - --retry 5 \ - || (echo "error: failed to download: glibc v${GLIBC_VERSION}" && exit 1) \ - && mv "glibc-${GLIBC_VERSION}.apk" glibc.apk \ - && curl "https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/glibc-bin-${GLIBC_VERSION}.apk" \ - -fsSLO \ - --compressed \ - --retry 5 \ - || (echo "error: failed to download: glibc-bin v${GLIBC_VERSION}" && exit 1) \ - && mv "glibc-bin-${GLIBC_VERSION}.apk" glibc-bin.apk ;; \ - aarch64) curl "https://raw.githubusercontent.com/squishyu/alpine-pkg-glibc-aarch64-bin/master/glibc-${GLIBC_VERSION_AARCH64}.apk" \ - -fsSLO \ - --compressed \ - --retry 5 \ - || (echo "error: failed to download: glibc v${GLIBC_VERSION_AARCH64}" && exit 1) \ - && mv "glibc-${GLIBC_VERSION_AARCH64}.apk" glibc.apk \ - && curl "https://raw.githubusercontent.com/squishyu/alpine-pkg-glibc-aarch64-bin/master/glibc-bin-${GLIBC_VERSION_AARCH64}.apk" \ - -fsSLO \ - --compressed \ - --retry 5 \ - || (echo "error: failed to download: glibc-bin v${GLIBC_VERSION_AARCH64}" && exit 1) \ - && mv "glibc-bin-${GLIBC_VERSION_AARCH64}.apk" glibc-bin.apk ;; \ - *) echo "error: unsupported architecture '$arch'"; exit 1 ;; \ - esac + && chmod +x /usr/local/bin/bun -FROM alpine:3.18 +FROM alpine:3.20 # Disable the runtime transpiler cache by default inside Docker containers. # On ephemeral containers, the cache is not useful @@ -102,15 +57,15 @@ ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN} COPY --from=build /usr/local/bin/bun /usr/local/bin/ COPY docker-entrypoint.sh /usr/local/bin/ +RUN mkdir -p /usr/local/bun-node-fallback-bin && ln -s /usr/local/bin/bun /usr/local/bun-node-fallback-bin/node +ENV PATH "${PATH}:/usr/local/bun-node-fallback-bin" # Temporarily use the `build`-stage /tmp folder to access the glibc APKs: RUN --mount=type=bind,from=build,source=/tmp,target=/tmp \ addgroup -g 1000 bun \ && adduser -u 1000 -G bun -s /bin/sh -D bun \ - && apk --no-cache --force-overwrite --allow-untrusted add \ - /tmp/glibc.apk \ - /tmp/glibc-bin.apk \ && ln -s /usr/local/bin/bun /usr/local/bin/bunx \ + && apk add libgcc libstdc++ \ && which bun \ && which bunx \ && bun --version diff --git a/dockerhub/debian-slim/Dockerfile b/dockerhub/debian-slim/Dockerfile index a5547010fb..80f3d1dff0 100644 --- a/dockerhub/debian-slim/Dockerfile +++ b/dockerhub/debian-slim/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bullseye-slim AS build +FROM debian:bookworm-slim AS build # https://github.com/oven-sh/bun/releases ARG BUN_VERSION=latest @@ -68,6 +68,8 @@ ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN} COPY docker-entrypoint.sh /usr/local/bin COPY --from=build /usr/local/bin/bun /usr/local/bin/bun +RUN mkdir -p /usr/local/bun-node-fallback-bin && ln -s /usr/local/bin/bun /usr/local/bun-node-fallback-bin/node +ENV PATH "${PATH}:/usr/local/bun-node-fallback-bin" RUN groupadd bun \ --gid 1000 \ diff --git a/dockerhub/debian/Dockerfile b/dockerhub/debian/Dockerfile index 7a92d5767f..7ffec1efe5 100644 --- a/dockerhub/debian/Dockerfile +++ b/dockerhub/debian/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bullseye-slim AS build +FROM debian:bookworm-slim AS build # https://github.com/oven-sh/bun/releases ARG BUN_VERSION=latest @@ -60,6 +60,8 @@ FROM debian:bullseye COPY docker-entrypoint.sh /usr/local/bin COPY --from=build /usr/local/bin/bun /usr/local/bin/bun +RUN mkdir -p /usr/local/bun-node-fallback-bin && ln -s /usr/local/bin/bun /usr/local/bun-node-fallback-bin/node +ENV PATH "${PATH}:/usr/local/bun-node-fallback-bin" # Disable the runtime transpiler cache by default inside Docker containers. # On ephemeral containers, the cache is not useful diff --git a/dockerhub/distroless/Dockerfile b/dockerhub/distroless/Dockerfile index a30f9330c4..32c8a0f99a 100644 --- a/dockerhub/distroless/Dockerfile +++ b/dockerhub/distroless/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bullseye-slim AS build +FROM debian:bookworm-slim AS build # https://github.com/oven-sh/bun/releases ARG BUN_VERSION=latest @@ -67,12 +67,18 @@ ARG BUN_INSTALL_BIN=/usr/local/bin ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN} COPY --from=build /usr/local/bin/bun /usr/local/bin/ +ENV PATH "${PATH}:/usr/local/bun-node-fallback-bin" # Temporarily use the `build`-stage image binaries to create a symlink: RUN --mount=type=bind,from=build,source=/usr/bin,target=/usr/bin \ - --mount=type=bind,from=build,source=/bin,target=/bin < hello +await blob.bytes(); // => Uint8Array (copies contents) await blob.arrayBuffer(); // => ArrayBuffer (copies contents) await blob.stream(); // => ReadableStream ``` @@ -511,7 +522,7 @@ for await (const chunk of stream) { } ``` -For a more complete discussion of streams in Bun, see [API > Streams](/docs/api/streams). +For a more complete discussion of streams in Bun, see [API > Streams](https://bun.sh/docs/api/streams). ## Conversion @@ -545,6 +556,7 @@ Buffer.from(buf, 0, 10); #### To `string` +As UTF-8: ```ts new TextDecoder().decode(buf); ``` @@ -625,6 +637,7 @@ Buffer.from(arr); #### To `string` +As UTF-8: ```ts new TextDecoder().decode(arr); ``` @@ -638,6 +651,7 @@ Array.from(arr); #### To `Blob` ```ts +// only if arr is a view of its entire backing TypedArray new Blob([arr.buffer], { type: "text/plain" }); ``` @@ -701,6 +715,7 @@ Buffer.from(view.buffer, view.byteOffset, view.byteLength); #### To `string` +As UTF-8: ```ts new TextDecoder().decode(view); ``` @@ -772,9 +787,18 @@ new DataView(buf.buffer, buf.byteOffset, buf.byteLength); #### To `string` +As UTF-8: ```ts buf.toString(); ``` +As base64: +```ts +buf.toString('base64'); +``` +As hex: +```ts +buf.toString('hex'); +``` #### To `number[]` @@ -834,7 +858,7 @@ await blob.arrayBuffer(); #### To `TypedArray` ```ts -new Uint8Array(await blob.arrayBuffer()); +await blob.bytes(); ``` #### To `DataView` @@ -851,6 +875,7 @@ Buffer.from(await blob.arrayBuffer()); #### To `string` +As UTF-8: ```ts await blob.text(); ``` @@ -858,7 +883,7 @@ await blob.text(); #### To `number[]` ```ts -Array.from(new Uint8Array(await blob.arrayBuffer())); +Array.from(await blob.bytes()); ``` #### To `ReadableStream` @@ -936,9 +961,10 @@ Buffer.from(Bun.readableStreamToArrayBuffer(stream)); #### To `string` +As UTF-8: ```ts // with Response -new Response(stream).text(); +await new Response(stream).text(); // with Bun function await Bun.readableStreamToText(stream); @@ -948,8 +974,8 @@ await Bun.readableStreamToText(stream); ```ts // with Response -const buf = await new Response(stream).arrayBuffer(); -Array.from(new Uint8Array(buf)); +const arr = await new Response(stream).bytes(); +Array.from(arr); // with Bun function Array.from(new Uint8Array(Bun.readableStreamToArrayBuffer(stream))); diff --git a/docs/api/cc.md b/docs/api/cc.md new file mode 100644 index 0000000000..0cdf0b0a75 --- /dev/null +++ b/docs/api/cc.md @@ -0,0 +1,197 @@ +`bun:ffi` has experimental support for compiling and running C from JavaScript with low overhead. + +## Usage (cc in `bun:ffi`) + +See the [introduction blog post](https://bun.sh/blog/compile-and-run-c-in-js) for more information. + +JavaScript: + +```ts#hello.js +import { cc } from "bun:ffi"; +import source from "./hello.c" with { type: "file" }; + +const { + symbols: { hello }, +} = cc({ + source, + symbols: { + hello: { + args: [], + returns: "int", + }, + }, +}); + +console.log("What is the answer to the universe?", hello()); +``` + +C source: + +```c#hello.c +int hello() { + return 42; +} +``` + +When you run `hello.js`, it will print: + +```sh +$ bun hello.js +What is the answer to the universe? 42 +``` + +Under the hood, `cc` uses [TinyCC](https://bellard.org/tcc/) to compile the C code and then link it with the JavaScript runtime, efficiently converting types in-place. + +### Primitive types + +The same `FFIType` values in [`dlopen`](/docs/api/ffi) are supported in `cc`. + +| `FFIType` | C Type | Aliases | +| ---------- | -------------- | --------------------------- | +| cstring | `char*` | | +| function | `(void*)(*)()` | `fn`, `callback` | +| ptr | `void*` | `pointer`, `void*`, `char*` | +| i8 | `int8_t` | `int8_t` | +| i16 | `int16_t` | `int16_t` | +| i32 | `int32_t` | `int32_t`, `int` | +| i64 | `int64_t` | `int64_t` | +| i64_fast | `int64_t` | | +| u8 | `uint8_t` | `uint8_t` | +| u16 | `uint16_t` | `uint16_t` | +| u32 | `uint32_t` | `uint32_t` | +| u64 | `uint64_t` | `uint64_t` | +| u64_fast | `uint64_t` | | +| f32 | `float` | `float` | +| f64 | `double` | `double` | +| bool | `bool` | | +| char | `char` | | +| napi_env | `napi_env` | | +| napi_value | `napi_value` | | + +### Strings, objects, and non-primitive types + +To make it easier to work with strings, objects, and other non-primitive types that don't map 1:1 to C types, `cc` supports N-API. + +To pass or receive a JavaScript values without any type conversions from a C function, you can use `napi_value`. + +You can also pass a `napi_env` to receive the N-API environment used to call the JavaScript function. + +#### Returning a C string to JavaScript + +For example, if you have a string in C, you can return it to JavaScript like this: + +```ts#hello.js +import { cc } from "bun:ffi"; +import source from "./hello.c" with { type: "file" }; + +const { + symbols: { hello }, +} = cc({ + source, + symbols: { + hello: { + args: ["napi_env"], + returns: "napi_value", + }, + }, +}); + +const result = hello(); +``` + +And in C: + +```c#hello.c +#include + +napi_value hello(napi_env env) { + napi_value result; + napi_create_string_utf8(env, "Hello, Napi!", NAPI_AUTO_LENGTH, &result); + return result; +} +``` + +You can also use this to return other types like objects and arrays: + +```c#hello.c +#include + +napi_value hello(napi_env env) { + napi_value result; + napi_create_object(env, &result); + return result; +} +``` + +### `cc` Reference + +#### `library: string[]` + +The `library` array is used to specify the libraries that should be linked with the C code. + +```ts +type Library = string[]; + +cc({ + source: "hello.c", + library: ["sqlite3"], +}); +``` + +#### `symbols` + +The `symbols` object is used to specify the functions and variables that should be exposed to JavaScript. + +```ts +type Symbols = { + [key: string]: { + args: FFIType[]; + returns: FFIType; + }; +}; +``` + +#### `source` + +The `source` is a file path to the C code that should be compiled and linked with the JavaScript runtime. + +```ts +type Source = string | URL | BunFile; + +cc({ + source: "hello.c", + symbols: { + hello: { + args: [], + returns: "int", + }, + }, +}); +``` + +#### `flags: string | string[]` + +The `flags` is an optional array of strings that should be passed to the TinyCC compiler. + +```ts +type Flags = string | string[]; +``` + +These are flags like `-I` for include directories and `-D` for preprocessor definitions. + +#### `define: Record` + +The `define` is an optional object that should be passed to the TinyCC compiler. + +```ts +type Defines = Record; + +cc({ + source: "hello.c", + define: { + "NDEBUG": "1", + }, +}); +``` + +These are preprocessor definitions passed to the TinyCC compiler. diff --git a/docs/api/color.md b/docs/api/color.md new file mode 100644 index 0000000000..da27adc625 --- /dev/null +++ b/docs/api/color.md @@ -0,0 +1,262 @@ +`Bun.color(input, outputFormat?)` leverages Bun's CSS parser to parse, normalize, and convert colors from user input to a variety of output formats, including: + +| Format | Example | +| ------------ | -------------------------------- | +| `"css"` | `"red"` | +| `"ansi"` | `"\x1b[38;2;255;0;0m"` | +| `"ansi-16"` | `"\x1b[38;5;\tm"` | +| `"ansi-256"` | `"\x1b[38;5;196m"` | +| `"ansi-16m"` | `"\x1b[38;2;255;0;0m"` | +| `"number"` | `0x1a2b3c` | +| `"rgb"` | `"rgb(255, 99, 71)"` | +| `"rgba"` | `"rgba(255, 99, 71, 0.5)"` | +| `"hsl"` | `"hsl(120, 50%, 50%)"` | +| `"hex"` | `"#1a2b3c"` | +| `"HEX"` | `"#1A2B3C"` | +| `"{rgb}"` | `{ r: 255, g: 99, b: 71 }` | +| `"{rgba}"` | `{ r: 255, g: 99, b: 71, a: 1 }` | +| `"[rgb]"` | `[ 255, 99, 71 ]` | +| `"[rgba]"` | `[ 255, 99, 71, 255]` | + +There are many different ways to use this API: + +- Validate and normalize colors to persist in a database (`number` is the most database-friendly) +- Convert colors to different formats +- Colorful logging beyond the 16 colors many use today (use `ansi` if you don't want to figure out what the user's terminal supports, otherwise use `ansi-16`, `ansi-256`, or `ansi-16m` for how many colors the terminal supports) +- Format colors for use in CSS injected into HTML +- Get the `r`, `g`, `b`, and `a` color components as JavaScript objects or numbers from a CSS color string + +You can think of this as an alternative to the popular npm packages [`color`](https://github.com/Qix-/color) and [`tinycolor2`](https://github.com/bgrins/TinyColor) except with full support for parsing CSS color strings and zero dependencies built directly into Bun. + +### Flexible input + +You can pass in any of the following: + +- Standard CSS color names like `"red"` +- Numbers like `0xff0000` +- Hex strings like `"#f00"` +- RGB strings like `"rgb(255, 0, 0)"` +- RGBA strings like `"rgba(255, 0, 0, 1)"` +- HSL strings like `"hsl(0, 100%, 50%)"` +- HSLA strings like `"hsla(0, 100%, 50%, 1)"` +- RGB objects like `{ r: 255, g: 0, b: 0 }` +- RGBA objects like `{ r: 255, g: 0, b: 0, a: 1 }` +- RGB arrays like `[255, 0, 0]` +- RGBA arrays like `[255, 0, 0, 255]` +- LAB strings like `"lab(50% 50% 50%)"` +- ... anything else that CSS can parse as a single color value + +### Format colors as CSS + +The `"css"` format outputs valid CSS for use in stylesheets, inline styles, CSS variables, css-in-js, etc. It returns the most compact representation of the color as a string. + +```ts +Bun.color("red", "css"); // "red" +Bun.color(0xff0000, "css"); // "#f000" +Bun.color("#f00", "css"); // "red" +Bun.color("#ff0000", "css"); // "red" +Bun.color("rgb(255, 0, 0)", "css"); // "red" +Bun.color("rgba(255, 0, 0, 1)", "css"); // "red" +Bun.color("hsl(0, 100%, 50%)", "css"); // "red" +Bun.color("hsla(0, 100%, 50%, 1)", "css"); // "red" +Bun.color({ r: 255, g: 0, b: 0 }, "css"); // "red" +Bun.color({ r: 255, g: 0, b: 0, a: 1 }, "css"); // "red" +Bun.color([255, 0, 0], "css"); // "red" +Bun.color([255, 0, 0, 255], "css"); // "red" +``` + +If the input is unknown or fails to parse, `Bun.color` returns `null`. + +### Format colors as ANSI (for terminals) + +The `"ansi"` format outputs ANSI escape codes for use in terminals to make text colorful. + +```ts +Bun.color("red", "ansi"); // "\u001b[38;2;255;0;0m" +Bun.color(0xff0000, "ansi"); // "\u001b[38;2;255;0;0m" +Bun.color("#f00", "ansi"); // "\u001b[38;2;255;0;0m" +Bun.color("#ff0000", "ansi"); // "\u001b[38;2;255;0;0m" +Bun.color("rgb(255, 0, 0)", "ansi"); // "\u001b[38;2;255;0;0m" +Bun.color("rgba(255, 0, 0, 1)", "ansi"); // "\u001b[38;2;255;0;0m" +Bun.color("hsl(0, 100%, 50%)", "ansi"); // "\u001b[38;2;255;0;0m" +Bun.color("hsla(0, 100%, 50%, 1)", "ansi"); // "\u001b[38;2;255;0;0m" +Bun.color({ r: 255, g: 0, b: 0 }, "ansi"); // "\u001b[38;2;255;0;0m" +Bun.color({ r: 255, g: 0, b: 0, a: 1 }, "ansi"); // "\u001b[38;2;255;0;0m" +Bun.color([255, 0, 0], "ansi"); // "\u001b[38;2;255;0;0m" +Bun.color([255, 0, 0, 255], "ansi"); // "\u001b[38;2;255;0;0m" +``` + +This gets the color depth of stdout and automatically chooses one of `"ansi-16m"`, `"ansi-256"`, `"ansi-16"` based on the environment variables. If stdout doesn't support any form of ANSI color, it returns an empty string. As with the rest of Bun's color API, if the input is unknown or fails to parse, it returns `null`. + +#### 24-bit ANSI colors (`ansi-16m`) + +The `"ansi-16m"` format outputs 24-bit ANSI colors for use in terminals to make text colorful. 24-bit color means you can display 16 million colors on supported terminals, and requires a modern terminal that supports it. + +This converts the input color to RGBA, and then outputs that as an ANSI color. + +```ts +Bun.color("red", "ansi-16m"); // "\x1b[38;2;255;0;0m" +Bun.color(0xff0000, "ansi-16m"); // "\x1b[38;2;255;0;0m" +Bun.color("#f00", "ansi-16m"); // "\x1b[38;2;255;0;0m" +Bun.color("#ff0000", "ansi-16m"); // "\x1b[38;2;255;0;0m" +``` + +#### 256 ANSI colors (`ansi-256`) + +The `"ansi-256"` format approximates the input color to the nearest of the 256 ANSI colors supported by some terminals. + +```ts +Bun.color("red", "ansi-256"); // "\u001b[38;5;196m" +Bun.color(0xff0000, "ansi-256"); // "\u001b[38;5;196m" +Bun.color("#f00", "ansi-256"); // "\u001b[38;5;196m" +Bun.color("#ff0000", "ansi-256"); // "\u001b[38;5;196m" +``` + +To convert from RGBA to one of the 256 ANSI colors, we ported the algorithm that [`tmux` uses](https://github.com/tmux/tmux/blob/dae2868d1227b95fd076fb4a5efa6256c7245943/colour.c#L44-L55). + +#### 16 ANSI colors (`ansi-16`) + +The `"ansi-16"` format approximates the input color to the nearest of the 16 ANSI colors supported by most terminals. + +```ts +Bun.color("red", "ansi-16"); // "\u001b[38;5;\tm" +Bun.color(0xff0000, "ansi-16"); // "\u001b[38;5;\tm" +Bun.color("#f00", "ansi-16"); // "\u001b[38;5;\tm" +Bun.color("#ff0000", "ansi-16"); // "\u001b[38;5;\tm" +``` + +This works by first converting the input to a 24-bit RGB color space, then to `ansi-256`, and then we convert that to the nearest 16 ANSI color. + +### Format colors as numbers + +The `"number"` format outputs a 24-bit number for use in databases, configuration, or any other use case where a compact representation of the color is desired. + +```ts +Bun.color("red", "number"); // 16711680 +Bun.color(0xff0000, "number"); // 16711680 +Bun.color({ r: 255, g: 0, b: 0 }, "number"); // 16711680 +Bun.color([255, 0, 0], "number"); // 16711680 +Bun.color("rgb(255, 0, 0)", "number"); // 16711680 +Bun.color("rgba(255, 0, 0, 1)", "number"); // 16711680 +Bun.color("hsl(0, 100%, 50%)", "number"); // 16711680 +Bun.color("hsla(0, 100%, 50%, 1)", "number"); // 16711680 +``` + +### Get the red, green, blue, and alpha channels + +You can use the `"{rgba}"`, `"{rgb}"`, `"[rgba]"` and `"[rgb]"` formats to get the red, green, blue, and alpha channels as objects or arrays. + +#### `{rgba}` object + +The `"{rgba}"` format outputs an object with the red, green, blue, and alpha channels. + +```ts +type RGBAObject = { + // 0 - 255 + r: number; + // 0 - 255 + g: number; + // 0 - 255 + b: number; + // 0 - 1 + a: number; +}; +``` + +Example: + +```ts +Bun.color("hsl(0, 0%, 50%)", "{rgba}"); // { r: 128, g: 128, b: 128, a: 1 } +Bun.color("red", "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 } +Bun.color(0xff0000, "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 } +Bun.color({ r: 255, g: 0, b: 0 }, "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 } +Bun.color([255, 0, 0], "{rgba}"); // { r: 255, g: 0, b: 0, a: 1 } +``` + +To behave similarly to CSS, the `a` channel is a decimal number between `0` and `1`. + +The `"{rgb}"` format is similar, but it doesn't include the alpha channel. + +```ts +Bun.color("hsl(0, 0%, 50%)", "{rgb}"); // { r: 128, g: 128, b: 128 } +Bun.color("red", "{rgb}"); // { r: 255, g: 0, b: 0 } +Bun.color(0xff0000, "{rgb}"); // { r: 255, g: 0, b: 0 } +Bun.color({ r: 255, g: 0, b: 0 }, "{rgb}"); // { r: 255, g: 0, b: 0 } +Bun.color([255, 0, 0], "{rgb}"); // { r: 255, g: 0, b: 0 } +``` + +#### `[rgba]` array + +The `"[rgba]"` format outputs an array with the red, green, blue, and alpha channels. + +```ts +// All values are 0 - 255 +type RGBAArray = [number, number, number, number]; +``` + +Example: + +```ts +Bun.color("hsl(0, 0%, 50%)", "[rgba]"); // [128, 128, 128, 255] +Bun.color("red", "[rgba]"); // [255, 0, 0, 255] +Bun.color(0xff0000, "[rgba]"); // [255, 0, 0, 255] +Bun.color({ r: 255, g: 0, b: 0 }, "[rgba]"); // [255, 0, 0, 255] +Bun.color([255, 0, 0], "[rgba]"); // [255, 0, 0, 255] +``` + +Unlike the `"{rgba}"` format, the alpha channel is an integer between `0` and `255`. This is useful for typed arrays where each channel must be the same underlying type. + +The `"[rgb]"` format is similar, but it doesn't include the alpha channel. + +```ts +Bun.color("hsl(0, 0%, 50%)", "[rgb]"); // [128, 128, 128] +Bun.color("red", "[rgb]"); // [255, 0, 0] +Bun.color(0xff0000, "[rgb]"); // [255, 0, 0] +Bun.color({ r: 255, g: 0, b: 0 }, "[rgb]"); // [255, 0, 0] +Bun.color([255, 0, 0], "[rgb]"); // [255, 0, 0] +``` + +### Format colors as hex strings + +The `"hex"` format outputs a lowercase hex string for use in CSS or other contexts. + +```ts +Bun.color("hsl(0, 0%, 50%)", "hex"); // "#808080" +Bun.color("red", "hex"); // "#ff0000" +Bun.color(0xff0000, "hex"); // "#ff0000" +Bun.color({ r: 255, g: 0, b: 0 }, "hex"); // "#ff0000" +Bun.color([255, 0, 0], "hex"); // "#ff0000" +``` + +The `"HEX"` format is similar, but it outputs a hex string with uppercase letters instead of lowercase letters. + +```ts +Bun.color("hsl(0, 0%, 50%)", "HEX"); // "#808080" +Bun.color("red", "HEX"); // "#FF0000" +Bun.color(0xff0000, "HEX"); // "#FF0000" +Bun.color({ r: 255, g: 0, b: 0 }, "HEX"); // "#FF0000" +Bun.color([255, 0, 0], "HEX"); // "#FF0000" +``` + +### Bundle-time client-side color formatting + +Like many of Bun's APIs, you can use macros to invoke `Bun.color` at bundle-time for use in client-side JavaScript builds: + +```ts#client-side.ts +import { color } from "bun" with { type: "macro" }; + +console.log(color("#f00", "css")); +``` + +Then, build the client-side code: + +```sh +bun build ./client-side.ts +``` + +This will output the following to `client-side.js`: + +```js +// client-side.ts +console.log("red"); +``` diff --git a/docs/api/dns.md b/docs/api/dns.md index bdc6c83e86..4553263fab 100644 --- a/docs/api/dns.md +++ b/docs/api/dns.md @@ -14,7 +14,7 @@ In Bun v1.1.9, we added support for DNS caching. This cache makes repeated conne At the time of writing, we cache up to 255 entries for a maximum of 30 seconds (each). If any connections to a host fail, we remove the entry from the cache. When multiple connections are made to the same host simultaneously, DNS lookups are deduplicated to avoid making multiple requests for the same host. -This cache is automatically used by; +This cache is automatically used by: - `bun install` - `fetch()` @@ -99,7 +99,7 @@ console.log(stats); ### Configuring DNS cache TTL -Bun defaults to 30 seconds for the TTL of DNS cache entries. To change this, you can set the envionrment variable `$BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS`. For example, to set the TTL to 5 seconds: +Bun defaults to 30 seconds for the TTL of DNS cache entries. To change this, you can set the environment variable `$BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS`. For example, to set the TTL to 5 seconds: ```sh BUN_CONFIG_DNS_TIME_TO_LIVE_SECONDS=5 bun run my-script.ts diff --git a/docs/api/fetch.md b/docs/api/fetch.md index dd20e45ac6..80aaecc46c 100644 --- a/docs/api/fetch.md +++ b/docs/api/fetch.md @@ -111,6 +111,38 @@ const reader = stream.getReader(); const { value, done } = await reader.read(); ``` +### Streaming request bodies + +You can also stream data in request bodies using a `ReadableStream`: + +```ts +const stream = new ReadableStream({ + start(controller) { + controller.enqueue("Hello"); + controller.enqueue(" "); + controller.enqueue("World"); + controller.close(); + }, +}); + +const response = await fetch("http://example.com", { + method: "POST", + body: stream, +}); +``` + +When using streams with HTTP(S): + +- The data is streamed directly to the network without buffering the entire body in memory +- If the connection is lost, the stream will be canceled +- The `Content-Length` header is not automatically set unless the stream has a known size + +When using streams with S3: + +- For PUT/POST requests, Bun automatically uses multipart upload +- The stream is consumed in chunks and uploaded in parallel +- Progress can be monitored through the S3 options + ### Fetching a URL with a timeout To fetch a URL with a timeout, use `AbortSignal.timeout`: @@ -172,7 +204,7 @@ To customize the TLS validation, use the `checkServerIdentity` option in `tls` await fetch("https://example.com", { tls: { checkServerIdentity: (hostname, peerCertificate) => { - // Return an error if the certificate is invalid + // Return an Error if the certificate is invalid }, }, }); @@ -180,6 +212,116 @@ await fetch("https://example.com", { This is similar to how it works in Node's `net` module. +#### Disable TLS validation + +To disable TLS validation, set `rejectUnauthorized` to `false`: + +```ts +await fetch("https://example.com", { + tls: { + rejectUnauthorized: false, + }, +}); +``` + +This is especially useful to avoid SSL errors when using self-signed certificates, but this disables TLS validation and should be used with caution. + +### Request options + +In addition to the standard fetch options, Bun provides several extensions: + +```ts +const response = await fetch("http://example.com", { + // Control automatic response decompression (default: true) + decompress: true, + + // Disable connection reuse for this request + keepalive: false, + + // Debug logging level + verbose: true, // or "curl" for more detailed output +}); +``` + +### Protocol support + +Beyond HTTP(S), Bun's fetch supports several additional protocols: + +#### S3 URLs - `s3://` + +Bun supports fetching from S3 buckets directly. + +```ts +// Using environment variables for credentials +const response = await fetch("s3://my-bucket/path/to/object"); + +// Or passing credentials explicitly +const response = await fetch("s3://my-bucket/path/to/object", { + s3: { + accessKeyId: "YOUR_ACCESS_KEY", + secretAccessKey: "YOUR_SECRET_KEY", + region: "us-east-1", + }, +}); +``` + +Note: Only PUT and POST methods support request bodies when using S3. For uploads, Bun automatically uses multipart upload for streaming bodies. + +You can read more about Bun's S3 support in the [S3](https://bun.sh/docs/api/s3) documentation. + +#### File URLs - `file://` + +You can fetch local files using the `file:` protocol: + +```ts +const response = await fetch("file:///path/to/file.txt"); +const text = await response.text(); +``` + +On Windows, paths are automatically normalized: + +```ts +// Both work on Windows +const response = await fetch("file:///C:/path/to/file.txt"); +const response2 = await fetch("file:///c:/path\\to/file.txt"); +``` + +#### Data URLs - `data:` + +Bun supports the `data:` URL scheme: + +```ts +const response = await fetch("data:text/plain;base64,SGVsbG8sIFdvcmxkIQ=="); +const text = await response.text(); // "Hello, World!" +``` + +#### Blob URLs - `blob:` + +You can fetch blobs using URLs created by `URL.createObjectURL()`: + +```ts +const blob = new Blob(["Hello, World!"], { type: "text/plain" }); +const url = URL.createObjectURL(blob); +const response = await fetch(url); +``` + +### Error handling + +Bun's fetch implementation includes several specific error cases: + +- Using a request body with GET/HEAD methods will throw an error (which is expected for the fetch API) +- Attempting to use both `proxy` and `unix` options together will throw an error +- TLS certificate validation failures when `rejectUnauthorized` is true (or undefined) +- S3 operations may throw specific errors related to authentication or permissions + +### Content-Type handling + +Bun automatically sets the `Content-Type` header for request bodies when not explicitly provided: + +- For `Blob` objects, uses the blob's `type` +- For `FormData`, sets appropriate multipart boundary +- For JSON objects, sets `application/json` + ## Debugging To help with debugging, you can pass `verbose: true` to `fetch`: @@ -195,7 +337,7 @@ This will print the request and response headers to your terminal: ```sh [fetch] > HTTP/1.1 GET http://example.com/ [fetch] > Connection: keep-alive -[fetch] > User-Agent: Bun/1.1.21 +[fetch] > User-Agent: Bun/$BUN_LATEST_VERSION [fetch] > Accept: */* [fetch] > Host: example.com [fetch] > Accept-Encoding: gzip, deflate, br @@ -234,14 +376,14 @@ To prefetch a DNS entry, you can use the `dns.prefetch` API. This API is useful ```ts import { dns } from "bun"; -dns.prefetch("bun.sh", 443); +dns.prefetch("bun.sh"); ``` #### DNS caching By default, Bun caches and deduplicates DNS queries in-memory for up to 30 seconds. You can see the cache stats by calling `dns.getCacheStats()`: -To learn more about DNS caching in Bun, see the [DNS caching](/docs/api/dns) documentation. +To learn more about DNS caching in Bun, see the [DNS caching](https://bun.sh/docs/api/dns) documentation. ### Preconnect to a host @@ -306,3 +448,16 @@ import { write } from "bun"; await write("output.txt", response); ``` + +### Implementation details + +- Connection pooling is enabled by default but can be disabled per-request with `keepalive: false`. The `"Connection: close"` header can also be used to disable keep-alive. +- Large file uploads are optimized using the operating system's `sendfile` syscall under specific conditions: + - The file must be larger than 32KB + - The request must not be using a proxy + - On macOS, only regular files (not pipes, sockets, or devices) can use `sendfile` + - When these conditions aren't met, or when using S3/streaming uploads, Bun falls back to reading the file into memory + - This optimization is particularly effective for HTTP (not HTTPS) requests where the file can be sent directly from the kernel to the network stack +- S3 operations automatically handle signing requests and merging authentication headers + +Note: Many of these features are Bun-specific extensions to the standard fetch API. diff --git a/docs/api/ffi.md b/docs/api/ffi.md index 1a276ba035..c9954a7336 100644 --- a/docs/api/ffi.md +++ b/docs/api/ffi.md @@ -1,6 +1,10 @@ +{% callout %} +**⚠️ Warning** — `bun:ffi` is **experimental**, with known bugs and limitations, and should not be relied on in production. The most stable way to interact with native code from Bun is to write a [Node-API module](/docs/api/node-api). +{% /callout %} + Use the built-in `bun:ffi` module to efficiently call native libraries from JavaScript. It works with languages that support the C ABI (Zig, Rust, C/C++, C#, Nim, Kotlin, etc). -## Usage (`bun:ffi`) +## dlopen usage (`bun:ffi`) To print the version number of `sqlite3`: @@ -108,25 +112,30 @@ $ zig build-lib add.cpp -dynamic -lc -lc++ The following `FFIType` values are supported. -| `FFIType` | C Type | Aliases | -| --------- | -------------- | --------------------------- | -| cstring | `char*` | | -| function | `(void*)(*)()` | `fn`, `callback` | -| ptr | `void*` | `pointer`, `void*`, `char*` | -| i8 | `int8_t` | `int8_t` | -| i16 | `int16_t` | `int16_t` | -| i32 | `int32_t` | `int32_t`, `int` | -| i64 | `int64_t` | `int64_t` | -| i64_fast | `int64_t` | | -| u8 | `uint8_t` | `uint8_t` | -| u16 | `uint16_t` | `uint16_t` | -| u32 | `uint32_t` | `uint32_t` | -| u64 | `uint64_t` | `uint64_t` | -| u64_fast | `uint64_t` | | -| f32 | `float` | `float` | -| f64 | `double` | `double` | -| bool | `bool` | | -| char | `char` | | +| `FFIType` | C Type | Aliases | +| ---------- | -------------- | --------------------------- | +| buffer | `char*` | | +| cstring | `char*` | | +| function | `(void*)(*)()` | `fn`, `callback` | +| ptr | `void*` | `pointer`, `void*`, `char*` | +| i8 | `int8_t` | `int8_t` | +| i16 | `int16_t` | `int16_t` | +| i32 | `int32_t` | `int32_t`, `int` | +| i64 | `int64_t` | `int64_t` | +| i64_fast | `int64_t` | | +| u8 | `uint8_t` | `uint8_t` | +| u16 | `uint16_t` | `uint16_t` | +| u32 | `uint32_t` | `uint32_t` | +| u64 | `uint64_t` | `uint64_t` | +| u64_fast | `uint64_t` | | +| f32 | `float` | `float` | +| f64 | `double` | `double` | +| bool | `bool` | | +| char | `char` | | +| napi_env | `napi_env` | | +| napi_value | `napi_value` | | + +Note: `buffer` arguments must be a `TypedArray` or `DataView`. ## Strings @@ -292,6 +301,23 @@ setTimeout(() => { When you're done with a JSCallback, you should call `close()` to free the memory. +### Experimental thread-safe callbacks + +`JSCallback` has experimental support for thread-safe callbacks. This will be needed if you pass a callback function into a different thread from its instantiation context. You can enable it with the optional `threadsafe` parameter. + +Currently, thread-safe callbacks work best when run from another thread that is running JavaScript code, i.e. a [`Worker`](/docs/api/workers). A future version of Bun will enable them to be called from any thread (such as new threads spawned by your native library that Bun is not aware of). + +```ts +const searchIterator = new JSCallback( + (ptr, length) => /hello/.test(new CString(ptr, length)), + { + returns: "bool", + args: ["ptr", "usize"], + threadsafe: true, // Optional. Defaults to `false` + }, +); +``` + {% callout %} **⚡️ Performance tip** — For a slight performance boost, directly pass `JSCallback.prototype.ptr` instead of the `JSCallback` object: diff --git a/docs/api/file-io.md b/docs/api/file-io.md index 206abfe475..1f8e9468bf 100644 --- a/docs/api/file-io.md +++ b/docs/api/file-io.md @@ -1,8 +1,8 @@ {% callout %} - + -**Note** — The `Bun.file` and `Bun.write` APIs documented on this page are heavily optimized and represent the recommended way to perform file-system tasks using Bun. For operations that are not yet available with `Bun.file`, such as `mkdir` or `readdir`, you can use Bun's [nearly complete](/docs/runtime/nodejs-apis#node-fs) implementation of the [`node:fs`](https://nodejs.org/api/fs.html) module. +**Note** — The `Bun.file` and `Bun.write` APIs documented on this page are heavily optimized and represent the recommended way to perform file-system tasks using Bun. For operations that are not yet available with `Bun.file`, such as `mkdir` or `readdir`, you can use Bun's [nearly complete](https://bun.sh/docs/runtime/nodejs-apis#node-fs) implementation of the [`node:fs`](https://nodejs.org/api/fs.html) module. {% /callout %} @@ -62,6 +62,14 @@ Bun.stdout; Bun.stderr; ``` +### Deleting files (`file.delete()`) + +You can delete a file by calling the `.delete()` function. + +```ts +await Bun.file("logs.json").delete() +``` + ## Writing files (`Bun.write()`) `Bun.write(destination, data): Promise` diff --git a/docs/api/globals.md b/docs/api/globals.md index fe7cd60c64..8e5a89651a 100644 --- a/docs/api/globals.md +++ b/docs/api/globals.md @@ -34,7 +34,7 @@ Bun implements the following globals. - [`Buffer`](https://nodejs.org/api/buffer.html#class-buffer) - Node.js -- See [Node.js > `Buffer`](/docs/runtime/nodejs-apis#node-buffer) +- See [Node.js > `Buffer`](https://bun.sh/docs/runtime/nodejs-apis#node-buffer) --- @@ -172,7 +172,7 @@ Bun implements the following globals. - [`global`](https://nodejs.org/api/globals.html#global) - Node.js -- See [Node.js > `global`](/docs/runtime/nodejs-apis#global). +- See [Node.js > `global`](https://bun.sh/docs/runtime/nodejs-apis#global). --- @@ -188,7 +188,7 @@ Bun implements the following globals. --- -- [`HTMLRewriter`](/docs/api/html-rewriter) +- [`HTMLRewriter`](https://bun.sh/docs/api/html-rewriter) - Cloudflare -   @@ -220,7 +220,7 @@ Bun implements the following globals. - [`process`](https://nodejs.org/api/process.html) - Node.js -- See [Node.js > `process`](/docs/runtime/nodejs-apis#node-process) +- See [Node.js > `process`](https://bun.sh/docs/runtime/nodejs-apis#node-process) --- diff --git a/docs/api/hashing.md b/docs/api/hashing.md index 1ff4a83f4f..1b1b754a75 100644 --- a/docs/api/hashing.md +++ b/docs/api/hashing.md @@ -65,6 +65,73 @@ const isMatch = Bun.password.verifySync(password, hash); // => true ``` +### Salt + +When you use `Bun.password.hash`, a salt is automatically generated and included in the hash. + +### bcrypt - Modular Crypt Format + +In the following [Modular Crypt Format](https://passlib.readthedocs.io/en/stable/modular_crypt_format.html) hash (used by `bcrypt`): + +Input: + +```ts +await Bun.password.hash("hello", { + algorithm: "bcrypt", +}); +``` + +Output: + +```sh +$2b$10$Lyj9kHYZtiyfxh2G60TEfeqs7xkkGiEFFDi3iJGc50ZG/XJ1sxIFi; +``` + +The format is composed of: + +- `bcrypt`: `$2b` +- `rounds`: `$10` - rounds (log10 of the actual number of rounds) +- `salt`: `$Lyj9kHYZtiyfxh2G60TEfeqs7xkkGiEFFDi3iJGc50ZG/XJ1sxIFi` +- `hash`: `$GzJ8PuBi+K+BVojzPfS5mjnC8OpLGtv8KJqF99eP6a4` + +By default, the bcrypt library truncates passwords longer than 72 bytes. In Bun, if you pass `Bun.password.hash` a password longer than 72 bytes and use the `bcrypt` algorithm, the password will be hashed via SHA-512 before being passed to bcrypt. + +```ts +await Bun.password.hash("hello".repeat(100), { + algorithm: "bcrypt", +}); +``` + +So instead of sending bcrypt a 500-byte password silently truncated to 72 bytes, Bun will hash the password using SHA-512 and send the hashed password to bcrypt (only if it exceeds 72 bytes). This is a more secure default behavior. + +### argon2 - PHC format + +In the following [PHC format](https://github.com/P-H-C/phc-string-format/blob/master/phc-sf-spec.md) hash (used by `argon2`): + +Input: + +```ts +await Bun.password.hash("hello", { + algorithm: "argon2id", +}); +``` + +Output: + +```sh +$argon2id$v=19$m=65536,t=2,p=1$xXnlSvPh4ym5KYmxKAuuHVlDvy2QGHBNuI6bJJrRDOs$2YY6M48XmHn+s5NoBaL+ficzXajq2Yj8wut3r0vnrwI +``` + +The format is composed of: + +- `algorithm`: `$argon2id` +- `version`: `$v=19` +- `memory cost`: `65536` +- `iterations`: `t=2` +- `parallelism`: `p=1` +- `salt`: `$xXnlSvPh4ym5KYmxKAuuHVlDvy2QGHBNuI6bJJrRDOs` +- `hash`: `$2YY6M48XmHn+s5NoBaL+ficzXajq2Yj8wut3r0vnrwI` + ## `Bun.hash` `Bun.hash` is a collection of utilities for _non-cryptographic_ hashing. Non-cryptographic hashing algorithms are optimized for speed of computation over collision-resistance or security. @@ -102,6 +169,9 @@ Bun.hash.crc32("data", 1234); Bun.hash.adler32("data", 1234); Bun.hash.cityHash32("data", 1234); Bun.hash.cityHash64("data", 1234); +Bun.hash.xxHash32("data", 1234); +Bun.hash.xxHash64("data", 1234); +Bun.hash.xxHash3("data", 1234); Bun.hash.murmur32v3("data", 1234); Bun.hash.murmur32v2("data", 1234); Bun.hash.murmur64v2("data", 1234); @@ -206,4 +276,42 @@ console.log(arr); // => Uint8Array(32) [ 185, 77, 39, 185, 147, ... ] ``` - +### HMAC in `Bun.CryptoHasher` + +`Bun.CryptoHasher` can be used to compute HMAC digests. To do so, pass the key to the constructor. + +```ts +const hasher = new Bun.CryptoHasher("sha256", "secret-key"); +hasher.update("hello world"); +console.log(hasher.digest("hex")); +// => "095d5a21fe6d0646db223fdf3de6436bb8dfb2fab0b51677ecf6441fcf5f2a67" +``` + +When using HMAC, a more limited set of algorithms are supported: + +- `"blake2b512"` +- `"md5"` +- `"sha1"` +- `"sha224"` +- `"sha256"` +- `"sha384"` +- `"sha512-224"` +- `"sha512-256"` +- `"sha512"` + +Unlike the non-HMAC `Bun.CryptoHasher`, the HMAC `Bun.CryptoHasher` instance is not reset after `.digest()` is called, and attempting to use the same instance again will throw an error. + +Other methods like `.copy()` and `.update()` are supported (as long as it's before `.digest()`), but methods like `.digest()` that finalize the hasher are not. + +```ts +const hasher = new Bun.CryptoHasher("sha256", "secret-key"); +hasher.update("hello world"); + +const copy = hasher.copy(); +copy.update("!"); +console.log(copy.digest("hex")); +// => "3840176c3d8923f59ac402b7550404b28ab11cb0ef1fa199130a5c37864b5497" + +console.log(hasher.digest("hex")); +// => "095d5a21fe6d0646db223fdf3de6436bb8dfb2fab0b51677ecf6441fcf5f2a67" +``` diff --git a/docs/api/html-rewriter.md b/docs/api/html-rewriter.md index f67577b135..0f0f8c2802 100644 --- a/docs/api/html-rewriter.md +++ b/docs/api/html-rewriter.md @@ -1,31 +1,334 @@ -Bun provides a fast native implementation of the `HTMLRewriter` pattern developed by Cloudflare. It provides a convenient, `EventListener`-like API for traversing and transforming HTML documents. +HTMLRewriter lets you use CSS selectors to transform HTML documents. It works with `Request`, `Response`, as well as `string`. Bun's implementation is based on Cloudflare's [lol-html](https://github.com/cloudflare/lol-html). + +## Usage + +A common usecase is rewriting URLs in HTML content. Here's an example that rewrites image sources and link URLs to use a CDN domain: ```ts -const rewriter = new HTMLRewriter(); +// Replace all images with a rickroll +const rewriter = new HTMLRewriter().on("img", { + element(img) { + // Famous rickroll video thumbnail + img.setAttribute( + "src", + "https://img.youtube.com/vi/dQw4w9WgXcQ/maxresdefault.jpg", + ); -rewriter.on("*", { - element(el) { - console.log(el.tagName); // "body" | "div" | ... + // Wrap the image in a link to the video + img.before( + '', + { html: true }, + ); + img.after("", { html: true }); + + // Add some fun alt text + img.setAttribute("alt", "Definitely not a rickroll"); + }, +}); + +// An example HTML document +const html = ` + + + + + + + +`; + +const result = rewriter.transform(html); +console.log(result); +``` + +This replaces all images with a thumbnail of Rick Astley and wraps each `` in a link, producing a diff like this: + +```html-diff + + +- +- +- ++ ++ Definitely not a rickroll ++ ++ ++ Definitely not a rickroll ++ ++ ++ Definitely not a rickroll ++ + + +``` + +Now every image on the page will be replaced with a thumbnail of Rick Astley, and clicking any image will lead to [a very famous video](https://www.youtube.com/watch?v=dQw4w9WgXcQ). + +### Input types + +HTMLRewriter can transform HTML from various sources. The input is automatically handled based on its type: + +```ts +// From Response +rewriter.transform(new Response("
content
")); + +// From string +rewriter.transform("
content
"); + +// From ArrayBuffer +rewriter.transform(new TextEncoder().encode("
content
").buffer); + +// From Blob +rewriter.transform(new Blob(["
content
"])); + +// From File +rewriter.transform(Bun.file("index.html")); +``` + +Note that Cloudflare Workers implementation of HTMLRewriter only supports `Response` objects. + +### Element Handlers + +The `on(selector, handlers)` method allows you to register handlers for HTML elements that match a CSS selector. The handlers are called for each matching element during parsing: + +```ts +rewriter.on("div.content", { + // Handle elements + element(element) { + element.setAttribute("class", "new-content"); + element.append("

New content

", { html: true }); + }, + // Handle text nodes + text(text) { + text.replace("new text"); + }, + // Handle comments + comments(comment) { + comment.remove(); }, }); ``` -To parse and/or transform the HTML: +The handlers can be asynchronous and return a Promise. Note that async operations will block the transformation until they complete: -```ts#rewriter.ts -rewriter.transform( - new Response(` - - - - - My First HTML Page - - -

My First Heading

-

My first paragraph.

- -`)); +```ts +rewriter.on("div", { + async element(element) { + await Bun.sleep(1000); + element.setInnerContent("replace", { html: true }); + }, +}); ``` -View the full documentation on the [Cloudflare website](https://developers.cloudflare.com/workers/runtime-apis/html-rewriter/). +### CSS Selector Support + +The `on()` method supports a wide range of CSS selectors: + +```ts +// Tag selectors +rewriter.on("p", handler); + +// Class selectors +rewriter.on("p.red", handler); + +// ID selectors +rewriter.on("h1#header", handler); + +// Attribute selectors +rewriter.on("p[data-test]", handler); // Has attribute +rewriter.on('p[data-test="one"]', handler); // Exact match +rewriter.on('p[data-test="one" i]', handler); // Case-insensitive +rewriter.on('p[data-test="one" s]', handler); // Case-sensitive +rewriter.on('p[data-test~="two"]', handler); // Word match +rewriter.on('p[data-test^="a"]', handler); // Starts with +rewriter.on('p[data-test$="1"]', handler); // Ends with +rewriter.on('p[data-test*="b"]', handler); // Contains +rewriter.on('p[data-test|="a"]', handler); // Dash-separated + +// Combinators +rewriter.on("div span", handler); // Descendant +rewriter.on("div > span", handler); // Direct child + +// Pseudo-classes +rewriter.on("p:nth-child(2)", handler); +rewriter.on("p:first-child", handler); +rewriter.on("p:nth-of-type(2)", handler); +rewriter.on("p:first-of-type", handler); +rewriter.on("p:not(:first-child)", handler); + +// Universal selector +rewriter.on("*", handler); +``` + +### Element Operations + +Elements provide various methods for manipulation. All modification methods return the element instance for chaining: + +```ts +rewriter.on("div", { + element(el) { + // Attributes + el.setAttribute("class", "new-class").setAttribute("data-id", "123"); + + const classAttr = el.getAttribute("class"); // "new-class" + const hasId = el.hasAttribute("id"); // boolean + el.removeAttribute("class"); + + // Content manipulation + el.setInnerContent("New content"); // Escapes HTML by default + el.setInnerContent("

HTML content

", { html: true }); // Parses HTML + el.setInnerContent(""); // Clear content + + // Position manipulation + el.before("Content before") + .after("Content after") + .prepend("First child") + .append("Last child"); + + // HTML content insertion + el.before("before", { html: true }) + .after("after", { html: true }) + .prepend("first", { html: true }) + .append("last", { html: true }); + + // Removal + el.remove(); // Remove element and contents + el.removeAndKeepContent(); // Remove only the element tags + + // Properties + console.log(el.tagName); // Lowercase tag name + console.log(el.namespaceURI); // Element's namespace URI + console.log(el.selfClosing); // Whether element is self-closing (e.g.
) + console.log(el.canHaveContent); // Whether element can contain content (false for void elements like
) + console.log(el.removed); // Whether element was removed + + // Attributes iteration + for (const [name, value] of el.attributes) { + console.log(name, value); + } + + // End tag handling + el.onEndTag(endTag => { + endTag.before("Before end tag"); + endTag.after("After end tag"); + endTag.remove(); // Remove the end tag + console.log(endTag.name); // Tag name in lowercase + }); + }, +}); +``` + +### Text Operations + +Text handlers provide methods for text manipulation. Text chunks represent portions of text content and provide information about their position in the text node: + +```ts +rewriter.on("p", { + text(text) { + // Content + console.log(text.text); // Text content + console.log(text.lastInTextNode); // Whether this is the last chunk + console.log(text.removed); // Whether text was removed + + // Manipulation + text.before("Before text").after("After text").replace("New text").remove(); + + // HTML content insertion + text + .before("before", { html: true }) + .after("after", { html: true }) + .replace("replace", { html: true }); + }, +}); +``` + +### Comment Operations + +Comment handlers allow comment manipulation with similar methods to text nodes: + +```ts +rewriter.on("*", { + comments(comment) { + // Content + console.log(comment.text); // Comment text + comment.text = "New comment text"; // Set comment text + console.log(comment.removed); // Whether comment was removed + + // Manipulation + comment + .before("Before comment") + .after("After comment") + .replace("New comment") + .remove(); + + // HTML content insertion + comment + .before("before", { html: true }) + .after("after", { html: true }) + .replace("replace", { html: true }); + }, +}); +``` + +### Document Handlers + +The `onDocument(handlers)` method allows you to handle document-level events. These handlers are called for events that occur at the document level rather than within specific elements: + +```ts +rewriter.onDocument({ + // Handle doctype + doctype(doctype) { + console.log(doctype.name); // "html" + console.log(doctype.publicId); // public identifier if present + console.log(doctype.systemId); // system identifier if present + }, + // Handle text nodes + text(text) { + console.log(text.text); + }, + // Handle comments + comments(comment) { + console.log(comment.text); + }, + // Handle document end + end(end) { + end.append("", { html: true }); + }, +}); +``` + +### Response Handling + +When transforming a Response: + +- The status code, headers, and other response properties are preserved +- The body is transformed while maintaining streaming capabilities +- Content-encoding (like gzip) is handled automatically +- The original response body is marked as used after transformation +- Headers are cloned to the new response + +## Error Handling + +HTMLRewriter operations can throw errors in several cases: + +- Invalid selector syntax in `on()` method +- Invalid HTML content in transformation methods +- Stream errors when processing Response bodies +- Memory allocation failures +- Invalid input types (e.g., passing Symbol) +- Body already used errors + +Errors should be caught and handled appropriately: + +```ts +try { + const result = rewriter.transform(input); + // Process result +} catch (error) { + console.error("HTMLRewriter error:", error); +} +``` + +## See also + +You can also read the [Cloudflare documentation](https://developers.cloudflare.com/workers/runtime-apis/html-rewriter/), which this API is intended to be compatible with. diff --git a/docs/api/http.md b/docs/api/http.md index d2ee381e67..bf8ff9861f 100644 --- a/docs/api/http.md +++ b/docs/api/http.md @@ -1,26 +1,428 @@ The page primarily documents the Bun-native `Bun.serve` API. Bun also implements [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) and the Node.js [`http`](https://nodejs.org/api/http.html) and [`https`](https://nodejs.org/api/https.html) modules. {% callout %} -These modules have been re-implemented to use Bun's fast internal HTTP infrastructure. Feel free to use these modules directly; frameworks like [Express](https://expressjs.com/) that depend on these modules should work out of the box. For granular compatibility information, see [Runtime > Node.js APIs](/docs/runtime/nodejs-apis). +These modules have been re-implemented to use Bun's fast internal HTTP infrastructure. Feel free to use these modules directly; frameworks like [Express](https://expressjs.com/) that depend on these modules should work out of the box. For granular compatibility information, see [Runtime > Node.js APIs](https://bun.sh/docs/runtime/nodejs-apis). {% /callout %} To start a high-performance HTTP server with a clean API, the recommended approach is [`Bun.serve`](#start-a-server-bun-serve). ## `Bun.serve()` -Start an HTTP server in Bun with `Bun.serve`. +Use `Bun.serve` to start an HTTP server in Bun. ```ts Bun.serve({ + // `routes` requires Bun v1.2.3+ + routes: { + // Static routes + "/api/status": new Response("OK"), + + // Dynamic routes + "/users/:id": req => { + return new Response(`Hello User ${req.params.id}!`); + }, + + // Per-HTTP method handlers + "/api/posts": { + GET: () => new Response("List posts"), + POST: async req => { + const body = await req.json(); + return Response.json({ created: true, ...body }); + }, + }, + + // Wildcard route for all routes that start with "/api/" and aren't otherwise matched + "/api/*": Response.json({ message: "Not found" }, { status: 404 }), + + // Redirect from /blog/hello to /blog/hello/world + "/blog/hello": Response.redirect("/blog/hello/world"), + + // Serve a file by buffering it in memory + "/favicon.ico": new Response(await Bun.file("./favicon.ico").bytes(), { + headers: { + "Content-Type": "image/x-icon", + }, + }), + }, + + // (optional) fallback for unmatched routes: + // Required if Bun's version < 1.2.3 fetch(req) { - return new Response("Bun!"); + return new Response("Not Found", { status: 404 }); }, }); ``` +### Routing + +Routes in `Bun.serve()` receive a `BunRequest` (which extends [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request)) and return a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) or `Promise`. This makes it easier to use the same code for both sending & receiving HTTP requests. + +```ts +// Simplified for brevity +interface BunRequest extends Request { + params: Record; +} +``` + +#### Async/await in routes + +You can use async/await in route handlers to return a `Promise`. + +```ts +import { sql, serve } from "bun"; + +serve({ + port: 3001, + routes: { + "/api/version": async () => { + const [version] = await sql`SELECT version()`; + return Response.json(version); + }, + }, +}); +``` + +#### Promise in routes + +You can also return a `Promise` from a route handler. + +```ts +import { sql, serve } from "bun"; + +serve({ + routes: { + "/api/version": () => { + return new Promise(resolve => { + setTimeout(async () => { + const [version] = await sql`SELECT version()`; + resolve(Response.json(version)); + }, 100); + }); + }, + }, +}); +``` + +#### Type-safe route parameters + +TypeScript parses route parameters when passed as a string literal, so that your editor will show autocomplete when accessing `request.params`. + +```ts +import type { BunRequest } from "bun"; + +Bun.serve({ + routes: { + // TypeScript knows the shape of params when passed as a string literal + "/orgs/:orgId/repos/:repoId": req => { + const { orgId, repoId } = req.params; + return Response.json({ orgId, repoId }); + }, + + "/orgs/:orgId/repos/:repoId/settings": ( + // optional: you can explicitly pass a type to BunRequest: + req: BunRequest<"/orgs/:orgId/repos/:repoId/settings">, + ) => { + const { orgId, repoId } = req.params; + return Response.json({ orgId, repoId }); + }, + }, +}); +``` + +Percent-encoded route parameter values are automatically decoded. Unicode characters are supported. Invalid unicode is replaced with the unicode replacement character `&0xFFFD;`. + +### Static responses + +Routes can also be `Response` objects (without the handler function). Bun.serve() optimizes it for zero-allocation dispatch - perfect for health checks, redirects, and fixed content: + +```ts +Bun.serve({ + routes: { + // Health checks + "/health": new Response("OK"), + "/ready": new Response("Ready", { + headers: { + // Pass custom headers + "X-Ready": "1", + }, + }), + + // Redirects + "/blog": Response.redirect("https://bun.sh/blog"), + + // API responses + "/api/config": Response.json({ + version: "1.0.0", + env: "production", + }), + }, +}); +``` + +Static responses do not allocate additional memory after initialization. You can generally expect at least a 15% performance improvement over manually returning a `Response` object. + +Static route responses are cached for the lifetime of the server object. To reload static routes, call `server.reload(options)`. + +```ts +const server = Bun.serve({ + static: { + "/api/time": new Response(new Date().toISOString()), + }, + + fetch(req) { + return new Response("404!"); + }, +}); + +// Update the time every second. +setInterval(() => { + server.reload({ + static: { + "/api/time": new Response(new Date().toISOString()), + }, + + fetch(req) { + return new Response("404!"); + }, + }); +}, 1000); +``` + +Reloading routes only impact the next request. In-flight requests continue to use the old routes. After in-flight requests to old routes are finished, the old routes are freed from memory. + +To simplify error handling, static routes do not support streaming response bodies from `ReadableStream` or an `AsyncIterator`. Fortunately, you can still buffer the response in memory first: + +```ts +const time = await fetch("https://api.example.com/v1/data"); +// Buffer the response in memory first. +const blob = await time.blob(); + +const server = Bun.serve({ + static: { + "/api/data": new Response(blob), + }, + + fetch(req) { + return new Response("404!"); + }, +}); +``` + +### Route precedence + +Routes are matched in order of specificity: + +1. Exact routes (`/users/all`) +2. Parameter routes (`/users/:id`) +3. Wildcard routes (`/users/*`) +4. Global catch-all (`/*`) + +```ts +Bun.serve({ + routes: { + // Most specific first + "/api/users/me": () => new Response("Current user"), + "/api/users/:id": req => new Response(`User ${req.params.id}`), + "/api/*": () => new Response("API catch-all"), + "/*": () => new Response("Global catch-all"), + }, +}); +``` + +### Per-HTTP Method Routes + +Route handlers can be specialized by HTTP method: + +```ts +Bun.serve({ + routes: { + "/api/posts": { + // Different handlers per method + GET: () => new Response("List posts"), + POST: async req => { + const post = await req.json(); + return Response.json({ id: crypto.randomUUID(), ...post }); + }, + PUT: async req => { + const updates = await req.json(); + return Response.json({ updated: true, ...updates }); + }, + DELETE: () => new Response(null, { status: 204 }), + }, + }, +}); +``` + +You can pass any of the following methods: + +| Method | Usecase example | +| --------- | ------------------------------- | +| `GET` | Fetch a resource | +| `HEAD` | Check if a resource exists | +| `OPTIONS` | Get allowed HTTP methods (CORS) | +| `DELETE` | Delete a resource | +| `PATCH` | Update a resource | +| `POST` | Create a resource | +| `PUT` | Update a resource | + +When passing a function instead of an object, all methods will be handled by that function: + +```ts +const server = Bun.serve({ + routes: { + "/api/version": () => Response.json({ version: "1.0.0" }), + }, +}); + +await fetch(new URL("/api/version", server.url)); +await fetch(new URL("/api/version", server.url), { method: "PUT" }); +// ... etc +``` + +### Hot Route Reloading + +Update routes without server restarts using `server.reload()`: + +```ts +const server = Bun.serve({ + routes: { + "/api/version": () => Response.json({ version: "1.0.0" }), + }, +}); + +// Deploy new routes without downtime +server.reload({ + routes: { + "/api/version": () => Response.json({ version: "2.0.0" }), + }, +}); +``` + +### Error Handling + +Bun provides structured error handling for routes: + +```ts +Bun.serve({ + routes: { + // Errors are caught automatically + "/api/risky": () => { + throw new Error("Something went wrong"); + }, + }, + // Global error handler + error(error) { + console.error(error); + return new Response(`Internal Error: ${error.message}`, { + status: 500, + headers: { + "Content-Type": "text/plain", + }, + }); + }, +}); +``` + +### HTML imports + +To add a client-side single-page app, you can use an HTML import: + +```ts +import myReactSinglePageApp from "./index.html"; + +Bun.serve({ + routes: { + "/": myReactSinglePageApp, + }, +}); +``` + +HTML imports don't just serve HTML. It's a full-featured frontend bundler, transpiler, and toolkit built using Bun's [bundler](https://bun.sh/docs/bundler), JavaScript transpiler and CSS parser. + +You can use this to build a full-featured frontend with React, TypeScript, Tailwind CSS, and more. Check out [/docs/bundler/fullstack](https://bun.sh/docs/bundler/fullstack) to learn more. + +### Practical example: REST API + +Here's a basic database-backed REST API using Bun's router with zero dependencies: + +{% codetabs %} + +```ts#server.ts +import type { Post } from "./types.ts"; +import { Database } from "bun:sqlite"; + +const db = new Database("posts.db"); +db.exec(` + CREATE TABLE IF NOT EXISTS posts ( + id TEXT PRIMARY KEY, + title TEXT NOT NULL, + content TEXT NOT NULL, + created_at TEXT NOT NULL + ) +`); + +Bun.serve({ + routes: { + // List posts + "/api/posts": { + GET: () => { + const posts = db.query("SELECT * FROM posts").all(); + return Response.json(posts); + }, + + // Create post + POST: async req => { + const post: Omit = await req.json(); + const id = crypto.randomUUID(); + + db.query( + `INSERT INTO posts (id, title, content, created_at) + VALUES (?, ?, ?, ?)`, + ).run(id, post.title, post.content, new Date().toISOString()); + + return Response.json({ id, ...post }, { status: 201 }); + }, + }, + + // Get post by ID + "/api/posts/:id": req => { + const post = db + .query("SELECT * FROM posts WHERE id = ?") + .get(req.params.id); + + if (!post) { + return new Response("Not Found", { status: 404 }); + } + + return Response.json(post); + }, + }, + + error(error) { + console.error(error); + return new Response("Internal Server Error", { status: 500 }); + }, +}); +``` + +```ts#types.ts +export interface Post { + id: string; + title: string; + content: string; + created_at: string; +} +``` + +{% /codetabs %} + +### Routing performance + +`Bun.serve()`'s router builds on top uWebSocket's [tree-based approach](https://github.com/oven-sh/bun/blob/0d1a00fa0f7830f8ecd99c027fce8096c9d459b6/packages/bun-uws/src/HttpRouter.h#L57-L64) to add [SIMD-accelerated route parameter decoding](https://github.com/oven-sh/bun/blob/main/src/bun.js/bindings/decodeURIComponentSIMD.cpp#L21-L271) and [JavaScriptCore structure caching](https://github.com/oven-sh/bun/blob/main/src/bun.js/bindings/ServerRouteList.cpp#L100-L101) to push the performance limits of what modern hardware allows. + ### `fetch` request handler -The `fetch` handler handles incoming requests. It receives a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object and returns a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) or `Promise`. +The `fetch` handler handles incoming requests that weren't matched by any route. It receives a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object and returns a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) or [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). ```ts Bun.serve({ @@ -70,28 +472,6 @@ const server = Bun.serve({ }); ``` -### `static` responses - -Serve static responses by route with the `static` option - -```ts -Bun.serve({ - static: { - "/api/health-check": new Response("All good!"), - "/old-link": Response.redirect("/new-link", 301), - "/": new Response("Hello World"), - }, - - fetch(req) { - return new Response("404!"); - }, -}); -``` - -{% note %} -`static` is experimental and may change in the future. -{% /note %} - ### Changing the `port` and `hostname` To configure which port and hostname the server will listen on, set `port` and `hostname` in the options object. @@ -314,7 +694,7 @@ Bun.serve({ }); ``` -### Sever name indication (SNI) +### Server name indication (SNI) To configure the server name indication (SNI) for the server, set the `serverName` field in the `tls` object. @@ -348,7 +728,24 @@ Bun.serve({ }); ``` -## Object syntax +## idleTimeout + +To configure the idle timeout, set the `idleTimeout` field in Bun.serve. + +```ts +Bun.serve({ + // 10 seconds: + idleTimeout: 10, + + fetch(req) { + return new Response("Bun!"); + }, +}); +``` + +This is the maximum amount of time a connection is allowed to be idle before the server closes it. A connection is idling if there is no data sent or received. + +## export default syntax Thus far, the examples on this page have used the explicit `Bun.serve` API. Bun also supports an alternate syntax. @@ -370,7 +767,7 @@ Instead of passing the server options into `Bun.serve`, `export default` it. Thi $ bun --hot server.ts ``` --> - + ## Streaming files @@ -408,6 +805,241 @@ Bun.serve({ }); ``` +## Server Lifecycle Methods + +### server.stop() - Stop the server + +To stop the server from accepting new connections: + +```ts +const server = Bun.serve({ + fetch(req) { + return new Response("Hello!"); + }, +}); + +// Gracefully stop the server (waits for in-flight requests) +await server.stop(); + +// Force stop and close all active connections +await server.stop(true); +``` + +By default, `stop()` allows in-flight requests and WebSocket connections to complete. Pass `true` to immediately terminate all connections. + +### server.ref() and server.unref() - Process lifecycle control + +Control whether the server keeps the Bun process alive: + +```ts +// Don't keep process alive if server is the only thing running +server.unref(); + +// Restore default behavior - keep process alive +server.ref(); +``` + +### server.reload() - Hot reload handlers + +Update the server's handlers without restarting: + +```ts +const server = Bun.serve({ + routes: { + "/api/version": Response.json({ version: "v1" }), + }, + fetch(req) { + return new Response("v1"); + }, +}); + +// Update to new handler +server.reload({ + routes: { + "/api/version": Response.json({ version: "v2" }), + }, + fetch(req) { + return new Response("v2"); + }, +}); +``` + +This is useful for development and hot reloading. Only `fetch`, `error`, and `routes` can be updated. + +## Per-Request Controls + + + +### server.timeout(Request, seconds) - Custom request timeouts + +Set a custom idle timeout for individual requests: + +```ts +const server = Bun.serve({ + fetch(req, server) { + // Set 60 second timeout for this request + server.timeout(req, 60); + + // If they take longer than 60 seconds to send the body, the request will be aborted + await req.text(); + + return new Response("Done!"); + }, +}); +``` + +Pass `0` to disable the timeout for a request. + +### server.requestIP(Request) - Get client information + +Get client IP and port information: + +```ts +const server = Bun.serve({ + fetch(req, server) { + const address = server.requestIP(req); + if (address) { + return new Response( + `Client IP: ${address.address}, Port: ${address.port}`, + ); + } + return new Response("Unknown client"); + }, +}); +``` + +Returns `null` for closed requests or Unix domain sockets. + +## Server Metrics + +### server.pendingRequests and server.pendingWebSockets + +Monitor server activity with built-in counters: + +```ts +const server = Bun.serve({ + fetch(req, server) { + return new Response( + `Active requests: ${server.pendingRequests}\n` + + `Active WebSockets: ${server.pendingWebSockets}`, + ); + }, +}); +``` + +### server.subscriberCount(topic) - WebSocket subscribers + +Get count of subscribers for a WebSocket topic: + +```ts +const server = Bun.serve({ + fetch(req, server) { + const chatUsers = server.subscriberCount("chat"); + return new Response(`${chatUsers} users in chat`); + }, + websocket: { + message(ws) { + ws.subscribe("chat"); + }, + }, +}); +``` + +## WebSocket Configuration + +### server.publish(topic, data, compress) - WebSocket Message Publishing + +The server can publish messages to all WebSocket clients subscribed to a topic: + +```ts +const server = Bun.serve({ + websocket: { + message(ws) { + // Publish to all "chat" subscribers + server.publish("chat", "Hello everyone!"); + }, + }, + + fetch(req) { + // ... + }, +}); +``` + +The `publish()` method returns: + +- Number of bytes sent if successful +- `0` if the message was dropped +- `-1` if backpressure was applied + +### WebSocket Handler Options + +When configuring WebSockets, several advanced options are available through the `websocket` handler: + +```ts +Bun.serve({ + websocket: { + // Maximum message size (in bytes) + maxPayloadLength: 64 * 1024, + + // Backpressure limit before messages are dropped + backpressureLimit: 1024 * 1024, + + // Close connection if backpressure limit is hit + closeOnBackpressureLimit: true, + + // Handler called when backpressure is relieved + drain(ws) { + console.log("Backpressure relieved"); + }, + + // Enable per-message deflate compression + perMessageDeflate: { + compress: true, + decompress: true, + }, + + // Send ping frames to keep connection alive + sendPings: true, + + // Handlers for ping/pong frames + ping(ws, data) { + console.log("Received ping"); + }, + pong(ws, data) { + console.log("Received pong"); + }, + + // Whether server receives its own published messages + publishToSelf: false, + }, +}); +``` + ## Benchmarks Below are Bun and Node.js implementations of a simple HTTP server that responds `Bun!` to each incoming `Request`. @@ -456,100 +1088,174 @@ The `Bun.serve` server can handle roughly 2.5x more requests per second than Nod {% details summary="See TypeScript definitions" %} ```ts -interface Bun { - serve(options: { - development?: boolean; - error?: ( - request: ErrorLike, - ) => Response | Promise | undefined | Promise; - fetch(request: Request, server: Server): Response | Promise; - hostname?: string; - id?: string | null; - maxRequestBodySize?: number; - port?: string | number; - reusePort?: boolean; - tls?: TLSOptions | Array; - unix: string; - websocket: WebSocketHandler; - }): Server; -} +interface Server extends Disposable { + /** + * Stop the server from accepting new connections. + * @param closeActiveConnections If true, immediately terminates all connections + * @returns Promise that resolves when the server has stopped + */ + stop(closeActiveConnections?: boolean): Promise; -interface TLSOptions { - ca?: string | Buffer | BunFile | Array | undefined; - cert?: - | string - | Buffer - | BunFile - | Array - | undefined; - dhParamsFile?: string; - key?: - | string - | Buffer - | BunFile - | Array - | undefined; - lowMemoryMode?: boolean; - passphrase?: string; - secureOptions?: number | undefined; - serverName?: string; + /** + * Update handlers without restarting the server. + * Only fetch and error handlers can be updated. + */ + reload(options: Serve): void; + + /** + * Make a request to the running server. + * Useful for testing or internal routing. + */ + fetch(request: Request | string): Response | Promise; + + /** + * Upgrade an HTTP request to a WebSocket connection. + * @returns true if upgrade successful, false if failed + */ + upgrade( + request: Request, + options?: { + headers?: Bun.HeadersInit; + data?: T; + }, + ): boolean; + + /** + * Publish a message to all WebSocket clients subscribed to a topic. + * @returns Bytes sent, 0 if dropped, -1 if backpressure applied + */ + publish( + topic: string, + data: string | ArrayBufferView | ArrayBuffer | SharedArrayBuffer, + compress?: boolean, + ): ServerWebSocketSendStatus; + + /** + * Get count of WebSocket clients subscribed to a topic. + */ + subscriberCount(topic: string): number; + + /** + * Get client IP address and port. + * @returns null for closed requests or Unix sockets + */ + requestIP(request: Request): SocketAddress | null; + + /** + * Set custom idle timeout for a request. + * @param seconds Timeout in seconds, 0 to disable + */ + timeout(request: Request, seconds: number): void; + + /** + * Keep process alive while server is running. + */ + ref(): void; + + /** + * Allow process to exit if server is only thing running. + */ + unref(): void; + + /** Number of in-flight HTTP requests */ + readonly pendingRequests: number; + + /** Number of active WebSocket connections */ + readonly pendingWebSockets: number; + + /** Server URL including protocol, hostname and port */ + readonly url: URL; + + /** Port server is listening on */ + readonly port: number; + + /** Hostname server is bound to */ + readonly hostname: string; + + /** Whether server is in development mode */ + readonly development: boolean; + + /** Server instance identifier */ + readonly id: string; } interface WebSocketHandler { - backpressureLimit?: number; - close?( - ws: ServerWebSocket, - code: number, - reason: string, - ): void | Promise; - closeOnBackpressureLimit?: boolean; - drain?(ws: ServerWebSocket): void | Promise; - idleTimeout?: number; + /** Maximum WebSocket message size in bytes */ maxPayloadLength?: number; - message( - ws: ServerWebSocket, - message: string | Buffer, - ): void | Promise; - open?(ws: ServerWebSocket): void | Promise; + + /** Bytes of queued messages before applying backpressure */ + backpressureLimit?: number; + + /** Whether to close connection when backpressure limit hit */ + closeOnBackpressureLimit?: boolean; + + /** Called when backpressure is relieved */ + drain?(ws: ServerWebSocket): void | Promise; + + /** Seconds before idle timeout */ + idleTimeout?: number; + + /** Enable per-message deflate compression */ perMessageDeflate?: | boolean | { compress?: WebSocketCompressor | boolean; decompress?: WebSocketCompressor | boolean; }; - ping?(ws: ServerWebSocket, data: Buffer): void | Promise; - pong?(ws: ServerWebSocket, data: Buffer): void | Promise; - publishToSelf?: boolean; + + /** Send ping frames to keep connection alive */ sendPings?: boolean; + + /** Whether server receives its own published messages */ + publishToSelf?: boolean; + + /** Called when connection opened */ + open?(ws: ServerWebSocket): void | Promise; + + /** Called when message received */ + message( + ws: ServerWebSocket, + message: string | Buffer, + ): void | Promise; + + /** Called when connection closed */ + close?( + ws: ServerWebSocket, + code: number, + reason: string, + ): void | Promise; + + /** Called when ping frame received */ + ping?(ws: ServerWebSocket, data: Buffer): void | Promise; + + /** Called when pong frame received */ + pong?(ws: ServerWebSocket, data: Buffer): void | Promise; } -interface Server { - fetch(request: Request | string): Response | Promise; - publish( - compress?: boolean, - data: string | ArrayBufferView | ArrayBuffer | SharedArrayBuffer, - topic: string, - ): ServerWebSocketSendStatus; - ref(): void; - reload(options: Serve): void; - requestIP(request: Request): SocketAddress | null; - stop(closeActiveConnections?: boolean): void; - unref(): void; - upgrade( - options?: { - data?: T; - headers?: Bun.HeadersInit; - }, - request: Request, - ): boolean; +interface TLSOptions { + /** Certificate authority chain */ + ca?: string | Buffer | BunFile | Array; - readonly development: boolean; - readonly hostname: string; - readonly id: string; - readonly pendingRequests: number; - readonly pendingWebSockets: number; - readonly port: number; - readonly url: URL; + /** Server certificate */ + cert?: string | Buffer | BunFile | Array; + + /** Path to DH parameters file */ + dhParamsFile?: string; + + /** Private key */ + key?: string | Buffer | BunFile | Array; + + /** Reduce TLS memory usage */ + lowMemoryMode?: boolean; + + /** Private key passphrase */ + passphrase?: string; + + /** OpenSSL options flags */ + secureOptions?: number; + + /** Server name for SNI */ + serverName?: string; } ``` diff --git a/docs/api/s3.md b/docs/api/s3.md new file mode 100644 index 0000000000..29da1b3709 --- /dev/null +++ b/docs/api/s3.md @@ -0,0 +1,750 @@ +Production servers often read, upload, and write files to S3-compatible object storage services instead of the local filesystem. Historically, that means local filesystem APIs you use in development can't be used in production. When you use Bun, things are different. + +{% callout %} + +### Bun's S3 API is fast + +{% image src="https://bun.sh/bun-s3-node.gif" alt="Bun's S3 API is fast" caption="Left: Bun v1.1.44. Right: Node.js v23.6.0" /%} + +{% /callout %} + +Bun provides fast, native bindings for interacting with S3-compatible object storage services. Bun's S3 API is designed to be simple and feel similar to fetch's `Response` and `Blob` APIs (like Bun's local filesystem APIs). + +```ts +import { s3, write, S3Client } from "bun"; + +// Bun.s3 reads environment variables for credentials +// file() returns a lazy reference to a file on S3 +const metadata = s3.file("123.json"); + +// Download from S3 as JSON +const data = await metadata.json(); + +// Upload to S3 +await write(metadata, JSON.stringify({ name: "John", age: 30 })); + +// Presign a URL (synchronous - no network request needed) +const url = metadata.presign({ + acl: "public-read", + expiresIn: 60 * 60 * 24, // 1 day +}); + +// Delete the file +await metadata.delete(); +``` + +S3 is the [de facto standard](https://en.wikipedia.org/wiki/De_facto_standard) internet filesystem. Bun's S3 API works with S3-compatible storage services like: + +- AWS S3 +- Cloudflare R2 +- DigitalOcean Spaces +- MinIO +- Backblaze B2 +- ...and any other S3-compatible storage service + +## Basic Usage + +There are several ways to interact with Bun's S3 API. + +### `Bun.S3Client` & `Bun.s3` + +`Bun.s3` is equivalent to `new Bun.S3Client()`, relying on environment variables for credentials. + +To explicitly set credentials, pass them to the `Bun.S3Client` constructor. + +```ts +import { S3Client } from "bun"; + +const client = new S3Client({ + accessKeyId: "your-access-key", + secretAccessKey: "your-secret-key", + bucket: "my-bucket", + // sessionToken: "..." + // acl: "public-read", + // endpoint: "https://s3.us-east-1.amazonaws.com", + // endpoint: "https://.r2.cloudflarestorage.com", // Cloudflare R2 + // endpoint: "https://.digitaloceanspaces.com", // DigitalOcean Spaces + // endpoint: "http://localhost:9000", // MinIO +}); + +// Bun.s3 is a global singleton that is equivalent to `new Bun.S3Client()` +``` + +### Working with S3 Files + +The **`file`** method in `S3Client` returns a **lazy reference to a file on S3**. + +```ts +// A lazy reference to a file on S3 +const s3file: S3File = client.file("123.json"); +``` + +Like `Bun.file(path)`, the `S3Client`'s `file` method is synchronous. It does zero network requests until you call a method that depends on a network request. + +### Reading files from S3 + +If you've used the `fetch` API, you're familiar with the `Response` and `Blob` APIs. `S3File` extends `Blob`. The same methods that work on `Blob` also work on `S3File`. + +```ts +// Read an S3File as text +const text = await s3file.text(); + +// Read an S3File as JSON +const json = await s3file.json(); + +// Read an S3File as an ArrayBuffer +const buffer = await s3file.arrayBuffer(); + +// Get only the first 1024 bytes +const partial = await s3file.slice(0, 1024).text(); + +// Stream the file +const stream = s3file.stream(); +for await (const chunk of stream) { + console.log(chunk); +} +``` + +#### Memory optimization + +Methods like `text()`, `json()`, `bytes()`, or `arrayBuffer()` avoid duplicating the string or bytes in memory when possible. + +If the text happens to be ASCII, Bun directly transfers the string to JavaScriptCore (the engine) without transcoding and without duplicating the string in memory. When you use `.bytes()` or `.arrayBuffer()`, it will also avoid duplicating the bytes in memory. + +These helper methods not only simplify the API, they also make it faster. + +### Writing & uploading files to S3 + +Writing to S3 is just as simple. + +```ts +// Write a string (replacing the file) +await s3file.write("Hello World!"); + +// Write a Buffer (replacing the file) +await s3file.write(Buffer.from("Hello World!")); + +// Write a Response (replacing the file) +await s3file.write(new Response("Hello World!")); + +// Write with content type +await s3file.write(JSON.stringify({ name: "John", age: 30 }), { + type: "application/json", +}); + +// Write using a writer (streaming) +const writer = s3file.writer({ type: "application/json" }); +writer.write("Hello"); +writer.write(" World!"); +await writer.end(); + +// Write using Bun.write +await Bun.write(s3file, "Hello World!"); +``` + +### Working with large files (streams) + +Bun automatically handles multipart uploads for large files and provides streaming capabilities. The same API that works for local files also works for S3 files. + +```ts +// Write a large file +const bigFile = Buffer.alloc(10 * 1024 * 1024); // 10MB +const writer = s3file.writer({ + // Automatically retry on network errors up to 3 times + retry: 3, + + // Queue up to 10 requests at a time + queueSize: 10, + + // Upload in 5 MB chunks + partSize: 5 * 1024 * 1024, +}); +for (let i = 0; i < 10; i++) { + await writer.write(bigFile); +} +await writer.end(); +``` + +## Presigning URLs + +When your production service needs to let users upload files to your server, it's often more reliable for the user to upload directly to S3 instead of your server acting as an intermediary. + +To facilitate this, you can presign URLs for S3 files. This generates a URL with a signature that allows a user to securely upload that specific file to S3, without exposing your credentials or granting them unnecessary access to your bucket. + +The default behaviour is to generate a `GET` URL that expires in 24 hours. Bun attempts to infer the content type from the file extension. If inference is not possible, it will default to `application/octet-stream`. + +```ts +import { s3 } from "bun"; + +// Generate a presigned URL that expires in 24 hours (default) +const download = s3.presign("my-file.txt"); // GET, text/plain, expires in 24 hours + +const upload = s3.presign("my-file", { + expiresIn: 3600, // 1 hour + method: "PUT", + type: "application/json", // No extension for inferring, so we can specify the content type to be JSON +}); + +// You can call .presign() if on a file reference, but avoid doing so +// unless you already have a reference (to avoid memory usage). +const myFile = s3.file("my-file.txt"); +const presignedFile = myFile.presign({ + expiresIn: 3600, // 1 hour +}); +``` + +### Setting ACLs + +To set an ACL (access control list) on a presigned URL, pass the `acl` option: + +```ts +const url = s3file.presign({ + acl: "public-read", + expiresIn: 3600, +}); +``` + +You can pass any of the following ACLs: + +| ACL | Explanation | +| ----------------------------- | ------------------------------------------------------------------- | +| `"public-read"` | The object is readable by the public. | +| `"private"` | The object is readable only by the bucket owner. | +| `"public-read-write"` | The object is readable and writable by the public. | +| `"authenticated-read"` | The object is readable by the bucket owner and authenticated users. | +| `"aws-exec-read"` | The object is readable by the AWS account that made the request. | +| `"bucket-owner-read"` | The object is readable by the bucket owner. | +| `"bucket-owner-full-control"` | The object is readable and writable by the bucket owner. | +| `"log-delivery-write"` | The object is writable by AWS services used for log delivery. | + +### Expiring URLs + +To set an expiration time for a presigned URL, pass the `expiresIn` option. + +```ts +const url = s3file.presign({ + // Seconds + expiresIn: 3600, // 1 hour + + // access control list + acl: "public-read", + + // HTTP method + method: "PUT", +}); +``` + +### `method` + +To set the HTTP method for a presigned URL, pass the `method` option. + +```ts +const url = s3file.presign({ + method: "PUT", + // method: "DELETE", + // method: "GET", + // method: "HEAD", + // method: "POST", + // method: "PUT", +}); +``` + +### `new Response(S3File)` + +To quickly redirect users to a presigned URL for an S3 file, pass an `S3File` instance to a `Response` object as the body. + +```ts +const response = new Response(s3file); +console.log(response); +``` + +This will automatically redirect the user to the presigned URL for the S3 file, saving you the memory, time, and bandwidth cost of downloading the file to your server and sending it back to the user. + +```ts +Response (0 KB) { + ok: false, + url: "", + status: 302, + statusText: "", + headers: Headers { + "location": "https://.r2.cloudflarestorage.com/...", + }, + redirected: true, + bodyUsed: false +} +``` + +## Support for S3-Compatible Services + +Bun's S3 implementation works with any S3-compatible storage service. Just specify the appropriate endpoint: + +### Using Bun's S3Client with AWS S3 + +AWS S3 is the default. You can also pass a `region` option instead of an `endpoint` option for AWS S3. + +```ts +import { S3Client } from "bun"; + +// AWS S3 +const s3 = new S3Client({ + accessKeyId: "access-key", + secretAccessKey: "secret-key", + bucket: "my-bucket", + // endpoint: "https://s3.us-east-1.amazonaws.com", + // region: "us-east-1", +}); +``` + +### Using Bun's S3Client with Google Cloud Storage + +To use Bun's S3 client with [Google Cloud Storage](https://cloud.google.com/storage), set `endpoint` to `"https://storage.googleapis.com"` in the `S3Client` constructor. + +```ts +import { S3Client } from "bun"; + +// Google Cloud Storage +const gcs = new S3Client({ + accessKeyId: "access-key", + secretAccessKey: "secret-key", + bucket: "my-bucket", + endpoint: "https://storage.googleapis.com", +}); +``` + +### Using Bun's S3Client with Cloudflare R2 + +To use Bun's S3 client with [Cloudflare R2](https://developers.cloudflare.com/r2/), set `endpoint` to the R2 endpoint in the `S3Client` constructor. The R2 endpoint includes your account ID. + +```ts +import { S3Client } from "bun"; + +// CloudFlare R2 +const r2 = new S3Client({ + accessKeyId: "access-key", + secretAccessKey: "secret-key", + bucket: "my-bucket", + endpoint: "https://.r2.cloudflarestorage.com", +}); +``` + +### Using Bun's S3Client with DigitalOcean Spaces + +To use Bun's S3 client with [DigitalOcean Spaces](https://www.digitalocean.com/products/spaces/), set `endpoint` to the DigitalOcean Spaces endpoint in the `S3Client` constructor. + +```ts +import { S3Client } from "bun"; + +const spaces = new S3Client({ + accessKeyId: "access-key", + secretAccessKey: "secret-key", + bucket: "my-bucket", + // region: "nyc3", + endpoint: "https://.digitaloceanspaces.com", +}); +``` + +### Using Bun's S3Client with MinIO + +To use Bun's S3 client with [MinIO](https://min.io/), set `endpoint` to the URL that MinIO is running on in the `S3Client` constructor. + +```ts +import { S3Client } from "bun"; + +const minio = new S3Client({ + accessKeyId: "access-key", + secretAccessKey: "secret-key", + bucket: "my-bucket", + + // Make sure to use the correct endpoint URL + // It might not be localhost in production! + endpoint: "http://localhost:9000", +}); +``` + +### Using Bun's S3Client with supabase + +To use Bun's S3 client with [supabase](https://supabase.com/), set `endpoint` to the supabase endpoint in the `S3Client` constructor. The supabase endpoint includes your account ID and /storage/v1/s3 path. Make sure to set Enable connection via S3 protocol on in the supabase dashboard in https://supabase.com/dashboard/project//settings/storage and to set the region informed in the same section. + +```ts +import { S3Client } from "bun"; + +const supabase = new S3Client({ + accessKeyId: "access-key", + secretAccessKey: "secret-key", + bucket: "my-bucket", + region: "us-west-1", + endpoint: "https://.supabase.co/storage/v1/s3/storage", +}); +``` + +### Using Bun's S3Client with S3 Virtual Hosted-Style endpoints + +When using a S3 Virtual Hosted-Style endpoint, you need to set the `virtualHostedStyle` option to `true` and if no endpoint is provided, Bun will use region and bucket to infer the endpoint to AWS S3, if no region is provided it will use `us-east-1`. If you provide a the endpoint, there are no need to provide the bucket name. + +```ts +import { S3Client } from "bun"; + +// AWS S3 endpoint inferred from region and bucket +const s3 = new S3Client({ + accessKeyId: "access-key", + secretAccessKey: "secret-key", + bucket: "my-bucket", + virtualHostedStyle: true, + // endpoint: "https://my-bucket.s3.us-east-1.amazonaws.com", + // region: "us-east-1", +}); + +// AWS S3 +const s3WithEndpoint = new S3Client({ + accessKeyId: "access-key", + secretAccessKey: "secret-key", + endpoint: "https://.s3..amazonaws.com", + virtualHostedStyle: true, +}); + +// Cloudflare R2 +const r2WithEndpoint = new S3Client({ + accessKeyId: "access-key", + secretAccessKey: "secret-key", + endpoint: "https://..r2.cloudflarestorage.com", + virtualHostedStyle: true, +}); +``` + +## Credentials + +Credentials are one of the hardest parts of using S3, and we've tried to make it as easy as possible. By default, Bun reads the following environment variables for credentials. + +| Option name | Environment variable | +| ----------------- | ---------------------- | +| `accessKeyId` | `S3_ACCESS_KEY_ID` | +| `secretAccessKey` | `S3_SECRET_ACCESS_KEY` | +| `region` | `S3_REGION` | +| `endpoint` | `S3_ENDPOINT` | +| `bucket` | `S3_BUCKET` | +| `sessionToken` | `S3_SESSION_TOKEN` | + +If the `S3_*` environment variable is not set, Bun will also check for the `AWS_*` environment variable, for each of the above options. + +| Option name | Fallback environment variable | +| ----------------- | ----------------------------- | +| `accessKeyId` | `AWS_ACCESS_KEY_ID` | +| `secretAccessKey` | `AWS_SECRET_ACCESS_KEY` | +| `region` | `AWS_REGION` | +| `endpoint` | `AWS_ENDPOINT` | +| `bucket` | `AWS_BUCKET` | +| `sessionToken` | `AWS_SESSION_TOKEN` | + +These environment variables are read from [`.env` files](/docs/runtime/env) or from the process environment at initialization time (`process.env` is not used for this). + +These defaults are overridden by the options you pass to `s3.file(credentials)`, `new Bun.S3Client(credentials)`, or any of the methods that accept credentials. So if, for example, you use the same credentials for different buckets, you can set the credentials once in your `.env` file and then pass `bucket: "my-bucket"` to the `s3.file()` function without having to specify all the credentials again. + +### `S3Client` objects + +When you're not using environment variables or using multiple buckets, you can create a `S3Client` object to explicitly set credentials. + +```ts +import { S3Client } from "bun"; + +const client = new S3Client({ + accessKeyId: "your-access-key", + secretAccessKey: "your-secret-key", + bucket: "my-bucket", + // sessionToken: "..." + endpoint: "https://s3.us-east-1.amazonaws.com", + // endpoint: "https://.r2.cloudflarestorage.com", // Cloudflare R2 + // endpoint: "http://localhost:9000", // MinIO +}); + +// Write using a Response +await file.write(new Response("Hello World!")); + +// Presign a URL +const url = file.presign({ + expiresIn: 60 * 60 * 24, // 1 day + acl: "public-read", +}); + +// Delete the file +await file.delete(); +``` + +### `S3Client.prototype.write` + +To upload or write a file to S3, call `write` on the `S3Client` instance. + +```ts +const client = new Bun.S3Client({ + accessKeyId: "your-access-key", + secretAccessKey: "your-secret-key", + endpoint: "https://s3.us-east-1.amazonaws.com", + bucket: "my-bucket", +}); +await client.write("my-file.txt", "Hello World!"); +await client.write("my-file.txt", new Response("Hello World!")); + +// equivalent to +// await client.file("my-file.txt").write("Hello World!"); +``` + +### `S3Client.prototype.delete` + +To delete a file from S3, call `delete` on the `S3Client` instance. + +```ts +const client = new Bun.S3Client({ + accessKeyId: "your-access-key", + secretAccessKey: "your-secret-key", + bucket: "my-bucket", +}); + +await client.delete("my-file.txt"); +// equivalent to +// await client.file("my-file.txt").delete(); +``` + +### `S3Client.prototype.exists` + +To check if a file exists in S3, call `exists` on the `S3Client` instance. + +```ts +const client = new Bun.S3Client({ + accessKeyId: "your-access-key", + secretAccessKey: "your-secret-key", + bucket: "my-bucket", +}); + +const exists = await client.exists("my-file.txt"); +// equivalent to +// const exists = await client.file("my-file.txt").exists(); +``` + +## `S3File` + +`S3File` instances are created by calling the `S3Client` instance method or the `s3.file()` function. Like `Bun.file()`, `S3File` instances are lazy. They don't refer to something that necessarily exists at the time of creation. That's why all the methods that don't involve network requests are fully synchronous. + +```ts +interface S3File extends Blob { + slice(start: number, end?: number): S3File; + exists(): Promise; + unlink(): Promise; + presign(options: S3Options): string; + text(): Promise; + json(): Promise; + bytes(): Promise; + arrayBuffer(): Promise; + stream(options: S3Options): ReadableStream; + write( + data: + | string + | Uint8Array + | ArrayBuffer + | Blob + | ReadableStream + | Response + | Request, + options?: BlobPropertyBag, + ): Promise; + + exists(options?: S3Options): Promise; + unlink(options?: S3Options): Promise; + delete(options?: S3Options): Promise; + presign(options?: S3Options): string; + + stat(options?: S3Options): Promise; + /** + * Size is not synchronously available because it requires a network request. + * + * @deprecated Use `stat()` instead. + */ + size: NaN; + + // ... more omitted for brevity +} +``` + +Like `Bun.file()`, `S3File` extends [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob), so all the methods that are available on `Blob` are also available on `S3File`. The same API for reading data from a local file is also available for reading data from S3. + +| Method | Output | +| ---------------------------- | ---------------- | +| `await s3File.text()` | `string` | +| `await s3File.bytes()` | `Uint8Array` | +| `await s3File.json()` | `JSON` | +| `await s3File.stream()` | `ReadableStream` | +| `await s3File.arrayBuffer()` | `ArrayBuffer` | + +That means using `S3File` instances with `fetch()`, `Response`, and other web APIs that accept `Blob` instances just works. + +### Partial reads with `slice` + +To read a partial range of a file, you can use the `slice` method. + +```ts +const partial = s3file.slice(0, 1024); + +// Read the partial range as a Uint8Array +const bytes = await partial.bytes(); + +// Read the partial range as a string +const text = await partial.text(); +``` + +Internally, this works by using the HTTP `Range` header to request only the bytes you want. This `slice` method is the same as [`Blob.prototype.slice`](https://developer.mozilla.org/en-US/docs/Web/API/Blob/slice). + +### Deleting files from S3 + +To delete a file from S3, you can use the `delete` method. + +```ts +await s3file.delete(); +// await s3File.unlink(); +``` + +`delete` is the same as `unlink`. + +## Error codes + +When Bun's S3 API throws an error, it will have a `code` property that matches one of the following values: + +- `ERR_S3_MISSING_CREDENTIALS` +- `ERR_S3_INVALID_METHOD` +- `ERR_S3_INVALID_PATH` +- `ERR_S3_INVALID_ENDPOINT` +- `ERR_S3_INVALID_SIGNATURE` +- `ERR_S3_INVALID_SESSION_TOKEN` + +When the S3 Object Storage service returns an error (that is, not Bun), it will be an `S3Error` instance (an `Error` instance with the name `"S3Error"`). + +## `S3Client` static methods + +The `S3Client` class provides several static methods for interacting with S3. + +### `S3Client.presign` (static) + +To generate a presigned URL for an S3 file, you can use the `S3Client.presign` static method. + +```ts +import { S3Client } from "bun"; + +const credentials = { + accessKeyId: "your-access-key", + secretAccessKey: "your-secret-key", + bucket: "my-bucket", + // endpoint: "https://s3.us-east-1.amazonaws.com", + // endpoint: "https://.r2.cloudflarestorage.com", // Cloudflare R2 +}; + +const url = S3Client.presign("my-file.txt", { + ...credentials, + expiresIn: 3600, +}); +``` + +This is equivalent to calling `new S3Client(credentials).presign("my-file.txt", { expiresIn: 3600 })`. + +### `S3Client.exists` (static) + +To check if an S3 file exists, you can use the `S3Client.exists` static method. + +```ts +import { S3Client } from "bun"; + +const credentials = { + accessKeyId: "your-access-key", + secretAccessKey: "your-secret-key", + bucket: "my-bucket", + // endpoint: "https://s3.us-east-1.amazonaws.com", +}; + +const exists = await S3Client.exists("my-file.txt", credentials); +``` + +The same method also works on `S3File` instances. + +```ts +import { s3 } from "bun"; + +const s3file = s3.file("my-file.txt", { + ...credentials, +}); +const exists = await s3file.exists(); +``` + +### `S3Client.stat` (static) + +To get the size, etag, and other metadata of an S3 file, you can use the `S3Client.stat` static method. + +```ts +import { S3Client } from "bun"; + +const credentials = { + accessKeyId: "your-access-key", + secretAccessKey: "your-secret-key", + bucket: "my-bucket", + // endpoint: "https://s3.us-east-1.amazonaws.com", +}; + +const stat = await S3Client.stat("my-file.txt", credentials); +// { +// etag: "\"7a30b741503c0b461cc14157e2df4ad8\"", +// lastModified: 2025-01-07T00:19:10.000Z, +// size: 1024, +// type: "text/plain;charset=utf-8", +// } +``` + +### `S3Client.delete` (static) + +To delete an S3 file, you can use the `S3Client.delete` static method. + +```ts +import { S3Client } from "bun"; + +const credentials = { + accessKeyId: "your-access-key", + secretAccessKey: "your-secret-key", + bucket: "my-bucket", + // endpoint: "https://s3.us-east-1.amazonaws.com", +}; + +await S3Client.delete("my-file.txt", credentials); +// equivalent to +// await new S3Client(credentials).delete("my-file.txt"); + +// S3Client.unlink is alias of S3Client.delete +await S3Client.unlink("my-file.txt", credentials); +``` + +## s3:// protocol + +To make it easier to use the same code for local files and S3 files, the `s3://` protocol is supported in `fetch` and `Bun.file()`. + +```ts +const response = await fetch("s3://my-bucket/my-file.txt"); +const file = Bun.file("s3://my-bucket/my-file.txt"); +``` + +You can additionally pass `s3` options to the `fetch` and `Bun.file` functions. + +```ts +const response = await fetch("s3://my-bucket/my-file.txt", { + s3: { + accessKeyId: "your-access-key", + secretAccessKey: "your-secret-key", + endpoint: "https://s3.us-east-1.amazonaws.com", + }, + headers: { + "range": "bytes=0-1023", + }, +}); +``` + +### UTF-8, UTF-16, and BOM (byte order mark) + +Like `Response` and `Blob`, `S3File` assumes UTF-8 encoding by default. + +When calling one of the `text()` or `json()` methods on an `S3File`: + +- When a UTF-16 byte order mark (BOM) is detected, it will be treated as UTF-16. JavaScriptCore natively supports UTF-16, so it skips the UTF-8 transcoding process (and strips the BOM). This is mostly good, but it does mean if you have invalid surrogate pairs characters in your UTF-16 string, they will be passed through to JavaScriptCore (same as source code). +- When a UTF-8 BOM is detected, it gets stripped before the string is passed to JavaScriptCore and invalid UTF-8 codepoints are replaced with the Unicode replacement character (`\uFFFD`). +- UTF-32 is not supported. diff --git a/docs/api/semver.md b/docs/api/semver.md index f27ec53e66..dacafa95c7 100644 --- a/docs/api/semver.md +++ b/docs/api/semver.md @@ -4,7 +4,7 @@ It's about 20x faster than `node-semver`. ![Benchmark](https://github.com/oven-sh/bun/assets/709451/94746adc-8aba-4baf-a143-3c355f8e0f78) -Currently, this API is two functions. +Currently, this API provides two functions : #### `Bun.semver.satisfies(version: string, range: string): boolean` diff --git a/docs/api/spawn.md b/docs/api/spawn.md index e540cc8316..4219e016c6 100644 --- a/docs/api/spawn.md +++ b/docs/api/spawn.md @@ -110,7 +110,7 @@ You can read results from the subprocess via the `stdout` and `stderr` propertie ```ts const proc = Bun.spawn(["bun", "--version"]); const text = await new Response(proc.stdout).text(); -console.log(text); // => "1.1.7" +console.log(text); // => "$BUN_LATEST_VERSION" ``` Configure the output stream by passing one of the following values to `stdout/stderr`: @@ -179,7 +179,7 @@ proc.kill(); // specify an exit code The parent `bun` process will not terminate until all child processes have exited. Use `proc.unref()` to detach the child process from the parent. -``` +```ts const proc = Bun.spawn(["bun", "--version"]); proc.unref(); ``` diff --git a/docs/api/sql.md b/docs/api/sql.md new file mode 100644 index 0000000000..0c239ceeb2 --- /dev/null +++ b/docs/api/sql.md @@ -0,0 +1,674 @@ +Bun provides native bindings for working with PostgreSQL databases with a modern, Promise-based API. The interface is designed to be simple and performant, using tagged template literals for queries and offering features like connection pooling, transactions, and prepared statements. + +```ts +import { sql } from "bun"; + +const users = await sql` + SELECT * FROM users + WHERE active = ${true} + LIMIT ${10} +`; + +// Select with multiple conditions +const activeUsers = await sql` + SELECT * + FROM users + WHERE active = ${true} + AND age >= ${18} +`; +``` + +{% features title="Features" %} + +{% icon size=20 name="Shield" /%} Tagged template literals to protect against SQL injection + +{% icon size=20 name="GitMerge" /%} Transactions + +{% icon size=20 name="Variable" /%} Named & positional parameters + +{% icon size=20 name="Network" /%} Connection pooling + +{% icon size=20 name="Binary" /%} `BigInt` support + +{% icon size=20 name="Key" /%} SASL Auth support (SCRAM-SHA-256), MD5, and Clear Text + +{% icon size=20 name="Timer" /%} Connection timeouts + +{% icon size=20 name="Database" /%} Returning rows as data objects, arrays of arrays, or `Buffer` + +{% icon size=20 name="Code" /%} Binary protocol support makes it faster + +{% icon size=20 name="Lock" /%} TLS support (and auth mode) + +{% icon size=20 name="Settings" /%} Automatic configuration with environment variable + +{% /features %} + +### Inserting data + +You can pass JavaScript values directly to the SQL template literal and escaping will be handled for you. + +```ts +import { sql } from "bun"; + +// Basic insert with direct values +const [user] = await sql` + INSERT INTO users (name, email) + VALUES (${name}, ${email}) + RETURNING * +`; + +// Using object helper for cleaner syntax +const userData = { + name: "Alice", + email: "alice@example.com", +}; + +const [newUser] = await sql` + INSERT INTO users ${sql(userData)} + RETURNING * +`; +// Expands to: INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com') +``` + +### Bulk Insert + +You can also pass arrays of objects to the SQL template literal and it will be expanded to a `INSERT INTO ... VALUES ...` statement. + +```ts +const users = [ + { name: "Alice", email: "alice@example.com" }, + { name: "Bob", email: "bob@example.com" }, + { name: "Charlie", email: "charlie@example.com" }, +]; + +await sql`INSERT INTO users ${sql(users)}`; +``` + +### Picking columns to insert + +You can use `sql(object, ...string)` to pick which columns to insert. Each of the columns must be defined on the object. + +```ts +const user = { + name: "Alice", + email: "alice@example.com", + age: 25, +}; + +await sql`INSERT INTO users ${sql(user, "name", "email")}`; +// Only inserts name and email columns, ignoring other fields +``` + +## Query Results + +By default, Bun's SQL client returns query results as arrays of objects, where each object represents a row with column names as keys. However, there are cases where you might want the data in a different format. The client provides two additional methods for this purpose. + +### `sql``.values()` format + +The `sql``.values()` method returns rows as arrays of values rather than objects. Each row becomes an array where the values are in the same order as the columns in your query. + +```ts +const rows = await sql`SELECT * FROM users`.values(); +console.log(rows); +``` + +This returns something like: + +```ts +[ + ["Alice", "alice@example.com"], + ["Bob", "bob@example.com"], +]; +``` + +`sql``.values()` is especially useful if duplicate column names are returned in the query results. When using objects (the default), the last column name is used as the key in the object, which means duplicate column names overwrite each other — but when using `sql``.values()`, each column is present in the array so you can access the values of duplicate columns by index. + +### `sql``.raw()` format + +The `.raw()` method returns rows as arrays of `Buffer` objects. This can be useful for working with binary data or for performance reasons. + +```ts +const rows = await sql`SELECT * FROM users`.raw(); +console.log(rows); // [[Buffer, Buffer], [Buffer, Buffer], [Buffer, Buffer]] +``` + +## SQL Fragments + +A common need in database applications is the ability to construct queries dynamically based on runtime conditions. Bun provides safe ways to do this without risking SQL injection. + +### Dynamic Table Names + +When you need to reference tables or schemas dynamically, use the `sql()` helper to ensure proper escaping: + +```ts +// Safely reference tables dynamically +await sql`SELECT * FROM ${sql("users")}`; + +// With schema qualification +await sql`SELECT * FROM ${sql("public.users")}`; +``` + +### Conditional Queries + +You can use the `sql()` helper to build queries with conditional clauses. This allows you to create flexible queries that adapt to your application's needs: + +```ts +// Optional WHERE clauses +const filterAge = true; +const minAge = 21; +const ageFilter = sql`AND age > ${minAge}`; +await sql` + SELECT * FROM users + WHERE active = ${true} + ${filterAge ? ageFilter : sql``} +`; +``` + +### Dynamic columns in updates + +You can use `sql(object, ...string)` to pick which columns to update. Each of the columns must be defined on the object. If the columns are not informed all keys will be used to update the row. + +```ts +await sql`UPDATE users SET ${sql(user, "name", "email")} WHERE id = ${user.id}`; +// uses all keys from the object to update the row +await sql`UPDATE users SET ${sql(user)} WHERE id = ${user.id}`; +``` + +### Dynamic values and `where in` + +Value lists can also be created dynamically, making where in queries simple too. Optionally you can pass a array of objects and inform what key to use to create the list. + +```ts +await sql`SELECT * FROM users WHERE id IN ${sql([1, 2, 3])}`; + +const users = [ + { id: 1, name: "Alice" }, + { id: 2, name: "Bob" }, + { id: 3, name: "Charlie" }, +]; +await sql`SELECT * FROM users WHERE id IN ${sql(users, "id")}`; +``` + +## `sql``.simple()` + +The PostgreSQL wire protocol supports two types of queries: "simple" and "extended". Simple queries can contain multiple statements but don't support parameters, while extended queries (the default) support parameters but only allow one statement. + +To run multiple statements in a single query, use `sql``.simple()`: + +```ts +// Multiple statements in one query +await sql` + SELECT 1; + SELECT 2; +`.simple(); +``` + +Simple queries are often useful for database migrations and setup scripts. + +Note that simple queries cannot use parameters (`${value}`). If you need parameters, you must split your query into separate statements. + +### Queries in files + +You can use the `sql.file` method to read a query from a file and execute it, if the file includes $1, $2, etc you can pass parameters to the query. If no parameters are used it can execute multiple commands per file. + +```ts +const result = await sql.file("query.sql", [1, 2, 3]); +``` + +### Unsafe Queries + +You can use the `sql.unsafe` function to execute raw SQL strings. Use this with caution, as it will not escape user input. Executing more than one command per query is allowed if no parameters are used. + +```ts +// Multiple commands without parameters +const result = await sql.unsafe(` + SELECT ${userColumns} FROM users; + SELECT ${accountColumns} FROM accounts; +`); + +// Using parameters (only one command is allowed) +const result = await sql.unsafe( + "SELECT " + dangerous + " FROM users WHERE id = $1", + [id], +); +``` + +#### What is SQL Injection? + +{% image href="https://xkcd.com/327/" src="https://imgs.xkcd.com/comics/exploits_of_a_mom.png" /%} + +### Execute and Cancelling Queries + +Bun's SQL is lazy that means its will only start executing when awaited or executed with `.execute()`. +You can cancel a query that is currently executing by calling the `cancel()` method on the query object. + +```ts +const query = await sql`SELECT * FROM users`.execute(); +setTimeout(() => query.cancel(), 100); +await query; +``` + +## Database Environment Variables + +`sql` connection parameters can be configured using environment variables. The client checks these variables in a specific order of precedence. + +The following environment variables can be used to define the connection URL: + +| Environment Variable | Description | +| --------------------------- | ------------------------------------------ | +| `POSTGRES_URL` | Primary connection URL for PostgreSQL | +| `DATABASE_URL` | Alternative connection URL | +| `PGURL` | Alternative connection URL | +| `PG_URL` | Alternative connection URL | +| `TLS_POSTGRES_DATABASE_URL` | SSL/TLS-enabled connection URL | +| `TLS_DATABASE_URL` | Alternative SSL/TLS-enabled connection URL | + +If no connection URL is provided, the system checks for the following individual parameters: + +| Environment Variable | Fallback Variables | Default Value | Description | +| -------------------- | ---------------------------- | ------------- | ----------------- | +| `PGHOST` | - | `localhost` | Database host | +| `PGPORT` | - | `5432` | Database port | +| `PGUSERNAME` | `PGUSER`, `USER`, `USERNAME` | `postgres` | Database user | +| `PGPASSWORD` | - | (empty) | Database password | +| `PGDATABASE` | - | username | Database name | + +## Connection Options + +You can configure your database connection manually by passing options to the SQL constructor: + +```ts +import { SQL } from "bun"; + +const db = new SQL({ + // Required + url: "postgres://user:pass@localhost:5432/dbname", + + // Optional configuration + hostname: "localhost", + port: 5432, + database: "myapp", + username: "dbuser", + password: "secretpass", + + // Connection pool settings + max: 20, // Maximum connections in pool + idleTimeout: 30, // Close idle connections after 30s + maxLifetime: 0, // Connection lifetime in seconds (0 = forever) + connectionTimeout: 30, // Timeout when establishing new connections + + // SSL/TLS options + tls: true, + // tls: { + // rejectUnauthorized: true, + // requestCert: true, + // ca: "path/to/ca.pem", + // key: "path/to/key.pem", + // cert: "path/to/cert.pem", + // checkServerIdentity(hostname, cert) { + // ... + // }, + // }, + + // Callbacks + onconnect: client => { + console.log("Connected to database"); + }, + onclose: client => { + console.log("Connection closed"); + }, +}); +``` + +## Dynamic passwords + +When clients need to use alternative authentication schemes such as access tokens or connections to databases with rotating passwords, provide either a synchronous or asynchronous function that will resolve the dynamic password value at connection time. + +```ts +import { SQL } from "bun"; + +const sql = new SQL(url, { + // Other connection config + ... + // Password function for the database user + password: async () => await signer.getAuthToken(), +}); +``` + +## Transactions + +To start a new transaction, use `sql.begin`. This method reserves a dedicated connection for the duration of the transaction and provides a scoped `sql` instance to use within the callback function. Once the callback completes, `sql.begin` resolves with the return value of the callback. + +The `BEGIN` command is sent automatically, including any optional configurations you specify. If an error occurs during the transaction, a `ROLLBACK` is triggered to release the reserved connection and ensure the process continues smoothly. + +### Basic Transactions + +```ts +await sql.begin(async tx => { + // All queries in this function run in a transaction + await tx`INSERT INTO users (name) VALUES (${"Alice"})`; + await tx`UPDATE accounts SET balance = balance - 100 WHERE user_id = 1`; + + // Transaction automatically commits if no errors are thrown + // Rolls back if any error occurs +}); +``` + +It's also possible to pipeline the requests in a transaction if needed by returning an array with queries from the callback function like this: + +```ts +await sql.begin(async tx => { + return [ + tx`INSERT INTO users (name) VALUES (${"Alice"})`, + tx`UPDATE accounts SET balance = balance - 100 WHERE user_id = 1`, + ]; +}); +``` + +### Savepoints + +Savepoints in SQL create intermediate checkpoints within a transaction, enabling partial rollbacks without affecting the entire operation. They are useful in complex transactions, allowing error recovery and maintaining consistent results. + +```ts +await sql.begin(async tx => { + await tx`INSERT INTO users (name) VALUES (${"Alice"})`; + + await tx.savepoint(async sp => { + // This part can be rolled back separately + await sp`UPDATE users SET status = 'active'`; + if (someCondition) { + throw new Error("Rollback to savepoint"); + } + }); + + // Continue with transaction even if savepoint rolled back + await tx`INSERT INTO audit_log (action) VALUES ('user_created')`; +}); +``` + +### Distributed Transactions + +Two-Phase Commit (2PC) is a distributed transaction protocol where Phase 1 has the coordinator preparing nodes by ensuring data is written and ready to commit, while Phase 2 finalizes with nodes either committing or rolling back based on the coordinator's decision. This process ensures data durability and proper lock management. + +In PostgreSQL and MySQL, distributed transactions persist beyond their original session, allowing privileged users or coordinators to commit or rollback them later. This supports robust distributed transactions, recovery processes, and administrative operations. + +Each database system implements distributed transactions differently: + +PostgreSQL natively supports them through prepared transactions, while MySQL uses XA Transactions. + +If any exceptions occur during the distributed transaction and aren't caught, the system will automatically rollback all changes. When everything proceeds normally, you maintain the flexibility to either commit or rollback the transaction later. + +```ts +// Begin a distributed transaction +await sql.beginDistributed("tx1", async tx => { + await tx`INSERT INTO users (name) VALUES (${"Alice"})`; +}); + +// Later, commit or rollback +await sql.commitDistributed("tx1"); +// or +await sql.rollbackDistributed("tx1"); +``` + +## Authentication + +Bun supports SCRAM-SHA-256 (SASL), MD5, and Clear Text authentication. SASL is recommended for better security. Check [Postgres SASL Authentication](https://www.postgresql.org/docs/current/sasl-authentication.html) for more information. + +### SSL Modes Overview + +PostgreSQL supports different SSL/TLS modes to control how secure connections are established. These modes determine the behavior when connecting and the level of certificate verification performed. + +```ts +const sql = new SQL({ + hostname: "localhost", + username: "user", + password: "password", + ssl: "disable", // | "prefer" | "require" | "verify-ca" | "verify-full" +}); +``` + +| SSL Mode | Description | +| ------------- | -------------------------------------------------------------------------------------------------------------------- | +| `disable` | No SSL/TLS used. Connections fail if server requires SSL. | +| `prefer` | Tries SSL first, falls back to non-SSL if SSL fails. Default mode if none specified. | +| `require` | Requires SSL without certificate verification. Fails if SSL cannot be established. | +| `verify-ca` | Verifies server certificate is signed by trusted CA. Fails if verification fails. | +| `verify-full` | Most secure mode. Verifies certificate and hostname match. Protects against untrusted certificates and MITM attacks. | + +### Using With Connection Strings + +The SSL mode can also be specified in connection strings: + +```ts +// Using prefer mode +const sql = new SQL("postgres://user:password@localhost/mydb?sslmode=prefer"); + +// Using verify-full mode +const sql = new SQL( + "postgres://user:password@localhost/mydb?sslmode=verify-full", +); +``` + +## Connection Pooling + +Bun's SQL client automatically manages a connection pool, which is a pool of database connections that are reused for multiple queries. This helps to reduce the overhead of establishing and closing connections for each query, and it also helps to manage the number of concurrent connections to the database. + +```ts +const db = new SQL({ + // Pool configuration + max: 20, // Maximum 20 concurrent connections + idleTimeout: 30, // Close idle connections after 30s + maxLifetime: 3600, // Max connection lifetime 1 hour + connectionTimeout: 10, // Connection timeout 10s +}); +``` + +No connection will be made until a query is made. + +```ts +const sql = Bun.sql(); // no connection are created + +await sql`...`; // pool is started until max is reached (if possible), first available connection is used +await sql`...`; // previous connection is reused + +// two connections are used now at the same time +await Promise.all([ + sql`INSERT INTO users ${sql({ name: "Alice" })}`, + sql`UPDATE users SET name = ${user.name} WHERE id = ${user.id}`, +]); + +await sql.close(); // await all queries to finish and close all connections from the pool +await sql.close({ timeout: 5 }); // wait 5 seconds and close all connections from the pool +await sql.close({ timeout: 0 }); // close all connections from the pool immediately +``` + +## Reserved Connections + +Bun enables you to reserve a connection from the pool, and returns a client that wraps the single connection. This can be used for running queries on an isolated connection. + +```ts +// Get exclusive connection from pool +const reserved = await sql.reserve(); + +try { + await reserved`INSERT INTO users (name) VALUES (${"Alice"})`; +} finally { + // Important: Release connection back to pool + reserved.release(); +} + +// Or using Symbol.dispose +{ + using reserved = await sql.reserve(); + await reserved`SELECT 1`; +} // Automatically released +``` + +## Prepared Statements + +By default, Bun's SQL client automatically creates named prepared statements for queries where it can be inferred that the query is static. This provides better performance. However, you can change this behavior by setting `prepare: false` in the connection options: + +```ts +const sql = new SQL({ + // ... other options ... + prepare: false, // Disable persisting named prepared statements on the server +}); +``` + +When `prepare: false` is set: + +Queries are still executed using the "extended" protocol, but they are executed using [unnamed prepared statements](https://www.postgresql.org/docs/current/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY), an unnamed prepared statement lasts only until the next Parse statement specifying the unnamed statement as destination is issued. + +- Parameter binding is still safe against SQL injection +- Each query is parsed and planned from scratch by the server +- Queries will not be [pipelined](https://www.postgresql.org/docs/current/protocol-flow.html#PROTOCOL-FLOW-PIPELINING) + +You might want to use `prepare: false` when: + +- Using PGBouncer in transaction mode (though since PGBouncer 1.21.0, protocol-level named prepared statements are supported when configured properly) +- Debugging query execution plans +- Working with dynamic SQL where query plans need to be regenerated frequently +- More than one command per query will not be supported (unless you use `sql``.simple()`) + +Note that disabling prepared statements may impact performance for queries that are executed frequently with different parameters, as the server needs to parse and plan each query from scratch. + +## Error Handling + +The client provides typed errors for different failure scenarios: + +### Connection Errors + +| Connection Errors | Description | +| --------------------------------- | ---------------------------------------------------- | +| `ERR_POSTGRES_CONNECTION_CLOSED` | Connection was terminated or never established | +| `ERR_POSTGRES_CONNECTION_TIMEOUT` | Failed to establish connection within timeout period | +| `ERR_POSTGRES_IDLE_TIMEOUT` | Connection closed due to inactivity | +| `ERR_POSTGRES_LIFETIME_TIMEOUT` | Connection exceeded maximum lifetime | +| `ERR_POSTGRES_TLS_NOT_AVAILABLE` | SSL/TLS connection not available | +| `ERR_POSTGRES_TLS_UPGRADE_FAILED` | Failed to upgrade connection to SSL/TLS | + +### Authentication Errors + +| Authentication Errors | Description | +| ------------------------------------------------ | ---------------------------------------- | +| `ERR_POSTGRES_AUTHENTICATION_FAILED_PBKDF2` | Password authentication failed | +| `ERR_POSTGRES_UNKNOWN_AUTHENTICATION_METHOD` | Server requested unknown auth method | +| `ERR_POSTGRES_UNSUPPORTED_AUTHENTICATION_METHOD` | Server requested unsupported auth method | +| `ERR_POSTGRES_INVALID_SERVER_KEY` | Invalid server key during authentication | +| `ERR_POSTGRES_INVALID_SERVER_SIGNATURE` | Invalid server signature | +| `ERR_POSTGRES_SASL_SIGNATURE_INVALID_BASE64` | Invalid SASL signature encoding | +| `ERR_POSTGRES_SASL_SIGNATURE_MISMATCH` | SASL signature verification failed | + +### Query Errors + +| Query Errors | Description | +| ------------------------------------ | ------------------------------------------ | +| `ERR_POSTGRES_SYNTAX_ERROR` | Invalid SQL syntax (extends `SyntaxError`) | +| `ERR_POSTGRES_SERVER_ERROR` | General error from PostgreSQL server | +| `ERR_POSTGRES_INVALID_QUERY_BINDING` | Invalid parameter binding | +| `ERR_POSTGRES_QUERY_CANCELLED` | Query was cancelled | +| `ERR_POSTGRES_NOT_TAGGED_CALL` | Query was called without a tagged call | + +### Data Type Errors + +| Data Type Errors | Description | +| ------------------------------------------------------- | ------------------------------------- | +| `ERR_POSTGRES_INVALID_BINARY_DATA` | Invalid binary data format | +| `ERR_POSTGRES_INVALID_BYTE_SEQUENCE` | Invalid byte sequence | +| `ERR_POSTGRES_INVALID_BYTE_SEQUENCE_FOR_ENCODING` | Encoding error | +| `ERR_POSTGRES_INVALID_CHARACTER` | Invalid character in data | +| `ERR_POSTGRES_OVERFLOW` | Numeric overflow | +| `ERR_POSTGRES_UNSUPPORTED_BYTEA_FORMAT` | Unsupported binary format | +| `ERR_POSTGRES_UNSUPPORTED_INTEGER_SIZE` | Integer size not supported | +| `ERR_POSTGRES_MULTIDIMENSIONAL_ARRAY_NOT_SUPPORTED_YET` | Multidimensional arrays not supported | +| `ERR_POSTGRES_NULLS_IN_ARRAY_NOT_SUPPORTED_YET` | NULL values in arrays not supported | + +### Protocol Errors + +| Protocol Errors | Description | +| --------------------------------------- | --------------------------- | +| `ERR_POSTGRES_EXPECTED_REQUEST` | Expected client request | +| `ERR_POSTGRES_EXPECTED_STATEMENT` | Expected prepared statement | +| `ERR_POSTGRES_INVALID_BACKEND_KEY_DATA` | Invalid backend key data | +| `ERR_POSTGRES_INVALID_MESSAGE` | Invalid protocol message | +| `ERR_POSTGRES_INVALID_MESSAGE_LENGTH` | Invalid message length | +| `ERR_POSTGRES_UNEXPECTED_MESSAGE` | Unexpected message type | + +### Transaction Errors + +| Transaction Errors | Description | +| ---------------------------------------- | ------------------------------------- | +| `ERR_POSTGRES_UNSAFE_TRANSACTION` | Unsafe transaction operation detected | +| `ERR_POSTGRES_INVALID_TRANSACTION_STATE` | Invalid transaction state | + +## Numbers and BigInt + +Bun's SQL client includes special handling for large numbers that exceed the range of a 53-bit integer. Here's how it works: + +```ts +import { sql } from "bun"; + +const [{ x, y }] = await sql`SELECT 9223372036854777 as x, 12345 as y`; + +console.log(typeof x, x); // "string" "9223372036854777" +console.log(typeof y, y); // "number" 12345 +``` + +## BigInt Instead of Strings + +If you need large numbers as BigInt instead of strings, you can enable this by setting the `bigint` option to `true` when initializing the SQL client: + +```ts +const sql = new SQL({ + bigint: true, +}); + +const [{ x }] = await sql`SELECT 9223372036854777 as x`; + +console.log(typeof x, x); // "bigint" 9223372036854777n +``` + +## Roadmap + +There's still some things we haven't finished yet. + +- Connection preloading via `--db-preconnect` Bun CLI flag +- MySQL support: [we're working on it](https://github.com/oven-sh/bun/pull/15274) +- SQLite support: planned, but not started. Ideally, we implement it natively instead of wrapping `bun:sqlite`. +- Column name transforms (e.g. `snake_case` to `camelCase`). This is mostly blocked on a unicode-aware implementation of changing the case in C++ using WebKit's `WTF::String`. +- Column type transforms + +### Postgres-specific features + +We haven't implemented these yet: + +- `COPY` support +- `LISTEN` support +- `NOTIFY` support + +We also haven't implemented some of the more uncommon features like: + +- GSSAPI authentication +- `SCRAM-SHA-256-PLUS` support +- Point & PostGIS types +- All the multi-dimensional integer array types (only a couple of the types are supported) + +## Frequently Asked Questions + +> Why is this `Bun.sql` and not `Bun.postgres`? + +The plan is to add more database drivers in the future. + +> Why not just use an existing library? + +npm packages like postgres.js, pg, and node-postgres can be used in Bun too. They're great options. + +Two reasons why: + +1. We think it's simpler for developers to have a database driver built into Bun. The time you spend library shopping is time you could be building your app. +2. We leverage some JavaScriptCore engine internals to make it faster to create objects that would be difficult to implement in a library + +## Credits + +Huge thanks to [@porsager](https://github.com/porsager)'s [postgres.js](https://github.com/porsager/postgres) for the inspiration for the API interface. diff --git a/docs/api/sqlite.md b/docs/api/sqlite.md index 553ca03902..f9a707d27c 100644 --- a/docs/api/sqlite.md +++ b/docs/api/sqlite.md @@ -75,14 +75,14 @@ To instead throw an error when a parameter is missing and allow binding without import { Database } from "bun:sqlite"; const strict = new Database( - ":memory:", + ":memory:", { strict: true } ); // throws error because of the typo: const query = strict .query("SELECT $message;") - .all({ messag: "Hello world" }); + .all({ message: "Hello world" }); const notStrict = new Database( ":memory:" @@ -90,7 +90,7 @@ const notStrict = new Database( // does not throw error: notStrict .query("SELECT $message;") - .all({ messag: "Hello world" }); + .all({ message: "Hello world" }); ``` ### Load via ES module import @@ -177,7 +177,7 @@ const query = db.prepare("SELECT * FROM foo WHERE bar = ?"); ## WAL mode -SQLite supports [write-ahead log mode](https://www.sqlite.org/wal.html) (WAL) which dramatically improves performance, especially in situations with many concurrent writes. It's broadly recommended to enable WAL mode for most typical applications. +SQLite supports [write-ahead log mode](https://www.sqlite.org/wal.html) (WAL) which dramatically improves performance, especially in situations with many concurrent readers and a single writer. It's broadly recommended to enable WAL mode for most typical applications. To enable WAL mode, run this pragma query at the beginning of your application: @@ -325,6 +325,28 @@ As a performance optimization, the class constructor is not called, default init The database columns are set as properties on the class instance. +### `.iterate()` (`@@iterator`) + +Use `.iterate()` to run a query and incrementally return results. This is useful for large result sets that you want to process one row at a time without loading all the results into memory. + +```ts +const query = db.query("SELECT * FROM foo"); +for (const row of query.iterate()) { + console.log(row); +} +``` + +You can also use the `@@iterator` protocol: + +```ts +const query = db.query("SELECT * FROM foo"); +for (const row of query) { + console.log(row); +} +``` + +This feature was added in Bun v1.1.31. + ### `.values()` Use `values()` to run a query and get back all results as an array of arrays. @@ -419,7 +441,7 @@ const results = query.all("hello", "goodbye"); sqlite supports signed 64 bit integers, but JavaScript only supports signed 52 bit integers or arbitrary precision integers with `bigint`. -`bigint` input is supported everywhere, but by default `bun:sqlite` returns integers as `number` types. If you need to handle integers larger than 2^53, set `safeInteger` option to `true` when creating a `Database` instance. This also validates that `bigint` passed to `bun:sqlite` do not exceed 64 bits. +`bigint` input is supported everywhere, but by default `bun:sqlite` returns integers as `number` types. If you need to handle integers larger than 2^53, set `safeIntegers` option to `true` when creating a `Database` instance. This also validates that `bigint` passed to `bun:sqlite` do not exceed 64 bits. By default, `bun:sqlite` returns integers as `number` types. If you need to handle integers larger than 2^53, you can use the `bigint` type. diff --git a/docs/api/test.md b/docs/api/test.md index 6704d407d6..d9898ffc0f 100644 --- a/docs/api/test.md +++ b/docs/api/test.md @@ -1 +1 @@ -See the [`bun test`](/docs/cli/test) documentation. +See the [`bun test`](https://bun.sh/docs/cli/test) documentation. diff --git a/docs/api/transpiler.md b/docs/api/transpiler.md index 308a4e152d..d24eb4ac2c 100644 --- a/docs/api/transpiler.md +++ b/docs/api/transpiler.md @@ -137,7 +137,8 @@ Each import in the `imports` array has a `path` and `kind`. Bun categories impor - `import-rule`: `@import 'foo.css'` - `url-token`: `url('./foo.png')` +- `entry-point-build`: `import {foo} from 'bun:entry'` +- `entry-point-run`: `bun ./mymodule` --> ## `.scanImports()` @@ -267,7 +268,8 @@ type Import = { // The import was injected by Bun | "internal"  // Entry point (not common) - | "entry-point" + | "entry-point-build" + | "entry-point-run" } const transpiler = new Bun.Transpiler({ loader: "jsx" }); diff --git a/docs/api/utils.md b/docs/api/utils.md index fa28674f86..979e406851 100644 --- a/docs/api/utils.md +++ b/docs/api/utils.md @@ -106,6 +106,57 @@ const ls = Bun.which("ls", { console.log(ls); // null ``` +You can think of this as a builtin alternative to the [`which`](https://www.npmjs.com/package/which) npm package. + +## `Bun.randomUUIDv7()` + +`Bun.randomUUIDv7()` returns a [UUID v7](https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-01.html#name-uuidv7-layout-and-bit-order), which is monotonic and suitable for sorting and databases. + +```ts +import { randomUUIDv7 } from "bun"; + +const id = randomUUIDv7(); +// => "0192ce11-26d5-7dc3-9305-1426de888c5a" +``` + +A UUID v7 is a 128-bit value that encodes the current timestamp, a random value, and a counter. The timestamp is encoded using the lowest 48 bits, and the random value and counter are encoded using the remaining bits. + +The `timestamp` parameter defaults to the current time in milliseconds. When the timestamp changes, the counter is reset to a pseudo-random integer wrapped to 4096. This counter is atomic and threadsafe, meaning that using `Bun.randomUUIDv7()` in many Workers within the same process running at the same timestamp will not have colliding counter values. + +The final 8 bytes of the UUID are a cryptographically secure random value. It uses the same random number generator used by `crypto.randomUUID()` (which comes from BoringSSL, which in turn comes from the platform-specific system random number generator usually provided by the underlying hardware). + +```ts +namespace Bun { + function randomUUIDv7( + encoding?: "hex" | "base64" | "base64url" = "hex", + timestamp?: number = Date.now(), + ): string; + /** + * If you pass "buffer", you get a 16-byte buffer instead of a string. + */ + function randomUUIDv7( + encoding: "buffer", + timestamp?: number = Date.now(), + ): Buffer; + + // If you only pass a timestamp, you get a hex string + function randomUUIDv7(timestamp?: number = Date.now()): string; +} +``` + +You can optionally set encoding to `"buffer"` to get a 16-byte buffer instead of a string. This can sometimes avoid string conversion overhead. + +```ts#buffer.ts +const buffer = Bun.randomUUIDv7("buffer"); +``` + +`base64` and `base64url` encodings are also supported when you want a slightly shorter string. + +```ts#base64.ts +const base64 = Bun.randomUUIDv7("base64"); +const base64url = Bun.randomUUIDv7("base64url"); +``` + ## `Bun.peek()` `Bun.peek(prom: Promise)` @@ -183,7 +234,7 @@ const currentFile = import.meta.url; Bun.openInEditor(currentFile); ``` -You can override this via the `debug.editor` setting in your [`bunfig.toml`](/docs/runtime/bunfig). +You can override this via the `debug.editor` setting in your [`bunfig.toml`](https://bun.sh/docs/runtime/bunfig). ```toml-diff#bunfig.toml + [debug] @@ -580,6 +631,65 @@ const foo = new Foo(); console.log(foo); // => "foo" ``` +## `Bun.inspect.table(tabularData, properties, options)` + +Format tabular data into a string. Like [`console.table`](https://developer.mozilla.org/en-US/docs/Web/API/console/table_static), except it returns a string rather than printing to the console. + +```ts +console.log( + Bun.inspect.table([ + { a: 1, b: 2, c: 3 }, + { a: 4, b: 5, c: 6 }, + { a: 7, b: 8, c: 9 }, + ]), +); +// +// ┌───┬───┬───┬───┐ +// │ │ a │ b │ c │ +// ├───┼───┼───┼───┤ +// │ 0 │ 1 │ 2 │ 3 │ +// │ 1 │ 4 │ 5 │ 6 │ +// │ 2 │ 7 │ 8 │ 9 │ +// └───┴───┴───┴───┘ +``` + +Additionally, you can pass an array of property names to display only a subset of properties. + +```ts +console.log( + Bun.inspect.table( + [ + { a: 1, b: 2, c: 3 }, + { a: 4, b: 5, c: 6 }, + ], + ["a", "c"], + ), +); +// +// ┌───┬───┬───┐ +// │ │ a │ c │ +// ├───┼───┼───┤ +// │ 0 │ 1 │ 3 │ +// │ 1 │ 4 │ 6 │ +// └───┴───┴───┘ +``` + +You can also conditionally enable ANSI colors by passing `{ colors: true }`. + +```ts +console.log( + Bun.inspect.table( + [ + { a: 1, b: 2, c: 3 }, + { a: 4, b: 5, c: 6 }, + ], + { + colors: true, + }, + ), +); +``` + ## `Bun.nanoseconds()` Returns the number of nanoseconds since the current `bun` process started, as a `number`. Useful for high-precision timing and benchmarking. @@ -661,3 +771,28 @@ console.log(obj); // => { foo: "bar" } ``` Internally, [`structuredClone`](https://developer.mozilla.org/en-US/docs/Web/API/structuredClone) and [`postMessage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) serialize and deserialize the same way. This exposes the underlying [HTML Structured Clone Algorithm](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm) to JavaScript as an ArrayBuffer. + +## `estimateShallowMemoryUsageOf` in `bun:jsc` + +The `estimateShallowMemoryUsageOf` function returns a best-effort estimate of the memory usage of an object in bytes, excluding the memory usage of properties or other objects it references. For accurate per-object memory usage, use `Bun.generateHeapSnapshot`. + +```js +import { estimateShallowMemoryUsageOf } from "bun:jsc"; + +const obj = { foo: "bar" }; +const usage = estimateShallowMemoryUsageOf(obj); +console.log(usage); // => 16 + +const buffer = Buffer.alloc(1024 * 1024); +estimateShallowMemoryUsageOf(buffer); +// => 1048624 + +const req = new Request("https://bun.sh"); +estimateShallowMemoryUsageOf(req); +// => 167 + +const array = Array(1024).fill({ a: 1 }); +// Arrays are usually not stored contiguously in memory, so this will not return a useful value (which isn't a bug). +estimateShallowMemoryUsageOf(array); +// => 16 +``` diff --git a/docs/api/workers.md b/docs/api/workers.md index b20fb78085..6e2efd27d8 100644 --- a/docs/api/workers.md +++ b/docs/api/workers.md @@ -50,6 +50,28 @@ const worker = new Worker("/not-found.js"); The specifier passed to `Worker` is resolved relative to the project root (like typing `bun ./path/to/file.js`). +### `preload` - load modules before the worker starts + +You can pass an array of module specifiers to the `preload` option to load modules before the worker starts. This is useful when you want to ensure some code is always loaded before the application starts, like loading OpenTelemetry, Sentry, DataDog, etc. + +```js +const worker = new Worker("./worker.ts", { + preload: ["./load-sentry.js"], +}); +``` + +Like the `--preload` CLI argument, the `preload` option is processed before the worker starts. + +You can also pass a single string to the `preload` option: + +```js +const worker = new Worker("./worker.ts", { + preload: "./load-sentry.js", +}); +``` + +This feature was added in Bun v1.1.35. + ### `blob:` URLs As of Bun v1.1.13, you can also pass a `blob:` URL to `Worker`. This is useful for creating workers from strings or other sources. @@ -206,3 +228,17 @@ const worker = new Worker("./i-am-smol.ts", { {% details summary="What does `smol` mode actually do?" %} Setting `smol: true` sets `JSC::HeapSize` to be `Small` instead of the default `Large`. {% /details %} + +## `Bun.isMainThread` + +You can check if you're in the main thread by checking `Bun.isMainThread`. + +```ts +if (Bun.isMainThread) { + console.log("I'm the main thread"); +} else { + console.log("I'm in a worker"); +} +``` + +This is useful for conditionally running code based on whether you're in the main thread or not. diff --git a/docs/bundler/css.md b/docs/bundler/css.md new file mode 100644 index 0000000000..6bb0fa5b6d --- /dev/null +++ b/docs/bundler/css.md @@ -0,0 +1,1028 @@ +Bun's bundler has built-in support for CSS with the following features: + +- Transpiling modern/future features to work on all browsers (including vendor prefixing) +- Minification +- CSS Modules +- Tailwind (via a native bundler plugin) + +## Transpiling + +Bun's CSS bundler lets you use modern/future CSS features without having to worry about browser compatibility — all thanks to its transpiling and vendor prefixing features which are enabled by default. + +Bun's CSS parser and bundler is a direct Rust → Zig port of [LightningCSS](https://lightningcss.dev/), with a bundling approach inspired by esbuild. The transpiler converts modern CSS syntax into backwards-compatible equivalents that work across browsers. + +A huge thanks goes to the amazing work from the authors of [LightningCSS](https://lightningcss.dev/) and [esbuild](https://esbuild.github.io/). + +### Browser Compatibility + +By default, Bun's CSS bundler targets the following browsers: + +- ES2020 +- Edge 88+ +- Firefox 78+ +- Chrome 87+ +- Safari 14+ + +### Syntax Lowering + +#### Nesting + +The CSS Nesting specification allows you to write more concise and intuitive stylesheets by nesting selectors inside one another. Instead of repeating parent selectors across your CSS file, you can write child styles directly within their parent blocks. + +```css +/* With nesting */ +.card { + background: white; + border-radius: 4px; + + .title { + font-size: 1.2rem; + font-weight: bold; + } + + .content { + padding: 1rem; + } +} +``` + +Bun's CSS bundler automatically converts this nested syntax into traditional flat CSS that works in all browsers: + +```css +/* Compiled output */ +.card { + background: white; + border-radius: 4px; +} + +.card .title { + font-size: 1.2rem; + font-weight: bold; +} + +.card .content { + padding: 1rem; +} +``` + +You can also nest media queries and other at-rules inside selectors, eliminating the need to repeat selector patterns: + +```css +.responsive-element { + display: block; + + @media (min-width: 768px) { + display: flex; + } +} +``` + +This compiles to: + +```css +.responsive-element { + display: block; +} + +@media (min-width: 768px) { + .responsive-element { + display: flex; + } +} +``` + +#### Color mix + +The `color-mix()` function gives you an easy way to blend two colors together according to a specified ratio in a chosen color space. This powerful feature lets you create color variations without manually calculating the resulting values. + +```css +.button { + /* Mix blue and red in the RGB color space with a 30/70 proportion */ + background-color: color-mix(in srgb, blue 30%, red); + + /* Create a lighter variant for hover state */ + &:hover { + background-color: color-mix(in srgb, blue 30%, red, white 20%); + } +} +``` + +Bun's CSS bundler evaluates these color mixes at build time when all color values are known (not CSS variables), generating static color values that work in all browsers: + +```css +.button { + /* Computed to the exact resulting color */ + background-color: #b31a1a; +} + +.button:hover { + background-color: #c54747; +} +``` + +This feature is particularly useful for creating color systems with programmatically derived shades, tints, and accents without needing preprocessors or custom tooling. + +#### Relative colors + +CSS now allows you to modify individual components of a color using relative color syntax. This powerful feature lets you create color variations by adjusting specific attributes like lightness, saturation, or individual channels without having to recalculate the entire color. + +```css +.theme-color { + /* Start with a base color and increase lightness by 15% */ + --accent: lch(from purple calc(l + 15%) c h); + + /* Take our brand blue and make a desaturated version */ + --subtle-blue: oklch(from var(--brand-blue) l calc(c * 0.8) h); +} +``` + +Bun's CSS bundler computes these relative color modifications at build time (when not using CSS variables) and generates static color values for browser compatibility: + +```css +.theme-color { + --accent: lch(69.32% 58.34 328.37); + --subtle-blue: oklch(60.92% 0.112 240.01); +} +``` + +This approach is extremely useful for theme generation, creating accessible color variants, or building color scales based on mathematical relationships instead of hard-coding each value. + +#### LAB colors + +Modern CSS supports perceptually uniform color spaces like LAB, LCH, OKLAB, and OKLCH that offer significant advantages over traditional RGB. These color spaces can represent colors outside the standard RGB gamut, resulting in more vibrant and visually consistent designs. + +```css +.vibrant-element { + /* A vibrant red that exceeds sRGB gamut boundaries */ + color: lab(55% 78 35); + + /* A smooth gradient using perceptual color space */ + background: linear-gradient( + to right, + oklch(65% 0.25 10deg), + oklch(65% 0.25 250deg) + ); +} +``` + +Bun's CSS bundler automatically converts these advanced color formats to backwards-compatible alternatives for browsers that don't yet support them: + +```css +.vibrant-element { + /* Fallback to closest RGB approximation */ + color: #ff0f52; + /* P3 fallback for browsers with wider gamut support */ + color: color(display-p3 1 0.12 0.37); + /* Original value preserved for browsers that support it */ + color: lab(55% 78 35); + + background: linear-gradient(to right, #cd4e15, #3887ab); + background: linear-gradient( + to right, + oklch(65% 0.25 10deg), + oklch(65% 0.25 250deg) + ); +} +``` + +This layered approach ensures optimal color rendering across all browsers while allowing you to use the latest color technologies in your designs. + +#### Color function + +The `color()` function provides a standardized way to specify colors in various predefined color spaces, expanding your design options beyond the traditional RGB space. This allows you to access wider color gamuts and create more vibrant designs. + +```css +.vivid-element { + /* Using the Display P3 color space for wider gamut colors */ + color: color(display-p3 1 0.1 0.3); + + /* Using A98 RGB color space */ + background-color: color(a98-rgb 0.44 0.5 0.37); +} +``` + +For browsers that don't support these advanced color functions yet, Bun's CSS bundler provides appropriate RGB fallbacks: + +```css +.vivid-element { + /* RGB fallback first for maximum compatibility */ + color: #fa1a4c; + /* Keep original for browsers that support it */ + color: color(display-p3 1 0.1 0.3); + + background-color: #6a805d; + background-color: color(a98-rgb 0.44 0.5 0.37); +} +``` + +This functionality lets you use modern color spaces immediately while ensuring your designs remain functional across all browsers, with optimal colors displayed in supporting browsers and reasonable approximations elsewhere. + +#### HWB colors + +The HWB (Hue, Whiteness, Blackness) color model provides an intuitive way to express colors based on how much white or black is mixed with a pure hue. Many designers find this approach more natural for creating color variations compared to manipulating RGB or HSL values. + +```css +.easy-theming { + /* Pure cyan with no white or black added */ + --primary: hwb(180 0% 0%); + + /* Same hue, but with 20% white added (tint) */ + --primary-light: hwb(180 20% 0%); + + /* Same hue, but with 30% black added (shade) */ + --primary-dark: hwb(180 0% 30%); + + /* Muted version with both white and black added */ + --primary-muted: hwb(180 30% 20%); +} +``` + +Bun's CSS bundler automatically converts HWB colors to RGB for compatibility with all browsers: + +```css +.easy-theming { + --primary: #00ffff; + --primary-light: #33ffff; + --primary-dark: #00b3b3; + --primary-muted: #339999; +} +``` + +The HWB model makes it particularly easy to create systematic color variations for design systems, providing a more intuitive approach to creating consistent tints and shades than working directly with RGB or HSL values. + +#### Color notation + +Modern CSS has introduced more intuitive and concise ways to express colors. Space-separated color syntax eliminates the need for commas in RGB and HSL values, while hex colors with alpha channels provide a compact way to specify transparency. + +```css +.modern-styling { + /* Space-separated RGB notation (no commas) */ + color: rgb(50 100 200); + + /* Space-separated RGB with alpha */ + border-color: rgba(100 50 200 / 75%); + + /* Hex with alpha channel (8 digits) */ + background-color: #00aaff80; + + /* HSL with simplified notation */ + box-shadow: 0 5px 10px hsl(200 50% 30% / 40%); +} +``` + +Bun's CSS bundler automatically converts these modern color formats to ensure compatibility with older browsers: + +```css +.modern-styling { + /* Converted to comma format for older browsers */ + color: rgb(50, 100, 200); + + /* Alpha channels handled appropriately */ + border-color: rgba(100, 50, 200, 0.75); + + /* Hex+alpha converted to rgba when needed */ + background-color: rgba(0, 170, 255, 0.5); + + box-shadow: 0 5px 10px rgba(38, 115, 153, 0.4); +} +``` + +This conversion process lets you write cleaner, more modern CSS while ensuring your styles work correctly across all browsers. + +#### light-dark() color function + +The `light-dark()` function provides an elegant solution for implementing color schemes that respect the user's system preference without requiring complex media queries. This function accepts two color values and automatically selects the appropriate one based on the current color scheme context. + +```css +:root { + /* Define color scheme support */ + color-scheme: light dark; +} + +.themed-component { + /* Automatically picks the right color based on system preference */ + background-color: light-dark(#ffffff, #121212); + color: light-dark(#333333, #eeeeee); + border-color: light-dark(#dddddd, #555555); +} + +/* Override system preference when needed */ +.light-theme { + color-scheme: light; +} + +.dark-theme { + color-scheme: dark; +} +``` + +For browsers that don't support this feature yet, Bun's CSS bundler converts it to use CSS variables with proper fallbacks: + +```css +:root { + --lightningcss-light: initial; + --lightningcss-dark: ; + color-scheme: light dark; +} + +@media (prefers-color-scheme: dark) { + :root { + --lightningcss-light: ; + --lightningcss-dark: initial; + } +} + +.light-theme { + --lightningcss-light: initial; + --lightningcss-dark: ; + color-scheme: light; +} + +.dark-theme { + --lightningcss-light: ; + --lightningcss-dark: initial; + color-scheme: dark; +} + +.themed-component { + background-color: var(--lightningcss-light, #ffffff) + var(--lightningcss-dark, #121212); + color: var(--lightningcss-light, #333333) var(--lightningcss-dark, #eeeeee); + border-color: var(--lightningcss-light, #dddddd) + var(--lightningcss-dark, #555555); +} +``` + +This approach gives you a clean way to handle light and dark themes without duplicating styles or writing complex media queries, while maintaining compatibility with browsers that don't yet support the feature natively. + +#### Logical properties + +CSS logical properties let you define layout, spacing, and sizing relative to the document's writing mode and text direction rather than physical screen directions. This is crucial for creating truly international layouts that automatically adapt to different writing systems. + +```css +.multilingual-component { + /* Margin that adapts to writing direction */ + margin-inline-start: 1rem; + + /* Padding that makes sense regardless of text direction */ + padding-block: 1rem 2rem; + + /* Border radius for the starting corner at the top */ + border-start-start-radius: 4px; + + /* Size that respects the writing mode */ + inline-size: 80%; + block-size: auto; +} +``` + +For browsers that don't fully support logical properties, Bun's CSS bundler compiles them to physical properties with appropriate directional adjustments: + +```css +/* For left-to-right languages */ +.multilingual-component:dir(ltr) { + margin-left: 1rem; + padding-top: 1rem; + padding-bottom: 2rem; + border-top-left-radius: 4px; + width: 80%; + height: auto; +} + +/* For right-to-left languages */ +.multilingual-component:dir(rtl) { + margin-right: 1rem; + padding-top: 1rem; + padding-bottom: 2rem; + border-top-right-radius: 4px; + width: 80%; + height: auto; +} +``` + +If the `:dir()` selector isn't supported, additional fallbacks are automatically generated to ensure your layouts work properly across all browsers and writing systems. This makes creating internationalized designs much simpler while maintaining compatibility with older browsers. + +#### :dir() selector + +The `:dir()` pseudo-class selector allows you to style elements based on their text direction (RTL or LTR), providing a powerful way to create direction-aware designs without JavaScript. This selector matches elements based on their directionality as determined by the document or explicit direction attributes. + +```css +/* Apply different styles based on text direction */ +.nav-arrow:dir(ltr) { + transform: rotate(0deg); +} + +.nav-arrow:dir(rtl) { + transform: rotate(180deg); +} + +/* Position elements based on text flow */ +.sidebar:dir(ltr) { + border-right: 1px solid #ddd; +} + +.sidebar:dir(rtl) { + border-left: 1px solid #ddd; +} +``` + +For browsers that don't support the `:dir()` selector yet, Bun's CSS bundler converts it to the more widely supported `:lang()` selector with appropriate language mappings: + +```css +/* Converted to use language-based selectors as fallback */ +.nav-arrow:lang(en, fr, de, es, it, pt, nl) { + transform: rotate(0deg); +} + +.nav-arrow:lang(ar, he, fa, ur) { + transform: rotate(180deg); +} + +.sidebar:lang(en, fr, de, es, it, pt, nl) { + border-right: 1px solid #ddd; +} + +.sidebar:lang(ar, he, fa, ur) { + border-left: 1px solid #ddd; +} +``` + +This conversion lets you write direction-aware CSS that works reliably across browsers, even those that don't yet support the `:dir()` selector natively. If multiple arguments to `:lang()` aren't supported, further fallbacks are automatically provided. + +#### :lang() selector + +The `:lang()` pseudo-class selector allows you to target elements based on the language they're in, making it easy to apply language-specific styling. Modern CSS allows the `:lang()` selector to accept multiple language codes, letting you group language-specific rules more efficiently. + +```css +/* Typography adjustments for CJK languages */ +:lang(zh, ja, ko) { + line-height: 1.8; + font-size: 1.05em; +} + +/* Different quote styles by language group */ +blockquote:lang(fr, it, es, pt) { + font-style: italic; +} + +blockquote:lang(de, nl, da, sv) { + font-weight: 500; +} +``` + +For browsers that don't support multiple arguments in the `:lang()` selector, Bun's CSS bundler converts this syntax to use the `:is()` selector to maintain the same behavior: + +```css +/* Multiple languages grouped with :is() for better browser support */ +:is(:lang(zh), :lang(ja), :lang(ko)) { + line-height: 1.8; + font-size: 1.05em; +} + +blockquote:is(:lang(fr), :lang(it), :lang(es), :lang(pt)) { + font-style: italic; +} + +blockquote:is(:lang(de), :lang(nl), :lang(da), :lang(sv)) { + font-weight: 500; +} +``` + +If needed, Bun can provide additional fallbacks for `:is()` as well, ensuring your language-specific styles work across all browsers. This approach simplifies creating internationalized designs with distinct typographic and styling rules for different language groups. + +#### :is() selector + +The `:is()` pseudo-class function (formerly `:matches()`) allows you to create more concise and readable selectors by grouping multiple selectors together. It accepts a selector list as its argument and matches if any of the selectors in that list match, significantly reducing repetition in your CSS. + +```css +/* Instead of writing these separately */ +/* +.article h1, +.article h2, +.article h3 { + margin-top: 1.5em; +} +*/ + +/* You can write this */ +.article :is(h1, h2, h3) { + margin-top: 1.5em; +} + +/* Complex example with multiple groups */ +:is(header, main, footer) :is(h1, h2, .title) { + font-family: "Heading Font", sans-serif; +} +``` + +For browsers that don't support `:is()`, Bun's CSS bundler provides fallbacks using vendor-prefixed alternatives: + +```css +/* Fallback using -webkit-any */ +.article :-webkit-any(h1, h2, h3) { + margin-top: 1.5em; +} + +/* Fallback using -moz-any */ +.article :-moz-any(h1, h2, h3) { + margin-top: 1.5em; +} + +/* Original preserved for modern browsers */ +.article :is(h1, h2, h3) { + margin-top: 1.5em; +} + +/* Complex example with fallbacks */ +:-webkit-any(header, main, footer) :-webkit-any(h1, h2, .title) { + font-family: "Heading Font", sans-serif; +} + +:-moz-any(header, main, footer) :-moz-any(h1, h2, .title) { + font-family: "Heading Font", sans-serif; +} + +:is(header, main, footer) :is(h1, h2, .title) { + font-family: "Heading Font", sans-serif; +} +``` + +It's worth noting that the vendor-prefixed versions have some limitations compared to the standardized `:is()` selector, particularly with complex selectors. Bun handles these limitations intelligently, only using prefixed versions when they'll work correctly. + +#### :not() selector + +The `:not()` pseudo-class allows you to exclude elements that match a specific selector. The modern version of this selector accepts multiple arguments, letting you exclude multiple patterns with a single, concise selector. + +```css +/* Select all buttons except primary and secondary variants */ +button:not(.primary, .secondary) { + background-color: #f5f5f5; + border: 1px solid #ddd; +} + +/* Apply styles to all headings except those inside sidebars or footers */ +h2:not(.sidebar *, footer *) { + margin-top: 2em; +} +``` + +For browsers that don't support multiple arguments in `:not()`, Bun's CSS bundler converts this syntax to a more compatible form while preserving the same behavior: + +```css +/* Converted to use :not with :is() for compatibility */ +button:not(:is(.primary, .secondary)) { + background-color: #f5f5f5; + border: 1px solid #ddd; +} + +h2:not(:is(.sidebar *, footer *)) { + margin-top: 2em; +} +``` + +And if `:is()` isn't supported, Bun can generate further fallbacks: + +```css +/* Even more fallbacks for maximum compatibility */ +button:not(:-webkit-any(.primary, .secondary)) { + background-color: #f5f5f5; + border: 1px solid #ddd; +} + +button:not(:-moz-any(.primary, .secondary)) { + background-color: #f5f5f5; + border: 1px solid #ddd; +} + +button:not(:is(.primary, .secondary)) { + background-color: #f5f5f5; + border: 1px solid #ddd; +} +``` + +This conversion ensures your negative selectors work correctly across all browsers while maintaining the correct specificity and behavior of the original selector. + +#### Math functions + +CSS now includes a rich set of mathematical functions that let you perform complex calculations directly in your stylesheets. These include standard math functions (`round()`, `mod()`, `rem()`, `abs()`, `sign()`), trigonometric functions (`sin()`, `cos()`, `tan()`, `asin()`, `acos()`, `atan()`, `atan2()`), and exponential functions (`pow()`, `sqrt()`, `exp()`, `log()`, `hypot()`). + +```css +.dynamic-sizing { + /* Clamp a value between minimum and maximum */ + width: clamp(200px, 50%, 800px); + + /* Round to the nearest multiple */ + padding: round(14.8px, 5px); + + /* Trigonometry for animations or layouts */ + transform: rotate(calc(sin(45deg) * 50deg)); + + /* Complex math with multiple functions */ + --scale-factor: pow(1.25, 3); + font-size: calc(16px * var(--scale-factor)); +} +``` + +Bun's CSS bundler evaluates these mathematical expressions at build time when all values are known constants (not variables), resulting in optimized output: + +```css +.dynamic-sizing { + width: clamp(200px, 50%, 800px); + padding: 15px; + transform: rotate(35.36deg); + --scale-factor: 1.953125; + font-size: calc(16px * var(--scale-factor)); +} +``` + +This approach lets you write more expressive and maintainable CSS with meaningful mathematical relationships, which then gets compiled to optimized values for maximum browser compatibility and performance. + +#### Media query ranges + +Modern CSS supports intuitive range syntax for media queries, allowing you to specify breakpoints using comparison operators like `<`, `>`, `<=`, and `>=` instead of the more verbose `min-` and `max-` prefixes. This syntax is more readable and matches how we normally think about values and ranges. + +```css +/* Modern syntax with comparison operators */ +@media (width >= 768px) { + .container { + max-width: 720px; + } +} + +/* Inclusive range using <= and >= */ +@media (768px <= width <= 1199px) { + .sidebar { + display: flex; + } +} + +/* Exclusive range using < and > */ +@media (width > 320px) and (width < 768px) { + .mobile-only { + display: block; + } +} +``` + +Bun's CSS bundler converts these modern range queries to traditional media query syntax for compatibility with all browsers: + +```css +/* Converted to traditional min/max syntax */ +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} + +@media (min-width: 768px) and (max-width: 1199px) { + .sidebar { + display: flex; + } +} + +@media (min-width: 321px) and (max-width: 767px) { + .mobile-only { + display: block; + } +} +``` + +This lets you write more intuitive and mathematical media queries while ensuring your stylesheets work correctly across all browsers, including those that don't support the modern range syntax. + +#### Shorthands + +CSS has introduced several modern shorthand properties that improve code readability and maintainability. Bun's CSS bundler ensures these convenient shorthands work on all browsers by converting them to their longhand equivalents when needed. + +```css +/* Alignment shorthands */ +.flex-container { + /* Shorthand for align-items and justify-items */ + place-items: center start; + + /* Shorthand for align-content and justify-content */ + place-content: space-between center; +} + +.grid-item { + /* Shorthand for align-self and justify-self */ + place-self: end center; +} + +/* Two-value overflow */ +.content-box { + /* First value for horizontal, second for vertical */ + overflow: hidden auto; +} + +/* Enhanced text-decoration */ +.fancy-link { + /* Combines multiple text decoration properties */ + text-decoration: underline dotted blue 2px; +} + +/* Two-value display syntax */ +.component { + /* Outer display type + inner display type */ + display: inline flex; +} +``` + +For browsers that don't support these modern shorthands, Bun converts them to their component longhand properties: + +```css +.flex-container { + /* Expanded alignment properties */ + align-items: center; + justify-items: start; + + align-content: space-between; + justify-content: center; +} + +.grid-item { + align-self: end; + justify-self: center; +} + +.content-box { + /* Separate overflow properties */ + overflow-x: hidden; + overflow-y: auto; +} + +.fancy-link { + /* Individual text decoration properties */ + text-decoration-line: underline; + text-decoration-style: dotted; + text-decoration-color: blue; + text-decoration-thickness: 2px; +} + +.component { + /* Single value display */ + display: inline-flex; +} +``` + +This conversion ensures your stylesheets remain clean and maintainable while providing the broadest possible browser compatibility. + +#### Double position gradients + +The double position gradient syntax is a modern CSS feature that allows you to create hard color stops in gradients by specifying the same color at two adjacent positions. This creates a sharp transition rather than a smooth fade, which is useful for creating stripes, color bands, and other multi-color designs. + +```css +.striped-background { + /* Creates a sharp transition from green to red at 30%-40% */ + background: linear-gradient( + to right, + yellow 0%, + green 20%, + green 30%, + red 30%, + /* Double position creates hard stop */ red 70%, + blue 70%, + blue 100% + ); +} + +.progress-bar { + /* Creates distinct color sections */ + background: linear-gradient( + to right, + #4caf50 0% 25%, + /* Green from 0% to 25% */ #ffc107 25% 50%, + /* Yellow from 25% to 50% */ #2196f3 50% 75%, + /* Blue from 50% to 75% */ #9c27b0 75% 100% /* Purple from 75% to 100% */ + ); +} +``` + +For browsers that don't support this syntax, Bun's CSS bundler automatically converts it to the traditional format by duplicating color stops: + +```css +.striped-background { + background: linear-gradient( + to right, + yellow 0%, + green 20%, + green 30%, + red 30%, + /* Split into two color stops */ red 70%, + blue 70%, + blue 100% + ); +} + +.progress-bar { + background: linear-gradient( + to right, + #4caf50 0%, + #4caf50 25%, + /* Two stops for green section */ #ffc107 25%, + #ffc107 50%, + /* Two stops for yellow section */ #2196f3 50%, + #2196f3 75%, + /* Two stops for blue section */ #9c27b0 75%, + #9c27b0 100% /* Two stops for purple section */ + ); +} +``` + +This conversion lets you use the cleaner double position syntax in your source code while ensuring gradients display correctly in all browsers. + +#### system-ui font + +The `system-ui` generic font family lets you use the device's native UI font, creating interfaces that feel more integrated with the operating system. This provides a more native look and feel without having to specify different font stacks for each platform. + +```css +.native-interface { + /* Use the system's default UI font */ + font-family: system-ui; +} + +.fallback-aware { + /* System UI font with explicit fallbacks */ + font-family: system-ui, sans-serif; +} +``` + +For browsers that don't support `system-ui`, Bun's CSS bundler automatically expands it to a comprehensive cross-platform font stack: + +```css +.native-interface { + /* Expanded to support all major platforms */ + font-family: + system-ui, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + "Noto Sans", + Ubuntu, + Cantarell, + "Helvetica Neue"; +} + +.fallback-aware { + /* Preserves the original fallback after the expanded stack */ + font-family: + system-ui, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + "Noto Sans", + Ubuntu, + Cantarell, + "Helvetica Neue", + sans-serif; +} +``` + +This approach gives you the simplicity of writing just `system-ui` in your source code while ensuring your interface adapts correctly to all operating systems and browsers. The expanded font stack includes appropriate system fonts for macOS/iOS, Windows, Android, Linux, and fallbacks for older browsers. + +## CSS Modules + +Bun's bundler also supports bundling [CSS modules](https://css-tricks.com/css-modules-part-1-need/) in addition to [regular CSS](/docs/bundler/css) with support for the following features: + +- Automatically detecting CSS module files (`.module.css`) with zero configuration +- Composition (`composes` property) +- Importing CSS modules into JSX/TSX +- Warnings/errors for invalid usages of CSS modules + +A CSS module is a CSS file (with the `.module.css` extension) where are all class names and animations are scoped to the file. This helps you avoid class name collisions as CSS declarations are globally scoped by default. + +Under the hood, Bun's bundler transforms locally scoped class names into unique identifiers. + +## Getting started + +Create a CSS file with the `.module.css` extension: + +```css +/* styles.module.css */ +.button { + color: red; +} + +/* other-styles.module.css */ +.button { + color: blue; +} +``` + +You can then import this file, for example into a TSX file: + +```tsx +import styles from "./styles.module.css"; +import otherStyles from "./other-styles.module.css"; + +export default function App() { + return ( + <> + + + + ); +} +``` + +The `styles` object from importing the CSS module file will be an object with all class names as keys and +their unique identifiers as values: + +```tsx +import styles from "./styles.module.css"; +import otherStyles from "./other-styles.module.css"; + +console.log(styles); +console.log(otherStyles); +``` + +This will output: + +```ts +{ + button: "button_123"; +} + +{ + button: "button_456"; +} +``` + +As you can see, the class names are unique to each file, avoiding any collisions! + +### Composition + +CSS modules allow you to _compose_ class selectors together. This lets you reuse style rules across multiple classes. + +For example: + +```css +/* styles.module.css */ +.button { + composes: background; + color: red; +} + +.background { + background-color: blue; +} +``` + +Would be the same as writing: + +```css +.button { + background-color: blue; + color: red; +} + +.background { + background-color: blue; +} +``` + +{% callout %} +There are a couple rules to keep in mind when using `composes`: + +- A `composes` property must come before any regular CSS properties or declarations +- You can only use `composes` on a **simple selector with a single class name**: + +```css +#button { + /* Invalid! `#button` is not a class selector */ + composes: background; +} + +.button, +.button-secondary { + /* Invalid! `.button, .button-secondary` is not a simple selector */ + composes: background; +} +``` + +{% /callout %} + +### Composing from a separate CSS module file + +You can also compose from a separate CSS module file: + +```css +/* background.module.css */ +.background { + background-color: blue; +} + +/* styles.module.css */ +.button { + composes: background from "./background.module.css"; + color: red; +} +``` + +{% callout %} +When composing classes from separate files, be sure that they do not contain the same properties. + +The CSS module spec says that composing classes from separate files with conflicting properties is +undefined behavior, meaning that the output may differ and be unreliable. +{% /callout %} diff --git a/docs/bundler/css_modules.md b/docs/bundler/css_modules.md new file mode 100644 index 0000000000..271ab4621d --- /dev/null +++ b/docs/bundler/css_modules.md @@ -0,0 +1,145 @@ +# CSS Modules + +Bun's bundler also supports bundling [CSS modules](https://css-tricks.com/css-modules-part-1-need/) in addition to [regular CSS](/docs/bundler/css) with support for the following features: + +- Automatically detecting CSS module files (`.module.css`) with zero configuration +- Composition (`composes` property) +- Importing CSS modules into JSX/TSX +- Warnings/errors for invalid usages of CSS modules + +A CSS module is a CSS file (with the `.module.css` extension) where are all class names and animations are scoped to the file. This helps you avoid class name collisions as CSS declarations are globally scoped by default. + +Under the hood, Bun's bundler transforms locally scoped class names into unique identifiers. + +## Getting started + +Create a CSS file with the `.module.css` extension: + +```css +/* styles.module.css */ +.button { + color: red; +} + +/* other-styles.module.css */ +.button { + color: blue; +} +``` + +You can then import this file, for example into a TSX file: + +```tsx +import styles from "./styles.module.css"; +import otherStyles from "./other-styles.module.css"; + +export default function App() { + return ( + <> + + + + ); +} +``` + +The `styles` object from importing the CSS module file will be an object with all class names as keys and +their unique identifiers as values: + +```tsx +import styles from "./styles.module.css"; +import otherStyles from "./other-styles.module.css"; + +console.log(styles); +console.log(otherStyles); +``` + +This will output: + +```ts +{ + button: "button_123"; +} + +{ + button: "button_456"; +} +``` + +As you can see, the class names are unique to each file, avoiding any collisions! + +### Composition + +CSS modules allow you to _compose_ class selectors together. This lets you reuse style rules across multiple classes. + +For example: + +```css +/* styles.module.css */ +.button { + composes: background; + color: red; +} + +.background { + background-color: blue; +} +``` + +Would be the same as writing: + +```css +.button { + background-color: blue; + color: red; +} + +.background { + background-color: blue; +} +``` + +{% callout %} +There are a couple rules to keep in mind when using `composes`: + +- A `composes` property must come before any regular CSS properties or declarations +- You can only use `composes` on a **simple selector with a single class name**: + +```css +#button { + /* Invalid! `#button` is not a class selector */ + composes: background; +} + +.button, +.button-secondary { + /* Invalid! `.button, .button-secondary` is not a simple selector */ + composes: background; +} +``` + +{% /callout %} + +### Composing from a separate CSS module file + +You can also compose from a separate CSS module file: + +```css +/* background.module.css */ +.background { + background-color: blue; +} + +/* styles.module.css */ +.button { + composes: background from "./background.module.css"; + color: red; +} +``` + +{% callout %} +When composing classes from separate files, be sure that they do not contain the same properties. + +The CSS module spec says that composing classes from separate files with conflicting properties is +undefined behavior, meaning that the output may differ and be unreliable. +{% /callout %} diff --git a/docs/bundler/executables.md b/docs/bundler/executables.md index 7a7f05693f..b30057caa9 100644 --- a/docs/bundler/executables.md +++ b/docs/bundler/executables.md @@ -75,14 +75,16 @@ bun build --compile --target=bun-darwin-x64 ./path/to/my/app.ts --outfile myapp The order of the `--target` flag does not matter, as long as they're delimited by a `-`. -| --target | Operating System | Architecture | Modern | Baseline | -| --------------------- | ---------------- | ------------ | ------ | -------- | -| bun-linux-x64 | Linux | x64 | ✅ | ✅ | -| bun-linux-arm64 | Linux | arm64 | ✅ | N/A | -| bun-windows-x64 | Windows | x64 | ✅ | ✅ | -| ~~bun-windows-arm64~~ | Windows | arm64 | ❌ | ❌ | -| bun-darwin-x64 | macOS | x64 | ✅ | ✅ | -| bun-darwin-arm64 | macOS | arm64 | ✅ | N/A | +| --target | Operating System | Architecture | Modern | Baseline | Libc | +| --------------------- | ---------------- | ------------ | ------ | -------- | ----- | +| bun-linux-x64 | Linux | x64 | ✅ | ✅ | glibc | +| bun-linux-arm64 | Linux | arm64 | ✅ | N/A | glibc | +| bun-windows-x64 | Windows | x64 | ✅ | ✅ | - | +| ~~bun-windows-arm64~~ | Windows | arm64 | ❌ | ❌ | - | +| bun-darwin-x64 | macOS | x64 | ✅ | ✅ | - | +| bun-darwin-arm64 | macOS | arm64 | ✅ | N/A | - | +| bun-linux-x64-musl | Linux | x64 | ✅ | ✅ | musl | +| bun-linux-arm64-musl | Linux | arm64 | ✅ | N/A | musl | On x64 platforms, Bun uses SIMD optimizations which require a modern CPU supporting AVX2 instructions. The `-baseline` build of Bun is for older CPUs that don't support these optimizations. Normally, when you install Bun we automatically detect which version to use but this can be harder to do when cross-compiling since you might not know the target CPU. You usually don't need to worry about it on Darwin x64, but it is relevant for Windows x64 and Linux x64. If you or your users see `"Illegal instruction"` errors, you might need to use the baseline version. @@ -100,12 +102,30 @@ When deploying to production, we recommend the following: bun build --compile --minify --sourcemap ./path/to/my/app.ts --outfile myapp ``` -**What do these flags do?** +### Bytecode compilation + +To improve startup time, enable bytecode compilation: + +```sh +bun build --compile --minify --sourcemap --bytecode ./path/to/my/app.ts --outfile myapp +``` + +Using bytecode compilation, `tsc` starts 2x faster: + +{% image src="https://github.com/user-attachments/assets/dc8913db-01d2-48f8-a8ef-ac4e984f9763" width="689" /%} + +Bytecode compilation moves parsing overhead for large input files from runtime to bundle time. Your app starts faster, in exchange for making the `bun build` command a little slower. It doesn't obscure source code. + +**Experimental:** Bytecode compilation is an experimental feature introduced in Bun v1.1.30. Only `cjs` format is supported (which means no top-level-await). Let us know if you run into any issues! + +### What do these flags do? The `--minify` argument optimizes the size of the transpiled output code. If you have a large application, this can save megabytes of space. For smaller applications, it might still improve start time a little. The `--sourcemap` argument embeds a sourcemap compressed with zstd, so that errors & stacktraces point to their original locations instead of the transpiled location. Bun will automatically decompress & resolve the sourcemap when an error occurs. +The `--bytecode` argument enables bytecode compilation. Every time you run JavaScript code in Bun, JavaScriptCore (the engine) will compile your source code into bytecode. We can move this parsing work from runtime to bundle time, saving you startup time. + ## Worker To use workers in a standalone executable, add the worker's entrypoint to the CLI arguments: @@ -178,6 +198,8 @@ import icon from "./icon.png" with { type: "file" }; import { file } from "bun"; const bytes = await file(icon).arrayBuffer(); +// await fs.promises.readFile(icon) +// fs.readFileSync(icon) ``` ### Embed SQLite databases @@ -261,6 +283,68 @@ $ bun build --compile --asset-naming="[name].[ext]" ./index.ts To trim down the size of the executable a little, pass `--minify` to `bun build --compile`. This uses Bun's minifier to reduce the code size. Overall though, Bun's binary is still way too big and we need to make it smaller. +## Windows-specific flags + +When compiling a standalone executable on Windows, there are two platform-specific options that can be used to customize metadata on the generated `.exe` file: + +- `--windows-icon=path/to/icon.ico` to customize the executable file icon. +- `--windows-hide-console` to disable the background terminal, which can be used for applications that do not need a TTY. + +{% callout %} + +These flags currently cannot be used when cross-compiling because they depend on Windows APIs. + +{% /callout %} + +## Code signing on macOS + +To codesign a standalone executable on macOS (which fixes Gatekeeper warnings), use the `codesign` command. + +```sh +$ codesign --deep --force -vvvv --sign "XXXXXXXXXX" ./myapp +``` + +We recommend including an `entitlements.plist` file with JIT permissions. + +```xml#entitlements.plist + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.disable-executable-page-protection + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.cs.disable-library-validation + + + +``` + +To codesign with JIT support, pass the `--entitlements` flag to `codesign`. + +```sh +$ codesign --deep --force -vvvv --sign "XXXXXXXXXX" --entitlements entitlements.plist ./myapp +``` + +After codesigning, verify the executable: + +```sh +$ codesign -vvv --verify ./myapp +./myapp: valid on disk +./myapp: satisfies its Designated Requirement +``` + +{% callout %} + +Codesign support requires Bun v1.2.4 or newer. + +{% /callout %} + ## Unsupported CLI arguments Currently, the `--compile` flag can only accept a single entrypoint at a time and does not support the following flags: diff --git a/docs/bundler/fullstack.md b/docs/bundler/fullstack.md new file mode 100644 index 0000000000..b498305561 --- /dev/null +++ b/docs/bundler/fullstack.md @@ -0,0 +1,312 @@ +Using `Bun.serve()`'s `routes` option, you can run your frontend and backend in the same app with no extra steps. + +To get started, import HTML files and pass them to the `routes` option in `Bun.serve()`. + +```ts +import { sql, serve } from "bun"; +import dashboard from "./dashboard.html"; +import homepage from "./index.html"; + +const server = serve({ + routes: { + // ** HTML imports ** + // Bundle & route index.html to "/". This uses HTMLRewriter to scan the HTML for ` + + + +``` + +Becomes something like this: + +```html#index.html + + + + Home + + + +
+ + + +``` + +### How to use with React + +To use React in your client-side code, import `react-dom/client` and render your app. + +{% codetabs %} + +```ts#src/backend.ts +import dashboard from "../public/dashboard.html"; +import { serve } from "bun"; + +serve({ + routes: { + "/": dashboard, + }, + + async fetch(req) { + // ...api requests + return new Response("hello world"); + }, +}); +``` + +```ts#src/frontend.tsx +import "./styles.css"; +import { createRoot } from "react-dom/client"; +import { App } from "./app.tsx"; + +document.addEventListener("DOMContentLoaded", () => { + const root = createRoot(document.getElementById("root")); + root.render(); +}); +``` + +```html#public/dashboard.html + + + + Dashboard + + +
+ + + +``` + +```css#src/styles.css +body { + background-color: red; +} +``` + +```tsx#src/app.tsx +export function App() { + return
Hello World
; +} +``` + +{% /codetabs %} + +### Development mode + +When building locally, enable development mode by setting `development: true` in `Bun.serve()`. + +```js-diff +import homepage from "./index.html"; +import dashboard from "./dashboard.html"; + +Bun.serve({ + routes: { + "/": homepage, + "/dashboard": dashboard, + } + ++ development: true, + + fetch(req) { + // ... api requests + }, +}); +``` + +When `development` is `true`, Bun will: + +- Include the `SourceMap` header in the response so that devtools can show the original source code +- Disable minification +- Re-bundle assets on each request to a .html file + +#### Production mode + +When serving your app in production, set `development: false` in `Bun.serve()`. + +- Enable in-memory caching of bundled assets. Bun will bundle assets lazily on the first request to an `.html` file, and cache the result in memory until the server restarts. +- Enables `Cache-Control` headers and `ETag` headers +- Minifies JavaScript/TypeScript/TSX/JSX files + +## Plugins + +Bun's [bundler plugins](https://bun.sh/docs/bundler/plugins) are also supported when bundling static routes. + +To configure plugins for `Bun.serve`, add a `plugins` array in the `[serve.static]` section of your `bunfig.toml`. + +### Using TailwindCSS in HTML routes + +For example, enable TailwindCSS on your routes by installing and adding the `bun-plugin-tailwind` plugin: + +```sh +$ bun add bun-plugin-tailwind +``` + +```toml#bunfig.toml +[serve.static] +plugins = ["bun-plugin-tailwind"] +``` + +This will allow you to use TailwindCSS utility classes in your HTML and CSS files. All you need to do is import `tailwindcss` somewhere: + +```html#index.html + + + + Home + + + + + + +``` + +Or in your CSS: + +```css#style.css +@import "tailwindcss"; +``` + +### Custom plugins + +Any JS file or module which exports a [valid bundler plugin object](https://bun.sh/docs/bundler/plugins#usage) (essentially an object with a `name` and `setup` field) can be placed inside the `plugins` array: + +```toml#bunfig.toml +[serve.static] +plugins = ["./my-plugin-implementation.ts"] +``` + +Bun will lazily resolve and load each plugin and use them to bundle your routes. + +Note: this is currently in `bunfig.toml` to make it possible to know statically which plugins are in use when we eventually integrate this with the `bun build` CLI. These plugins work in `Bun.build()`'s JS API, but are not yet supported in the CLI. + +## How this works + +Bun uses [`HTMLRewriter`](/docs/api/html-rewriter) to scan for ` + ``` + +2. **`` processing** + + - Processes CSS imports and `` tags + - Concatenates CSS files + - Rewrites `url` and asset paths to include content-addressable hashes in URLs + + ```html + + ``` + +3. **`` & asset processing** + + - Links to assets are rewritten to include content-addressable hashes in URLs + - Small assets in CSS files are inlined into `data:` URLs, reducing the total number of HTTP requests sent over the wire + +4. **Rewrite HTML** + + - Combines all ` + + + + + +``` + +To get started, pass HTML files to `bun`. + +{% bunDevServerTerminal alt="bun ./index.html" path="./index.html" routes="" /%} + +Bun's development server provides powerful features with zero configuration: + +- **Automatic Bundling** - Bundles and serves your HTML, JavaScript, and CSS +- **Multi-Entry Support** - Handles multiple HTML entry points and glob entry points +- **Modern JavaScript** - TypeScript & JSX support out of the box +- **Smart Configuration** - Reads `tsconfig.json` for paths, JSX options, experimental decorators, and more +- **Plugins** - Plugins for TailwindCSS and more +- **ESM & CommonJS** - Use ESM and CommonJS in your JavaScript, TypeScript, and JSX files +- **CSS Bundling & Minification** - Bundles CSS from `` tags and `@import` statements +- **Asset Management** + - Automatic copying & hashing of images and assets + - Rewrites asset paths in JavaScript, CSS, and HTML + +## Single Page Apps (SPA) + +When you pass a single .html file to Bun, Bun will use it as a fallback route for all paths. This makes it perfect for single page apps that use client-side routing: + +{% bunDevServerTerminal alt="bun index.html" path="index.html" routes="" /%} + +Your React or other SPA will work out of the box — no configuration needed. All routes like `/about`, `/users/123`, etc. will serve the same HTML file, letting your client-side router handle the navigation. + +```html#index.html + + + + My SPA + + + +
+ + +``` + +## Multi-page apps (MPA) + +Some projects have several separate routes or HTML files as entry points. To support multiple entry points, pass them all to `bun` + +{% bunDevServerTerminal alt="bun ./index.html ./about.html" path="./index.html ./about.html" routes="[{\"path\": \"/\", \"file\": \"./index.html\"}, {\"path\": \"/about\", \"file\": \"./about.html\"}]" /%} + +This will serve: + +- `index.html` at `/` +- `about.html` at `/about` + +### Glob patterns + +To specify multiple files, you can use glob patterns that end in `.html`: + +{% bunDevServerTerminal alt="bun ./**/*.html" path="./**/*.html" routes="[{\"path\": \"/\", \"file\": \"./index.html\"}, {\"path\": \"/about\", \"file\": \"./about.html\"}]" /%} + +### Path normalization + +The base path is chosen from the longest common prefix among all the files. + +{% bunDevServerTerminal alt="bun ./index.html ./about/index.html ./about/foo/index.html" path="./index.html ./about/index.html ./about/foo/index.html" routes="[{\"path\": \"/\", \"file\": \"./index.html\"}, {\"path\": \"/about\", \"file\": \"./about/index.html\"}, {\"path\": \"/about/foo\", \"file\": \"./about/foo/index.html\"}]" /%} + +## JavaScript, TypeScript, and JSX + +Bun's transpiler natively implements JavaScript, TypeScript, and JSX support. [Learn more about loaders in Bun](/docs/bundler/loaders). + +Bun's transpiler is also used at runtime. + +### ES Modules & CommonJS + +You can use ESM and CJS in your JavaScript, TypeScript, and JSX files. Bun will handle the transpilation and bundling automatically. + +There is no pre-build or separate optimization step. It's all done at the same time. + +Learn more about [module resolution in Bun](/docs/runtime/modules). + +## CSS + +Bun's CSS parser is also natively implemented (clocking in around 58,000 lines of Zig). + +It's also a CSS bundler. You can use `@import` in your CSS files to import other CSS files. + +For example: + +```css#styles.css +@import "./abc.css"; + +.container { + background-color: blue; +} +``` + +```css#abc.css +body { + background-color: red; +} +``` + +This outputs: + +```css#styles.css +body { + background-color: red; +} + +.container { + background-color: blue; +} +``` + +### Referencing local assets in CSS + +You can reference local assets in your CSS files. + +```css#styles.css +body { + background-image: url("./logo.png"); +} +``` + +This will copy `./logo.png` to the output directory and rewrite the path in the CSS file to include a content hash. + +```css#styles.css +body { + background-image: url("./logo-[ABC123].png"); +} +``` + +### Importing CSS in JavaScript + +To associate a CSS file with a JavaScript file, you can import it in your JavaScript file. + +```ts#app.ts +import "./styles.css"; +import "./more-styles.css"; +``` + +This generates `./app.css` and `./app.js` in the output directory. All CSS files imported from JavaScript will be bundled into a single CSS file per entry point. If you import the same CSS file from multiple JavaScript files, it will only be included once in the output CSS file. + +## Plugins + +The dev server supports plugins. + +### Tailwind CSS + +To use TailwindCSS, install the `bun-plugin-tailwind` plugin: + +```bash +# Or any npm client +$ bun install --dev bun-plugin-tailwind +``` + +Then, add the plugin to your `bunfig.toml`: + +```toml +[serve.static] +plugins = ["bun-plugin-tailwind"] +``` + +Then, reference TailwindCSS in your HTML via `` tag, `@import` in CSS, or `import` in JavaScript. + +{% codetabs %} + +```html#index.html + + +``` + +```css#styles.css +/* Import TailwindCSS in your CSS */ +@import "tailwindcss"; +``` + +```ts#app.ts +/* Import TailwindCSS in your JavaScript */ +import "tailwindcss"; +``` + +{% /codetabs %} + +Only one of those are necessary, not all three. + +## Keyboard Shortcuts + +While the server is running: + +- `o + Enter` - Open in browser +- `c + Enter` - Clear console +- `q + Enter` (or Ctrl+C) - Quit server + +## Build for Production + +When you're ready to deploy, use `bun build` to create optimized production bundles: + +{% codetabs %} + +```bash#CLI +$ bun build ./index.html --minify --outdir=dist +``` + +```ts#API +Bun.build({ + entrypoints: ["./index.html"], + outdir: "./dist", + minify: { + whitespace: true, + identifiers: true, + syntax: true, + } +}); +``` + +{% /codetabs %} + +Currently, plugins are only supported through `Bun.build`'s API or through `bunfig.toml` with the frontend dev server - not yet supported in `bun build`'s CLI. + +### Watch Mode + +You can run `bun build --watch` to watch for changes and rebuild automatically. This works nicely for library development. + +You've never seen a watch mode this fast. + +### Plugin API + +Need more control? Configure the bundler through the JavaScript API and use Bun's builtin `HTMLRewriter` to preprocess HTML. + +```ts +await Bun.build({ + entrypoints: ["./index.html"], + outdir: "./dist", + minify: true, + + plugins: [ + { + // A plugin that makes every HTML tag lowercase + name: "lowercase-html-plugin", + setup({ onLoad }) { + const rewriter = new HTMLRewriter().on("*", { + element(element) { + element.tagName = element.tagName.toLowerCase(); + }, + text(element) { + element.replace(element.text.toLowerCase()); + }, + }); + + onLoad({ filter: /\.html$/ }, async args => { + const html = await Bun.file(args.path).text(); + + return { + // Bun's bundler will scan the HTML for + + +``` + +{% /codetabs %} + +It will output a new HTML file with the bundled assets: + +{% codetabs %} + +```html#dist/output.html + + + + Local image + External image + + + +``` + +{% /codetabs %} + +Under the hood, it uses [`lol-html`](https://github.com/cloudflare/lol-html) to extract script and link tags as entrypoints, and other assets as external. + +Currently, the list of selectors is: + +- `audio[src]` +- `iframe[src]` +- `img[src]` +- `img[srcset]` +- `link:not([rel~='stylesheet']):not([rel~='modulepreload']):not([rel~='manifest']):not([rel~='icon']):not([rel~='apple-touch-icon'])[href]` +- `link[as='font'][href], link[type^='font/'][href]` +- `link[as='image'][href]` +- `link[as='style'][href]` +- `link[as='video'][href], link[as='audio'][href]` +- `link[as='worker'][href]` +- `link[rel='icon'][href], link[rel='apple-touch-icon'][href]` +- `link[rel='manifest'][href]` +- `link[rel='stylesheet'][href]` +- `script[src]` +- `source[src]` +- `source[srcset]` +- `video[poster]` +- `video[src]` + ### `sh` loader **Bun Shell loader**. Default for `.sh` files -This loader is used to parse [Bun Shell](/docs/runtime/shell) scripts. It's only supported when starting Bun itself, so it's not available in the bundler or in the runtime. +This loader is used to parse [Bun Shell](https://bun.sh/docs/runtime/shell) scripts. It's only supported when starting Bun itself, so it's not available in the bundler or in the runtime. ```sh $ bun run ./script.sh @@ -263,7 +322,7 @@ If a value is specified for `publicPath`, the import will use value as a prefix {% /table %} {% callout %} -The location and file name of the copied file is determined by the value of [`naming.asset`](/docs/bundler#naming). +The location and file name of the copied file is determined by the value of [`naming.asset`](https://bun.sh/docs/bundler#naming). {% /callout %} This loader is copied into the `outdir` as-is. The name of the copied file is determined using the value of `naming.asset`. diff --git a/docs/bundler/plugins.md b/docs/bundler/plugins.md index 4c27378947..8ea89a4b42 100644 --- a/docs/bundler/plugins.md +++ b/docs/bundler/plugins.md @@ -2,11 +2,47 @@ Bun provides a universal plugin API that can be used to extend both the _runtime Plugins intercept imports and perform custom loading logic: reading files, transpiling code, etc. They can be used to add support for additional file types, like `.scss` or `.yaml`. In the context of Bun's bundler, plugins can be used to implement framework-level features like CSS extraction, macros, and client-server code co-location. -For more complete documentation of the Plugin API, see [Runtime > Plugins](/docs/runtime/plugins). +## Lifecycle hooks + +Plugins can register callbacks to be run at various points in the lifecycle of a bundle: + +- [`onStart()`](#onstart): Run once the bundler has started a bundle +- [`onResolve()`](#onresolve): Run before a module is resolved +- [`onLoad()`](#onload): Run before a module is loaded. +- [`onBeforeParse()`](#onbeforeparse): Run zero-copy native addons in the parser thread before a file is parsed. + +### Reference + +A rough overview of the types (please refer to Bun's `bun.d.ts` for the full type definitions): + +```ts +type PluginBuilder = { + onStart(callback: () => void): void; + onResolve: ( + args: { filter: RegExp; namespace?: string }, + callback: (args: { path: string; importer: string }) => { + path: string; + namespace?: string; + } | void, + ) => void; + onLoad: ( + args: { filter: RegExp; namespace?: string }, + defer: () => Promise, + callback: (args: { path: string }) => { + loader?: Loader; + contents?: string; + exports?: Record; + }, + ) => void; + config: BuildConfig; +}; + +type Loader = "js" | "jsx" | "ts" | "tsx" | "css" | "json" | "toml"; +``` ## Usage -A plugin is defined as simple JavaScript object containing a `name` property and a `setup` function. Register a plugin with Bun using the `plugin` function. +A plugin is defined as simple JavaScript object containing a `name` property and a `setup` function. ```tsx#myPlugin.ts import type { BunPlugin } from "bun"; @@ -22,9 +58,343 @@ const myPlugin: BunPlugin = { This plugin can be passed into the `plugins` array when calling `Bun.build`. ```ts -Bun.build({ +await Bun.build({ entrypoints: ["./app.ts"], outdir: "./out", plugins: [myPlugin], }); ``` + +## Plugin lifecycle + +### Namespaces + +`onLoad` and `onResolve` accept an optional `namespace` string. What is a namespace? + +Every module has a namespace. Namespaces are used to prefix the import in transpiled code; for instance, a loader with a `filter: /\.yaml$/` and `namespace: "yaml:"` will transform an import from `./myfile.yaml` into `yaml:./myfile.yaml`. + +The default namespace is `"file"` and it is not necessary to specify it, for instance: `import myModule from "./my-module.ts"` is the same as `import myModule from "file:./my-module.ts"`. + +Other common namespaces are: + +- `"bun"`: for Bun-specific modules (e.g. `"bun:test"`, `"bun:sqlite"`) +- `"node"`: for Node.js modules (e.g. `"node:fs"`, `"node:path"`) + +### `onStart` + +```ts +onStart(callback: () => void): Promise | void; +``` + +Registers a callback to be run when the bundler starts a new bundle. + +```ts +import { plugin } from "bun"; + +plugin({ + name: "onStart example", + + setup(build) { + build.onStart(() => { + console.log("Bundle started!"); + }); + }, +}); +``` + +The callback can return a `Promise`. After the bundle process has initialized, the bundler waits until all `onStart()` callbacks have completed before continuing. + +For example: + +```ts +const result = await Bun.build({ + entrypoints: ["./app.ts"], + outdir: "./dist", + sourcemap: "external", + plugins: [ + { + name: "Sleep for 10 seconds", + setup(build) { + build.onStart(async () => { + await Bunlog.sleep(10_000); + }); + }, + }, + { + name: "Log bundle time to a file", + setup(build) { + build.onStart(async () => { + const now = Date.now(); + await Bun.$`echo ${now} > bundle-time.txt`; + }); + }, + }, + ], +}); +``` + +In the above example, Bun will wait until the first `onStart()` (sleeping for 10 seconds) has completed, _as well as_ the second `onStart()` (writing the bundle time to a file). + +Note that `onStart()` callbacks (like every other lifecycle callback) do not have the ability to modify the `build.config` object. If you want to mutate `build.config`, you must do so directly in the `setup()` function. + +### `onResolve` + +```ts +onResolve( + args: { filter: RegExp; namespace?: string }, + callback: (args: { path: string; importer: string }) => { + path: string; + namespace?: string; + } | void, +): void; +``` + +To bundle your project, Bun walks down the dependency tree of all modules in your project. For each imported module, Bun actually has to find and read that module. The "finding" part is known as "resolving" a module. + +The `onResolve()` plugin lifecycle callback allows you to configure how a module is resolved. + +The first argument to `onResolve()` is an object with a `filter` and [`namespace`](#what-is-a-namespace) property. The filter is a regular expression which is run on the import string. Effectively, these allow you to filter which modules your custom resolution logic will apply to. + +The second argument to `onResolve()` is a callback which is run for each module import Bun finds that matches the `filter` and `namespace` defined in the first argument. + +The callback receives as input the _path_ to the matching module. The callback can return a _new path_ for the module. Bun will read the contents of the _new path_ and parse it as a module. + +For example, redirecting all imports to `images/` to `./public/images/`: + +```ts +import { plugin } from "bun"; + +plugin({ + name: "onResolve example", + setup(build) { + build.onResolve({ filter: /.*/, namespace: "file" }, args => { + if (args.path.startsWith("images/")) { + return { + path: args.path.replace("images/", "./public/images/"), + }; + } + }); + }, +}); +``` + +### `onLoad` + +```ts +onLoad( + args: { filter: RegExp; namespace?: string }, + defer: () => Promise, + callback: (args: { path: string, importer: string, namespace: string, kind: ImportKind }) => { + loader?: Loader; + contents?: string; + exports?: Record; + }, +): void; +``` + +After Bun's bundler has resolved a module, it needs to read the contents of the module and parse it. + +The `onLoad()` plugin lifecycle callback allows you to modify the _contents_ of a module before it is read and parsed by Bun. + +Like `onResolve()`, the first argument to `onLoad()` allows you to filter which modules this invocation of `onLoad()` will apply to. + +The second argument to `onLoad()` is a callback which is run for each matching module _before_ Bun loads the contents of the module into memory. + +This callback receives as input the _path_ to the matching module, the _importer_ of the module (the module that imported the module), the _namespace_ of the module, and the _kind_ of the module. + +The callback can return a new `contents` string for the module as well as a new `loader`. + +For example: + +```ts +import { plugin } from "bun"; + +const envPlugin: BunPlugin = { + name: "env plugin", + setup(build) { + build.onLoad({ filter: /env/, namespace: "file" }, args => { + return { + contents: `export default ${JSON.stringify(process.env)}`, + loader: "js", + }; + }); + }, +}); + +Bun.build({ + entrypoints: ["./app.ts"], + outdir: "./dist", + plugins: [envPlugin], +}); + +// import env from "env" +// env.FOO === "bar" +``` + +This plugin will transform all imports of the form `import env from "env"` into a JavaScript module that exports the current environment variables. + +#### `.defer()` + +One of the arguments passed to the `onLoad` callback is a `defer` function. This function returns a `Promise` that is resolved when all _other_ modules have been loaded. + +This allows you to delay execution of the `onLoad` callback until all other modules have been loaded. + +This is useful for returning contents of a module that depends on other modules. + +##### Example: tracking and reporting unused exports + +```ts +import { plugin } from "bun"; + +plugin({ + name: "track imports", + setup(build) { + const transpiler = new Bun.Transpiler(); + + let trackedImports: Record = {}; + + // Each module that goes through this onLoad callback + // will record its imports in `trackedImports` + build.onLoad({ filter: /\.ts/ }, async ({ path }) => { + const contents = await Bun.file(path).arrayBuffer(); + + const imports = transpiler.scanImports(contents); + + for (const i of imports) { + trackedImports[i.path] = (trackedImports[i.path] || 0) + 1; + } + + return undefined; + }); + + build.onLoad({ filter: /stats\.json/ }, async ({ defer }) => { + // Wait for all files to be loaded, ensuring + // that every file goes through the above `onLoad()` function + // and their imports tracked + await defer(); + + // Emit JSON containing the stats of each import + return { + contents: `export default ${JSON.stringify(trackedImports)}`, + loader: "json", + }; + }); + }, +}); +``` + +Note that the `.defer()` function currently has the limitation that it can only be called once per `onLoad` callback. + +## Native plugins + +One of the reasons why Bun's bundler is so fast is that it is written in native code and leverages multi-threading to load and parse modules in parallel. + +However, one limitation of plugins written in JavaScript is that JavaScript itself is single-threaded. + +Native plugins are written as [NAPI](https://bun.sh/docs/api/node-api) modules and can be run on multiple threads. This allows native plugins to run much faster than JavaScript plugins. + +In addition, native plugins can skip unnecessary work such as the UTF-8 -> UTF-16 conversion needed to pass strings to JavaScript. + +These are the following lifecycle hooks which are available to native plugins: + +- [`onBeforeParse()`](#onbeforeparse): Called on any thread before a file is parsed by Bun's bundler. + +Native plugins are NAPI modules which expose lifecycle hooks as C ABI functions. + +To create a native plugin, you must export a C ABI function which matches the signature of the native lifecycle hook you want to implement. + +### Creating a native plugin in Rust + +Native plugins are NAPI modules which expose lifecycle hooks as C ABI functions. + +To create a native plugin, you must export a C ABI function which matches the signature of the native lifecycle hook you want to implement. + +```bash +bun add -g @napi-rs/cli +napi new +``` + +Then install this crate: + +```bash +cargo add bun-native-plugin +``` + +Now, inside the `lib.rs` file, we'll use the `bun_native_plugin::bun` proc macro to define a function which +will implement our native plugin. + +Here's an example implementing the `onBeforeParse` hook: + +```rs +use bun_native_plugin::{define_bun_plugin, OnBeforeParse, bun, Result, anyhow, BunLoader}; +use napi_derive::napi; + +/// Define the plugin and its name +define_bun_plugin!("replace-foo-with-bar"); + +/// Here we'll implement `onBeforeParse` with code that replaces all occurrences of +/// `foo` with `bar`. +/// +/// We use the #[bun] macro to generate some of the boilerplate code. +/// +/// The argument of the function (`handle: &mut OnBeforeParse`) tells +/// the macro that this function implements the `onBeforeParse` hook. +#[bun] +pub fn replace_foo_with_bar(handle: &mut OnBeforeParse) -> Result<()> { + // Fetch the input source code. + let input_source_code = handle.input_source_code()?; + + // Get the Loader for the file + let loader = handle.output_loader(); + + + let output_source_code = input_source_code.replace("foo", "bar"); + + handle.set_output_source_code(output_source_code, BunLoader::BUN_LOADER_JSX); + + Ok(()) +} +``` + +And to use it in Bun.build(): + +```typescript +import myNativeAddon from "./my-native-addon"; +Bun.build({ + entrypoints: ["./app.tsx"], + plugins: [ + { + name: "my-plugin", + + setup(build) { + build.onBeforeParse( + { + namespace: "file", + filter: "**/*.tsx", + }, + { + napiModule: myNativeAddon, + symbol: "replace_foo_with_bar", + // external: myNativeAddon.getSharedState() + }, + ); + }, + }, + ], +}); +``` + +### `onBeforeParse` + +```ts +onBeforeParse( + args: { filter: RegExp; namespace?: string }, + callback: { napiModule: NapiModule; symbol: string; external?: unknown }, +): void; +``` + +This lifecycle callback is run immediately before a file is parsed by Bun's bundler. + +As input, it receives the file's contents and can optionally return new source code. + +This callback can be called from any thread and so the napi module implementation must be thread-safe. diff --git a/docs/bundler/vs-esbuild.md b/docs/bundler/vs-esbuild.md index da2905bf6e..35bb62f6f7 100644 --- a/docs/bundler/vs-esbuild.md +++ b/docs/bundler/vs-esbuild.md @@ -2,7 +2,7 @@ Bun's bundler API is inspired heavily by [esbuild](https://esbuild.github.io/). There are a few behavioral differences to note. -- **Bundling by default**. Unlike esbuild, Bun _always bundles by default_. This is why the `--bundle` flag isn't necessary in the Bun example. To transpile each file individually, use [`Bun.Transpiler`](/docs/api/transpiler). +- **Bundling by default**. Unlike esbuild, Bun _always bundles by default_. This is why the `--bundle` flag isn't necessary in the Bun example. To transpile each file individually, use [`Bun.Transpiler`](https://bun.sh/docs/api/transpiler). - **It's just a bundler**. Unlike esbuild, Bun's bundler does not include a built-in development server or file watcher. It's just a bundler. The bundler is intended for use in conjunction with `Bun.serve` and other runtime APIs to achieve the same effect. As such, all options relating to HTTP/file watching are not applicable. ## Performance @@ -59,13 +59,13 @@ In Bun's CLI, simple boolean flags like `--minify` do not accept an argument. Ot - `--format` - `--format` -- Bun only supports `"esm"` currently but other module formats are planned. esbuild defaults to `"iife"`. +- Bun supports `"esm"` and `"cjs"` currently, but more module formats are planned. esbuild defaults to `"iife"`. --- - `--loader:.ext=loader` - `--loader .ext:loader` -- Bun supports a different set of built-in loaders than esbuild; see [Bundler > Loaders](/docs/bundler/loaders) for a complete reference. The esbuild loaders `dataurl`, `binary`, `base64`, `copy`, and `empty` are not yet implemented. +- Bun supports a different set of built-in loaders than esbuild; see [Bundler > Loaders](https://bun.sh/docs/bundler/loaders) for a complete reference. The esbuild loaders `dataurl`, `binary`, `base64`, `copy`, and `empty` are not yet implemented. The syntax for `--loader` is slightly different. @@ -154,8 +154,14 @@ In Bun's CLI, simple boolean flags like `--minify` do not accept an argument. Ot --- - `--banner` -- n/a -- Not supported +- `--banner` +- Only applies to js bundles + +--- + +- `--footer` +- `--footer` +- Only applies to js bundles --- @@ -184,8 +190,7 @@ In Bun's CLI, simple boolean flags like `--minify` do not accept an argument. Ot --- - `--drop` -- n/a -- Not supported +- `--drop` --- @@ -195,12 +200,6 @@ In Bun's CLI, simple boolean flags like `--minify` do not accept an argument. Ot --- -- `--footer` -- n/a -- Not supported - ---- - - `--global-name` - n/a - Not applicable, Bun does not support `iife` output at this time @@ -475,7 +474,7 @@ In Bun's CLI, simple boolean flags like `--minify` do not accept an argument. Ot - `bundle` - n/a -- Always `true`. Use [`Bun.Transpiler`](/docs/api/transpiler) to transpile without bundling. +- Always `true`. Use [`Bun.Transpiler`](https://bun.sh/docs/api/transpiler) to transpile without bundling. --- @@ -636,7 +635,7 @@ In Bun's CLI, simple boolean flags like `--minify` do not accept an argument. Ot - `loader` - `loader` -- Bun supports a different set of built-in loaders than esbuild; see [Bundler > Loaders](/docs/bundler/loaders) for a complete reference. The esbuild loaders `dataurl`, `binary`, `base64`, `copy`, and `empty` are not yet implemented. +- Bun supports a different set of built-in loaders than esbuild; see [Bundler > Loaders](https://bun.sh/docs/bundler/loaders) for a complete reference. The esbuild loaders `dataurl`, `binary`, `base64`, `copy`, and `empty` are not yet implemented. --- @@ -696,7 +695,7 @@ In Bun's CLI, simple boolean flags like `--minify` do not accept an argument. Ot - In Bun, `minify` can be a boolean or an object. ```ts - Bun.build({ + await Bun.build({ entrypoints: ['./index.tsx'], // enable all minification minify: true @@ -892,7 +891,7 @@ const myPlugin: BunPlugin = { }; ``` -The `builder` object provides some methods for hooking into parts of the bundling process. Bun implements `onResolve` and `onLoad`; it does not yet implement the esbuild hooks `onStart`, `onEnd`, and `onDispose`, and `resolve` utilities. `initialOptions` is partially implemented, being read-only and only having a subset of esbuild's options; use [`config`](/docs/bundler/plugins) (same thing but with Bun's `BuildConfig` format) instead. +The `builder` object provides some methods for hooking into parts of the bundling process. Bun implements `onResolve` and `onLoad`; it does not yet implement the esbuild hooks `onStart`, `onEnd`, and `onDispose`, and `resolve` utilities. `initialOptions` is partially implemented, being read-only and only having a subset of esbuild's options; use [`config`](https://bun.sh/docs/bundler/plugins) (same thing but with Bun's `BuildConfig` format) instead. ```ts import type { BunPlugin } from "bun"; diff --git a/docs/cli/add.md b/docs/cli/add.md index ff90730d73..72c5cb25d6 100644 --- a/docs/cli/add.md +++ b/docs/cli/add.md @@ -33,6 +33,14 @@ To add a package as an optional dependency (`"optionalDependencies"`): $ bun add --optional lodash ``` +## `--peer` + +To add a package as a peer dependency (`"peerDependencies"`): + +```bash +$ bun add --peer @types/bun +``` + ## `--exact` {% callout %} @@ -161,3 +169,5 @@ This will add the following line to your `package.json`: } } ``` + +{% bunCLIUsage command="add" /%} \ No newline at end of file diff --git a/docs/cli/bun-create.md b/docs/cli/bun-create.md index ab467ad02c..1a38f8f470 100644 --- a/docs/cli/bun-create.md +++ b/docs/cli/bun-create.md @@ -2,9 +2,96 @@ **Note** — You don’t need `bun create` to use Bun. You don’t need any configuration at all. This command exists to make getting started a bit quicker and easier. {% /callout %} -Template a new Bun project with `bun create`. This is a flexible command that can be used to create a new project with a `create-