mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-02 11:45:20 +02:00
6a785c5729
* fix(browse): externalize @ngrok/ngrok so Node server bundle builds on Windows @ngrok/ngrok has a native .node addon that causes `bun build --outfile` to fail with "cannot write multiple output files without an output directory". Externalize it alongside the existing runtime deps (playwright, diff, bun:sqlite), matching the exact pattern used for every other dynamic import in server.ts. Adds a policy comment explaining when to extend the externals list so the next native dep doesn't repeat this failure. Two community contributors independently converged on this fix: - @tomasmontbrun-hash (#1019) - @scarson (#1013) Also fixes issues #1010 and #960. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(package.json): subshell cleanup so || true stops masking build/test failures Shell operator precedence trap in both the build and test scripts: cmd1 && cmd2 && ... && rm -f .*.bun-build || true bun test ... && bun run slop:diff 2>/dev/null || true The trailing `|| true` was intended to suppress cleanup errors, but it applies to the entire `&&` chain — so ANY failure (including the build-node-server.sh failure that broke Windows installs since v0.15.12) silently exits 0. CI ran the build, the build failed, and CI reported green. Wrap the cleanup/slop-diff commands in subshells so `|| true` only scopes to the intended step: ... && (rm -f .*.bun-build || true) bun test ... && (bun run slop:diff 2>/dev/null || true) Verified: `bash -c 'false && echo A && rm -f X || true'` exits 0 (old, broken), `bash -c 'false && echo A && (rm -f X || true)'` exits 1 (new, correct). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * test(browse): add build validation test for server-node.mjs Two assertions: 1. `node --check` passes on the built `server-node.mjs` (valid ES module syntax). This catches regressions where the post-processing steps (perl regex replacements) corrupt the bundle. 2. No inlined `@ngrok/ngrok` module identifiers (ngrok_napi, platform- specific binding packages). Verifies the --external flag actually kept it external. Skips gracefully when `browse/dist/server-node.mjs` is missing — the dist dir is gitignored, so a fresh clone + `bun test` without a prior build is a valid state, not a failure. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(setup): verify @ngrok/ngrok can load on Windows Mirror the existing Playwright verification step. Since @ngrok/ngrok is now externalized in server-node.mjs (resolved at runtime from node_modules), confirm the platform-specific native binary (@ngrok/ngrok-win32-x64-msvc et al.) is installed at setup time rather than surfacing the failure later when the user runs /pair-agent. Same fallback pattern: if `node -e "require('@ngrok/ngrok')"` fails, fall back to `npm install --no-save @ngrok/ngrok` to pull the missing binary. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: bump to v0.18.0.1 for ngrok Windows fix + CI error-propagation Fixes shipped in this version: - Externalize @ngrok/ngrok so the Node server bundle builds on Windows (PRs #1019, #1013; issues #1010, #960) - Shell precedence fix so build/test failures no longer exit 0 in CI - Build validation test for server-node.mjs - Windows setup verifies @ngrok/ngrok native binary is loadable Credit: @tomasmontbrun-hash (#1019), @scarson (#1013). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
55 lines
2.2 KiB
Bash
Executable File
55 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Build a Node.js-compatible server bundle for Windows.
|
|
#
|
|
# On Windows, Bun can't launch or connect to Playwright's Chromium
|
|
# (oven-sh/bun#4253, #9911). This script produces a server bundle
|
|
# that runs under Node.js with Bun API polyfills.
|
|
|
|
set -e
|
|
|
|
GSTACK_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
SRC_DIR="$GSTACK_DIR/browse/src"
|
|
DIST_DIR="$GSTACK_DIR/browse/dist"
|
|
|
|
echo "Building Node-compatible server bundle..."
|
|
|
|
# Step 1: Transpile server.ts to a single .mjs bundle (externalize runtime deps)
|
|
#
|
|
# Externalize packages with native addons, dynamic imports, or runtime resolution.
|
|
# If you add a new dependency that uses `await import()` or has a .node addon,
|
|
# add it here. Otherwise `bun build --outfile` will fail with
|
|
# "cannot write multiple output files without an output directory".
|
|
bun build "$SRC_DIR/server.ts" \
|
|
--target=node \
|
|
--outfile "$DIST_DIR/server-node.mjs" \
|
|
--external playwright \
|
|
--external playwright-core \
|
|
--external diff \
|
|
--external "bun:sqlite" \
|
|
--external "@ngrok/ngrok"
|
|
|
|
# Step 2: Post-process
|
|
# Replace import.meta.dir with a resolvable reference
|
|
perl -pi -e 's/import\.meta\.dir/__browseNodeSrcDir/g' "$DIST_DIR/server-node.mjs"
|
|
# Stub out bun:sqlite (macOS-only cookie import, not needed on Windows)
|
|
perl -pi -e 's|import { Database } from "bun:sqlite";|const Database = null; // bun:sqlite stubbed on Node|g' "$DIST_DIR/server-node.mjs"
|
|
|
|
# Step 3: Create the final file with polyfill header injected after the first line
|
|
{
|
|
head -1 "$DIST_DIR/server-node.mjs"
|
|
echo '// ── Windows Node.js compatibility (auto-generated) ──'
|
|
echo 'import { fileURLToPath as _ftp } from "node:url";'
|
|
echo 'import { dirname as _dn } from "node:path";'
|
|
echo 'const __browseNodeSrcDir = _dn(_dn(_ftp(import.meta.url))) + "/src";'
|
|
echo '{ const _r = createRequire(import.meta.url); _r("./bun-polyfill.cjs"); }'
|
|
echo '// ── end compatibility ──'
|
|
tail -n +2 "$DIST_DIR/server-node.mjs"
|
|
} > "$DIST_DIR/server-node.tmp.mjs"
|
|
|
|
mv "$DIST_DIR/server-node.tmp.mjs" "$DIST_DIR/server-node.mjs"
|
|
|
|
# Step 4: Copy polyfill to dist/
|
|
cp "$SRC_DIR/bun-polyfill.cjs" "$DIST_DIR/bun-polyfill.cjs"
|
|
|
|
echo "Node server bundle ready: $DIST_DIR/server-node.mjs"
|