Files
seedit/scripts/start-preview.js
2026-05-30 17:33:07 +07:00

77 lines
2.0 KiB
JavaScript

import { spawn, spawnSync } from 'node:child_process';
import {
ensurePortlessProxy,
fallbackHost,
fallbackUrlHost,
forwardChildExit,
getLocalServerCommand,
getPortlessAppName,
openInBrowser,
portlessBin,
portlessEnv,
usePortless,
waitForUrlReady,
} from './local-server-utils.mjs';
import { resolvePort } from './dev-server-utils.mjs';
const fallbackRequestedPort = Number(process.env.PORT) || 4173;
console.log('Building production preview with corepack yarn build...');
const build = spawnSync('corepack', ['yarn', 'build'], {
cwd: process.cwd(),
env: process.env,
stdio: 'inherit',
});
if (build.status !== 0) {
process.exit(build.status ?? 1);
}
const command = getLocalServerCommand();
let args;
let publicUrl = null;
if (command === portlessBin) {
ensurePortlessProxy();
const appName = getPortlessAppName();
publicUrl = `https://${appName}.localhost`;
args = [appName, 'vite', 'preview'];
console.log(`Starting Portless production preview at ${publicUrl}`);
} else {
const port = await resolvePort(fallbackRequestedPort, fallbackHost);
const fallbackUrl = `http://${fallbackUrlHost}:${port}`;
args = ['preview', '--host', fallbackHost, '--port', String(port), '--strictPort'];
if (usePortless) {
console.warn(`portless unavailable on this platform, using vite preview directly on ${fallbackUrl}`);
} else {
console.log(`Starting Vite production preview directly at ${fallbackUrl}`);
}
if (port !== fallbackRequestedPort) {
console.log(`Preferred preview port ${fallbackRequestedPort} is busy, so this run will use ${fallbackUrl}.`);
}
}
const child = spawn(command, args, {
stdio: 'inherit',
env: command === portlessBin ? portlessEnv : process.env,
});
if (publicUrl && process.env.BROWSER !== 'none') {
waitForUrlReady(publicUrl, 30_000)
.then(() => {
console.log(`Opening ${publicUrl} in browser...`);
openInBrowser(publicUrl);
})
.catch((error) => {
console.warn(`Could not auto-open ${publicUrl}: ${error.message}`);
});
}
forwardChildExit(child);