Skip to content

test: unskip top-level switch test #1280

test: unskip top-level switch test

test: unskip top-level switch test #1280

Workflow file for this run

name: CI
on:
push:
branches: [main, dev]
tags: ["v*"]
pull_request:
branches: [main]
jobs:
format-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm install --ignore-scripts
- run: npx prettier --check .
build-linux-glibc:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install system dependencies
run: |
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
echo "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-21 main" | sudo tee /etc/apt/sources.list.d/llvm-21.list
sudo apt-get update
sudo apt-get install -y llvm-21 llvm-21-dev clang-21 lld-21 \
cmake make gcc g++ \
autoconf automake libtool \
libzstd-dev zlib1g-dev libsqlite3-dev libcurl4-openssl-dev
sudo ln -sf /usr/bin/llc-21 /usr/bin/llc
sudo ln -sf /usr/bin/opt-21 /usr/bin/opt
sudo ln -sf /usr/bin/clang-21 /usr/bin/clang
clang --version 2>&1 | head -2
llc --version 2>&1 | head -4
- name: Install npm dependencies
run: npm install
- name: Cache vendor libraries
uses: actions/cache@v4
with:
path: |
vendor/
c_bridges/*.o
key: vendor-${{ runner.os }}-${{ hashFiles('scripts/build-vendor.sh', 'scripts/vendor-pins.sh', 'c_bridges/*.c') }}
- name: Build vendor libraries
run: bash scripts/build-vendor.sh
- name: Build compiler
run: npm run build
- name: Verify vendor libraries
run: |
fail=0
for lib in vendor/bdwgc/libgc.a vendor/yyjson/libyyjson.a vendor/libuv/build/libuv.a vendor/picohttpparser/picohttpparser.o c_bridges/lws-bridge.o c_bridges/multipart-bridge.o c_bridges/regex-bridge.o c_bridges/child-process-bridge.o c_bridges/child-process-spawn.o c_bridges/os-bridge.o c_bridges/strlen-cache.o c_bridges/time-bridge.o c_bridges/base64-bridge.o c_bridges/url-bridge.o c_bridges/uri-bridge.o c_bridges/dotenv-bridge.o c_bridges/watch-bridge.o; do
if [ ! -f "$lib" ]; then
echo "MISSING: $lib"
fail=1
else
echo "OK: $lib ($(wc -c < "$lib") bytes)"
fi
done
if [ "$fail" -eq 1 ]; then
echo "Vendor library build incomplete - aborting before tests"
exit 1
fi
- name: Build tree-sitter TSX objects
run: |
mkdir -p build
TS_SRC=node_modules/tree-sitter-typescript/tsx/src
TS_INCLUDE=node_modules/tree-sitter-typescript
clang -c -O2 -fPIC -I $TS_SRC -I $TS_INCLUDE $TS_SRC/parser.c -o build/tree-sitter-typescript-parser.o
clang -c -O2 -fPIC -I $TS_SRC -I $TS_INCLUDE $TS_SRC/scanner.c -o build/tree-sitter-typescript-scanner.o
clang -c -O2 -fPIC -I vendor/tree-sitter/lib/include c_bridges/treesitter-bridge.c -o build/treesitter-bridge.o
- name: Build native chad
run: node dist/chad-node.js build src/chad-native.ts -o .build/chad --target-cpu=x86-64
- name: Run unit tests (node compiler)
run: npm run test:node
timeout-minutes: 10
- name: Run unit tests (native compiler)
run: npm run test:native
timeout-minutes: 10
- name: Smoke test native chad
run: |
.build/chad build examples/hello.ts -o /tmp/hello
/tmp/hello
- name: Run examples
run: bash scripts/run-examples.sh
timeout-minutes: 5
- name: Run self-hosting tests
run: node --import tsx --test tests/self-hosting.test.ts
timeout-minutes: 15
- name: Build target SDK
run: bash scripts/build-target-sdk.sh
- name: Package release artifact
run: |
mkdir -p release/lib
cp .build/chad release/
cp build/tree-sitter-typescript-parser.o release/lib/
cp build/tree-sitter-typescript-scanner.o release/lib/
cp build/treesitter-bridge.o release/lib/
cp vendor/tree-sitter/libtree-sitter.a release/lib/
cp vendor/bdwgc/libgc.a release/lib/
cp vendor/yyjson/libyyjson.a release/lib/
cp vendor/libuv/build/libuv.a release/lib/
cp vendor/picohttpparser/picohttpparser.o release/lib/
cp c_bridges/lws-bridge.o release/lib/
cp c_bridges/multipart-bridge.o release/lib/
cp c_bridges/regex-bridge.o release/lib/
cp c_bridges/child-process-bridge.o release/lib/
cp c_bridges/child-process-spawn.o release/lib/
cp c_bridges/os-bridge.o c_bridges/strlen-cache.o release/lib/
cp c_bridges/time-bridge.o c_bridges/base64-bridge.o c_bridges/url-bridge.o c_bridges/uri-bridge.o release/lib/
cp c_bridges/dotenv-bridge.o release/lib/
cp c_bridges/watch-bridge.o release/lib/
tar -czf chadscript-linux-x64.tar.gz -C release chad lib
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: chadscript-linux-x64
path: chadscript-linux-x64.tar.gz
- name: Upload target SDK
uses: actions/upload-artifact@v4
with:
name: chadscript-target-linux-x64
path: chadscript-target-linux-x64.tar.gz
build-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install system dependencies
run: |
brew install llvm cmake autoconf automake libtool zstd
echo "/opt/homebrew/opt/llvm/bin" >> $GITHUB_PATH
echo "/usr/local/opt/llvm/bin" >> $GITHUB_PATH
- name: Install npm dependencies
run: npm install
- name: Cache vendor libraries
uses: actions/cache@v4
with:
path: |
vendor/
c_bridges/*.o
key: vendor-${{ runner.os }}-${{ hashFiles('scripts/build-vendor.sh', 'scripts/vendor-pins.sh', 'c_bridges/*.c') }}
- name: Build vendor libraries
run: bash scripts/build-vendor.sh
- name: Build compiler
run: npm run build
- name: Verify vendor libraries
run: |
fail=0
for lib in vendor/bdwgc/libgc.a vendor/yyjson/libyyjson.a vendor/libuv/build/libuv.a vendor/picohttpparser/picohttpparser.o c_bridges/lws-bridge.o c_bridges/multipart-bridge.o c_bridges/regex-bridge.o c_bridges/child-process-bridge.o c_bridges/child-process-spawn.o c_bridges/os-bridge.o c_bridges/strlen-cache.o c_bridges/time-bridge.o c_bridges/base64-bridge.o c_bridges/url-bridge.o c_bridges/uri-bridge.o c_bridges/dotenv-bridge.o c_bridges/watch-bridge.o; do
if [ ! -f "$lib" ]; then
echo "MISSING: $lib"
fail=1
else
echo "OK: $lib"
fi
done
if [ "$fail" -eq 1 ]; then
echo "Vendor library build incomplete - aborting before tests"
exit 1
fi
- name: Build tree-sitter TSX objects
run: |
mkdir -p build
TS_SRC=node_modules/tree-sitter-typescript/tsx/src
TS_INCLUDE=node_modules/tree-sitter-typescript
clang -c -O2 -fPIC -I $TS_SRC -I $TS_INCLUDE $TS_SRC/parser.c -o build/tree-sitter-typescript-parser.o
clang -c -O2 -fPIC -I $TS_SRC -I $TS_INCLUDE $TS_SRC/scanner.c -o build/tree-sitter-typescript-scanner.o
clang -c -O2 -fPIC -I vendor/tree-sitter/lib/include c_bridges/treesitter-bridge.c -o build/treesitter-bridge.o
- name: Build native chad
run: node dist/chad-node.js build src/chad-native.ts -o .build/chad
- name: Run unit tests (node compiler)
run: npm run test:node
timeout-minutes: 10
- name: Run unit tests (native compiler)
run: npm run test:native
timeout-minutes: 10
- name: Sign macOS binaries
run: |
codesign --sign - --force .build/chad
- name: Smoke test native chad
run: |
.build/chad build examples/hello.ts -o /tmp/hello
/tmp/hello
- name: Run examples
run: bash scripts/run-examples.sh
timeout-minutes: 5
- name: Run self-hosting tests
run: node --import tsx --test tests/self-hosting.test.ts
timeout-minutes: 15
- name: Build target SDK
run: bash scripts/build-target-sdk.sh
- name: Package release artifact
run: |
mkdir -p release/lib
cp .build/chad release/
cp build/tree-sitter-typescript-parser.o release/lib/
cp build/tree-sitter-typescript-scanner.o release/lib/
cp build/treesitter-bridge.o release/lib/
cp vendor/tree-sitter/libtree-sitter.a release/lib/
cp vendor/bdwgc/libgc.a release/lib/
cp vendor/yyjson/libyyjson.a release/lib/
cp vendor/libuv/build/libuv.a release/lib/
cp vendor/picohttpparser/picohttpparser.o release/lib/
cp c_bridges/lws-bridge.o release/lib/
cp c_bridges/multipart-bridge.o release/lib/
cp c_bridges/regex-bridge.o release/lib/
cp c_bridges/child-process-bridge.o release/lib/
cp c_bridges/child-process-spawn.o release/lib/
cp c_bridges/os-bridge.o c_bridges/strlen-cache.o release/lib/
cp c_bridges/time-bridge.o c_bridges/base64-bridge.o c_bridges/url-bridge.o c_bridges/uri-bridge.o release/lib/
cp c_bridges/dotenv-bridge.o release/lib/
cp c_bridges/watch-bridge.o release/lib/
tar -czf chadscript-macos-arm64.tar.gz -C release chad lib
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: chadscript-macos-arm64
path: chadscript-macos-arm64.tar.gz
- name: Upload target SDK
uses: actions/upload-artifact@v4
with:
name: chadscript-target-macos-arm64
path: chadscript-target-macos-arm64.tar.gz
test-artifact:
needs: [build-linux-glibc, build-macos]
strategy:
matrix:
include:
- os: ubuntu-22.04
artifact: chadscript-linux-x64
- os: macos-latest
artifact: chadscript-macos-arm64
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Install system dependencies (Linux)
if: runner.os == 'Linux'
run: |
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
echo "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-21 main" | sudo tee /etc/apt/sources.list.d/llvm-21.list
sudo apt-get update
sudo apt-get install -y llvm-21 clang-21 libsqlite3-dev libzstd-dev zlib1g-dev
sudo ln -sf /usr/bin/llc-21 /usr/bin/llc
sudo ln -sf /usr/bin/opt-21 /usr/bin/opt
sudo ln -sf /usr/bin/clang-21 /usr/bin/clang
- name: Install system dependencies (macOS)
if: runner.os == 'macOS'
run: |
brew install llvm zstd
echo "/opt/homebrew/opt/llvm/bin" >> $GITHUB_PATH
- name: Download artifact
uses: actions/download-artifact@v4
with:
name: ${{ matrix.artifact }}
- name: Install via install.sh
run: |
SKIP_PROMPTS=1 CHADSCRIPT_URL="file://$(pwd)/${{ matrix.artifact }}.tar.gz" bash install.sh
echo "$HOME/.chadscript" >> $GITHUB_PATH
- name: Verify binary
run: |
file ~/.chadscript/chad.bin
ls -la ~/.chadscript/lib/
- name: Verify lib/ contains all required artifacts
run: |
fail=0
for lib in \
libgc.a \
libyyjson.a \
libuv.a \
libtree-sitter.a \
picohttpparser.o \
lws-bridge.o \
multipart-bridge.o \
regex-bridge.o \
child-process-bridge.o \
child-process-spawn.o \
os-bridge.o \
strlen-cache.o \
time-bridge.o \
dotenv-bridge.o \
watch-bridge.o \
tree-sitter-typescript-parser.o \
tree-sitter-typescript-scanner.o \
treesitter-bridge.o; do
if [ ! -f "$HOME/.chadscript/lib/$lib" ]; then
echo "MISSING from release: lib/$lib"
fail=1
else
echo "OK: lib/$lib ($(wc -c < "$HOME/.chadscript/lib/$lib") bytes)"
fi
done
if [ "$fail" -eq 1 ]; then
echo ""
echo "ERROR: Release artifact is missing required library files."
echo "Check the 'Package release artifact' step in the build job."
exit 1
fi
echo ""
echo "All $(ls ~/.chadscript/lib/ | wc -l) library files present."
- name: Smoke test - hello world
run: |
echo 'console.log("Hello from release artifact!");' > /tmp/hello.ts
chad run /tmp/hello.ts
- name: Smoke test - compile to binary
run: |
echo 'process.exit(42);' > /tmp/exit42.ts
chad build /tmp/exit42.ts -o /tmp/exit42
/tmp/exit42 || [ $? -eq 42 ]
- name: Smoke test - JSON bridge (libyyjson)
run: |
cat > /tmp/test-json.ts << 'EOF'
interface JsonObj {
name: string;
version: number;
}
const obj = JSON.parse<JsonObj>('{"name":"chad","version":1}');
const back = JSON.stringify(obj);
if (back.includes("chad")) {
console.log("TEST_PASSED");
}
EOF
OUTPUT=$(chad run /tmp/test-json.ts)
echo "$OUTPUT"
echo "$OUTPUT" | grep -q "TEST_PASSED"
- name: Smoke test - regex bridge
run: |
cat > /tmp/test-regex.ts << 'EOF'
function main(): void {
const re = /hello/;
const result = "hello world".match(re);
if (result !== null && result[0] === "hello") {
console.log("TEST_PASSED");
}
}
main();
EOF
OUTPUT=$(chad run /tmp/test-regex.ts)
echo "$OUTPUT"
echo "$OUTPUT" | grep -q "TEST_PASSED"
- name: Smoke test - child_process bridge
run: |
cat > /tmp/test-execsync.ts << 'EOF'
import { execSync } from "child_process";
function main(): void {
const output = execSync("echo bridge_works");
if (output.trim() === "bridge_works") {
console.log("TEST_PASSED");
}
}
main();
EOF
OUTPUT=$(chad run /tmp/test-execsync.ts)
echo "$OUTPUT"
echo "$OUTPUT" | grep -q "TEST_PASSED"
- name: Smoke test - compile hackernews example (exercises HTTP + sqlite bridges)
run: |
chad build examples/hackernews/app.ts -o /tmp/hackernews
file /tmp/hackernews
echo "Hackernews example compiled successfully"
release:
needs: [build-linux-glibc, build-macos, test-artifact]
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Delete old latest release
run: gh release delete latest --yes --cleanup-tag 2>/dev/null || true
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
- name: Create latest release
run: |
gh release create latest \
--title "Latest Build" \
--notes "Automated release from ${GITHUB_REF_NAME} branch. Download native binaries and target SDKs below." \
--latest \
artifacts/**/*.tar.gz
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
tagged-release:
needs: [build-linux-glibc, build-macos, test-artifact]
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: artifacts/**/*.tar.gz
generate_release_notes: true