diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6bd2c499..344bc969 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -122,6 +122,48 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + publish-npm: + name: Publish CLI to NPM + runs-on: ubuntu-latest + needs: build-release + if: github.event_name == 'release' + permissions: + contents: read + id-token: write + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + registry-url: https://registry.npmjs.org + + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: dist + + - name: Place binaries in zig-out/bin/release + shell: bash + run: | + mkdir -p zig-out/bin/release + for dir in dist/*/; do + for file in "$dir"*; do + case "$file" in + *.tar.gz) tar -xzf "$file" -C zig-out/bin/release ;; + *.zip) unzip -o "$file" -d zig-out/bin/release ;; + esac + done + done + + - name: Prepare and publish @ziex packages + run: | + cd pkg/@ziex + bash prepare.sh + npm publish --workspaces --access public --provenance + sync-templates: name: Sync & Release Templates runs-on: ubuntu-latest diff --git a/pkg/@ziex/.gitignore b/pkg/@ziex/.gitignore index 5ee35b58..c9004144 100644 --- a/pkg/@ziex/.gitignore +++ b/pkg/@ziex/.gitignore @@ -1,10 +1,6 @@ -*/bin/zig -*/bin/zig.exe +*/bin/zx +*/bin/zx.exe */README.md -lib/ -!lib/package.json -.zig-version -.cache/ .verdaccio-storage/ .verdaccio-htpasswd \ No newline at end of file diff --git a/pkg/@ziex/README.md b/pkg/@ziex/README.md index bb1c25d2..1609f5b4 100644 --- a/pkg/@ziex/README.md +++ b/pkg/@ziex/README.md @@ -1,6 +1,6 @@ # @ziex/cli -Ziex CLI Node Package Manager (npm) distribution. +Ziex CLI distribution via NPM. ## Usage @@ -25,6 +25,4 @@ The `@ziex/cli` package resolves the correct native binary for your platform via | `@ziex/cli-linux-x64` | Linux x64 | | `@ziex/cli-linux-arm64` | Linux ARM64 | | `@ziex/cli-win32-x64` | Windows x64 | -| `@ziex/cli-win32-arm64` | Windows ARM64 | - -The standard library is shipped separately in `@ziex/lib` (shared across all platforms). \ No newline at end of file +| `@ziex/cli-win32-arm64` | Windows ARM64 | \ No newline at end of file diff --git a/pkg/@ziex/check.sh b/pkg/@ziex/check.sh new file mode 100644 index 00000000..3de19666 --- /dev/null +++ b/pkg/@ziex/check.sh @@ -0,0 +1,8 @@ +rm -rf tmp +mkdir tmp +cd tmp + +echo "version:" +npx --registry http://localhost:4873 @ziex/cli@dev version +echo -e "\ninit:" +npx --registry http://localhost:4873 @ziex/cli@dev init \ No newline at end of file diff --git a/pkg/@ziex/cli/bin/ziex b/pkg/@ziex/cli/bin/ziex deleted file mode 100755 index dac8e7ce..00000000 --- a/pkg/@ziex/cli/bin/ziex +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env node - -// Stub that delegates to the native zx binary. -// The postinstall script copies it to bin/zx, but if that hasn't run -// (e.g. bunx), we resolve the platform package's binary directly. - -import { execFileSync } from "child_process"; -import { existsSync } from "fs"; -import { createRequire } from "module"; -import { dirname, join } from "path"; -import { fileURLToPath } from "url"; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const require = createRequire(import.meta.url); -const isWindows = process.platform === "win32"; -const ext = isWindows ? ".exe" : ""; - -function findBinary() { - // 1. Check if postinstall already placed the binary - const localBin = join(__dirname, `zx${ext}`); - if (existsSync(localBin)) return localBin; - - // 2. Resolve from the platform-specific optional dependency - const platformPkgs = { - "darwin-arm64": "@ziex/cli-darwin-arm64", - "darwin-x64": "@ziex/cli-darwin-x64", - "linux-x64": "@ziex/cli-linux-x64", - "linux-arm64": "@ziex/cli-linux-arm64", - "win32-x64": "@ziex/cli-win32-x64", - "win32-arm64": "@ziex/cli-win32-arm64", - }; - - const pkg = platformPkgs[`${process.platform}-${process.arch}`]; - if (pkg) { - try { - const pkgDir = dirname(require.resolve(`${pkg}/package.json`)); - const bin = join(pkgDir, "bin", `zx${ext}`); - if (existsSync(bin)) return bin; - } catch {} - } - - return null; -} - -const bin = findBinary(); -if (!bin) { - console.error( - "Error: ziex native binary not found. The postinstall script may not have run.", - ); - console.error("Try reinstalling: npm install -g ziex"); - process.exit(1); -} - -try { - execFileSync(bin, process.argv.slice(2), { stdio: "inherit" }); -} catch (e) { - if (e.status !== undefined) { - process.exit(e.status); - } - throw e; -} diff --git a/pkg/@ziex/package.json b/pkg/@ziex/package.json index 0ac22578..5ba46e0a 100644 --- a/pkg/@ziex/package.json +++ b/pkg/@ziex/package.json @@ -8,6 +8,7 @@ "publish": "npm publish --workspaces --access public", "start:registry": "verdaccio --config verdaccio.yaml --listen 4873", "publish:local": "npm publish --workspaces --registry http://localhost:4873", + "check": "bash check.sh", "syncver": "npm version --ignore-scripts --workspace lib --workspace cli --workspace cli-darwin-arm64 --workspace cli-darwin-x64 --workspace cli-linux-x64 --workspace cli-linux-arm64 --workspace cli-win32-x64 --workspace cli-win32-arm64" }, "workspaces": [ diff --git a/pkg/@ziex/prepare.sh b/pkg/@ziex/prepare.sh index e8ceb17d..7922edfc 100755 --- a/pkg/@ziex/prepare.sh +++ b/pkg/@ziex/prepare.sh @@ -1,13 +1,13 @@ #!/bin/bash set -euo pipefail -# Downloads Zig compiler binaries for all platforms. -# Reads version from package.json. -# Places lib/ in the shared @zigc/lib package (identical across platforms). +# Prepares @ziex npm packages for publishing. +# Reads version from the root build.zig.zon. +# Copies platform binaries and syncs package versions. SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -ZIEX_VER=$(node -p "require('$SCRIPT_DIR/package.json').version") -LIB_COPIED=false +ROOT_DIR="$SCRIPT_DIR/../.." +ZIEX_VER=$(sed -n 's/.*\.version *= *"\([^"]*\)".*/\1/p' "$ROOT_DIR/build.zig.zon") # Update version in all workspace package.json files echo "Updating package versions to $ZIEX_VER..." @@ -35,6 +35,38 @@ if [[ "${1:-}" == "--version" ]]; then exit 0 fi +# Copy binaries from zig-out/bin/release to respective platform packages +RELEASE_DIR="$SCRIPT_DIR/../../zig-out/bin/release" + +declare -A BINARY_MAP=( + ["cli-darwin-arm64"]="zx-macos-aarch64" + ["cli-darwin-x64"]="zx-macos-x64" + ["cli-linux-x64"]="zx-linux-x64" + ["cli-linux-arm64"]="zx-linux-aarch64" + ["cli-win32-x64"]="zx-windows-x64.exe" + ["cli-win32-arm64"]="zx-windows-aarch64.exe" +) + +echo "Copying binaries from $RELEASE_DIR..." +for pkg in "${!BINARY_MAP[@]}"; do + src="$RELEASE_DIR/${BINARY_MAP[$pkg]}" + dest_dir="$SCRIPT_DIR/$pkg/bin" + if [[ "$pkg" == cli-win32-* ]]; then + dest="$dest_dir/zx.exe" + else + dest="$dest_dir/zx" + fi + + if [ -f "$src" ]; then + mkdir -p "$dest_dir" + cp "$src" "$dest" + chmod +x "$dest" + echo " Copied ${BINARY_MAP[$pkg]} -> $pkg/bin/" + else + echo " Warning: $src not found, skipping $pkg" + fi +done + # Copy README.md to all packages echo "Copying README.md to all packages..." for dir in cli cli-darwin-arm64 cli-darwin-x64 cli-linux-x64 cli-linux-arm64 cli-win32-x64 cli-win32-arm64; do diff --git a/pkg/README.md b/pkg/README.md new file mode 100644 index 00000000..9d108a44 --- /dev/null +++ b/pkg/README.md @@ -0,0 +1,16 @@ +# Ziex Packages + +Subpackages that are published separately or consumed by the root Ziex project. + +| Package | Platform/Lang | Description | +|---------|---------------|-------------| +| `ziex` | NPM/JavaScript | Ziex JavaScript bindings for browser, Cloudflare, Vercel, WASI, and more | +| `@ziex` | NPM/JavaScript | @ziex org on NPM for CLI-related packages | +| `adapters` | Zig | Adapters for Ziex (zx.db (SQLite), zx.kv (FS)) | +| `create-ziex` | NPM/JavaScript | `npm init ziex` or `bun create ziex` | +| `create-zig` | Zig | `npm init zig` or `bun create zig` | +| `playground` | Zig | Interactive Zig development environment | +| `plugin-bun` | NPM/JavaScript | Bun plugin for the Zig build system | +| `plugin-tailwind` | Zig | Tailwind CSS plugin for the Zig build system | +| `tree-sitter-zx` | Tree-Sitter (C) | Tree-Sitter parser for .zx files | +| `tree-sitter-mdx` | Tree-Sitter (C) | Tree-Sitter parser for .mdzx files | \ No newline at end of file