@lunora/cli
Version:
The Lunora CLI: init, dev, deploy, codegen, run, reset, and migrate commands
95 lines (92 loc) • 2.9 kB
JavaScript
import { readFileSync, existsSync } from 'node:fs';
import { join } from 'node:path';
import { parse } from 'jsonc-parser';
import { d as defineHandler } from '../packem_shared/command-lYnl4QyF.mjs';
import { o as openUrl } from '../packem_shared/open-url-4PBLY9X0.mjs';
const DEFAULT_DEV_PORT = 8787;
const STUDIO_PATH = "/_lunora/studio";
const findWranglerFile = (projectRoot) => {
for (const candidate of ["wrangler.jsonc", "wrangler.json"]) {
const fullPath = join(projectRoot, candidate);
if (existsSync(fullPath)) {
return fullPath;
}
}
return void 0;
};
const readWrangler = (projectRoot) => {
const file = findWranglerFile(projectRoot);
if (!file) {
return void 0;
}
try {
const parsed = parse(readFileSync(file, "utf8"));
return parsed !== null && typeof parsed === "object" ? parsed : void 0;
} catch {
return void 0;
}
};
const resolveDevPort = (wrangler) => {
if (!wrangler) {
return DEFAULT_DEV_PORT;
}
const { dev } = wrangler;
if (dev !== null && typeof dev === "object") {
const { port } = dev;
if (typeof port === "number" && Number.isFinite(port)) {
return port;
}
}
return DEFAULT_DEV_PORT;
};
const resolveRemoteUrl = (wrangler) => {
if (!wrangler) {
return void 0;
}
const { routes } = wrangler;
if (Array.isArray(routes) && routes.length > 0) {
const first = routes[0];
if (typeof first === "string") {
return `https://${first.split("/")[0] ?? first}${STUDIO_PATH}`;
}
if (first !== null && typeof first === "object") {
const { pattern } = first;
if (typeof pattern === "string" && pattern.length > 0) {
return `https://${pattern.split("/")[0] ?? pattern}${STUDIO_PATH}`;
}
}
}
const { name } = wrangler;
if (typeof name === "string" && name.length > 0) {
return `https://${name}.workers.dev${STUDIO_PATH}`;
}
return void 0;
};
const runViewCommand = async (options) => {
const cwd = options.cwd ?? process.cwd();
const wrangler = readWrangler(cwd);
const { logger } = options;
let url;
if (options.remote) {
url = resolveRemoteUrl(wrangler);
if (!url) {
logger.error("view --remote: could not determine the remote URL from wrangler config (set `routes` or `name`).");
return { code: 1, url: void 0 };
}
} else {
url = `http://localhost:${String(resolveDevPort(wrangler))}${STUDIO_PATH}`;
}
logger.info(`opening ${url}`);
try {
await openUrl(url, { opener: options.opener });
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
logger.error(`view: failed to open URL: ${message}`);
return { code: 1, url };
}
return { code: 0, url };
};
const execute = defineHandler(
({ cwd, logger, options }) => runViewCommand({ cwd, logger, remote: options.remote === true })
);
export { execute, runViewCommand };