| import { existsSync } from "node:fs"; | |
| import { join } from "node:path"; | |
| /** | |
| * Detect whether the current install tree contains the published standalone bundle. | |
| * Checks for dist/server.js (Layer 1: renamed from app/server.js). | |
| * Source checkouts will not have dist/ so postinstall skips platform-specific | |
| * native repairs (which only apply to the shipped pre-built bundle). | |
| * | |
| * @param {string} rootDir | |
| * @returns {boolean} | |
| */ | |
| export function hasStandaloneAppBundle(rootDir) { | |
| // The published bundle ships in dist/ (build-output-isolation). Also accept the | |
| // legacy app/ location so an upgrade over a partially-replaced install is still | |
| // detected as a published bundle — mirrors the serve CLI's dist/ -> app/ fallback. | |
| return ( | |
| existsSync(join(rootDir, "dist", "server.js")) || | |
| existsSync(join(rootDir, "app", "server.js")) | |
| ); | |
| } | |
| /** | |
| * Returns true when running inside a Termux environment on Android. | |
| * | |
| * Node.js on Termux reports process.platform === "linux" (not "android"), | |
| * so OS-level platform checks are insufficient. Use Termux-specific signals: | |
| * 1. TERMUX_VERSION env var (set by Termux bootstrap, most reliable) | |
| * 2. PREFIX env var containing "com.termux" | |
| * 3. Filesystem probe at /data/data/com.termux (last resort, no env needed) | |
| * | |
| * @param {object} [env] Override process.env for testing. | |
| * @returns {boolean} | |
| */ | |
| export function isTermux(env = process.env) { | |
| if (env.TERMUX_VERSION) return true; | |
| if (typeof env.PREFIX === "string" && env.PREFIX.includes("com.termux")) return true; | |
| try { | |
| return existsSync("/data/data/com.termux"); | |
| } catch { | |
| return false; | |
| } | |
| } | |