@hamedb89/localghost 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -6
- package/apps/macos-widget/LocalghostWidget.swift +218 -0
- package/apps/macos-widget/build.sh +53 -0
- package/dist/cli.js +224 -45
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +10 -2
- package/dist/index.js +85 -19
- package/dist/index.js.map +1 -1
- package/dist/vite.d.ts +2 -0
- package/dist/vite.js +76 -21
- package/dist/vite.js.map +1 -1
- package/docs/localghost.1.md +20 -5
- package/docs/macos-widget.md +46 -0
- package/package.json +3 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/activity.ts","../src/config.ts","../src/parse.ts","../src/caddy.ts","../src/fs.ts","../src/port.ts","../src/context.ts","../src/doctor.ts","../src/env.ts","../src/hosts-file.ts","../src/init.ts","../src/prompt.ts","../src/routes.ts","../src/state.ts","../src/update-check.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { existsSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { Command, InvalidArgumentError } from \"commander\";\nimport {\n getLocalghostActivityPath,\n listLocalghostRuns,\n registerLocalghostRun,\n unregisterLocalghostRun,\n type LocalghostRunRecord\n} from \"./activity.js\";\nimport { getProjectName, readDevHosts, resolveDevHostsPath, sanitizeProjectName, type ReadDevHostsOptions } from \"./config.js\";\nimport { getCaddyfilePath, renderCaddyfile, validateCaddyfile, writeCaddyfile, startCaddy } from \"./caddy.js\";\nimport { resolveLocalghostContext } from \"./context.js\";\nimport { checkCaddy, runDoctor } from \"./doctor.js\";\nimport { assertLocalDevelopment } from \"./env.js\";\nimport { getSystemHostsPath, removeSystemHosts, renderHostsBlock, updateSystemHosts } from \"./hosts-file.js\";\nimport { initLocalghost, type PackageManager } from \"./init.js\";\nimport { findLocalMdnsHosts } from \"./parse.js\";\nimport { isPortAvailable } from \"./port.js\";\nimport { canPrompt, confirm } from \"./prompt.js\";\nimport { formatDomainRoutes } from \"./routes.js\";\nimport { getLocalghostStatePath, readLocalghostState, writeLocalghostState } from \"./state.js\";\nimport { checkForUpdate, formatUpdateMessage, LOCALGHOST_VERSION, maybeNotifyAboutUpdate } from \"./update-check.js\";\nimport { execa } from \"execa\";\n\nfunction warnAboutLocalMdns(entries: ReturnType<typeof readDevHosts>) {\n const localHosts = findLocalMdnsHosts(entries);\n\n if (localHosts.length > 0) {\n console.warn(\n `Warning: .local can collide with mDNS/Bonjour. Prefer .localhost for dev hosts: ${localHosts.join(\", \")}`\n );\n }\n}\n\nfunction logDomainRoutes(entries: ReturnType<typeof readDevHosts>, options: { https?: boolean } = {}) {\n console.log(formatDomainRoutes(entries, options));\n}\n\nfunction parsePort(value: string) {\n const port = Number.parseInt(value, 10);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new InvalidArgumentError(\"Port must be a number between 1 and 65535.\");\n }\n\n return port;\n}\n\nfunction parsePackageManager(value: string): PackageManager {\n if (value === \"npm\" || value === \"yarn\" || value === \"pnpm\") return value;\n throw new InvalidArgumentError(\"Package manager must be npm, yarn, or pnpm.\");\n}\n\nfunction collect(value: string, previous: string[] = []) {\n return [...previous, value];\n}\n\nfunction parseBooleanLike(value: string | boolean) {\n if (value === true) return true;\n if (value === false) return false;\n const normalized = value.toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"y\", \"on\"].includes(normalized)) return true;\n if ([\"0\", \"false\", \"no\", \"n\", \"off\"].includes(normalized)) return false;\n throw new InvalidArgumentError(\"Value must be yes or no.\");\n}\n\ntype ConfigCliOptions = {\n cwd: string;\n config?: string[];\n configPattern?: string;\n};\n\ntype ProxyModeCliOptions = {\n https?: boolean;\n ssl?: boolean;\n};\n\nfunction readOptionsFromCli(options: ConfigCliOptions): ReadDevHostsOptions {\n return {\n cwd: options.cwd,\n ...(options.config && options.config.length > 0 ? { configFiles: options.config } : {}),\n ...(options.configPattern ? { configPattern: options.configPattern } : {})\n };\n}\n\nasync function assertCaddyReady() {\n const caddy = await checkCaddy();\n if (caddy.found) return;\n\n throw new Error([\n \"Caddy was not found.\",\n `Install it with: ${caddy.installHint}`,\n \"Localghost will not install it for you. No surprise spells.\"\n ].join(\"\\n\"));\n}\n\nfunction explainHostsPassword() {\n console.log(\"Localghost may ask for your password to update its managed block in /etc/hosts.\");\n console.log(\"It will only touch the lines between # localghost:start and # localghost:end.\");\n}\n\nfunction useHttps(options: ProxyModeCliOptions) {\n return options.https === true || options.ssl === true;\n}\n\nfunction getSetupCommand(options: { https?: boolean; config?: string[]; configPattern?: string }) {\n const configFlags = [\n ...(options.config ?? []).map((config) => ` --config ${config}`),\n ...(options.configPattern ? [` --config-pattern ${options.configPattern}`] : [])\n ].join(\"\");\n return `localghost setup${configFlags}${options.https ? \" --https\" : \"\"}`;\n}\n\nfunction getSetupReadiness(options: ConfigCliOptions & { project?: string; https?: boolean; ignoreCaddyfile?: boolean }) {\n const projectName = sanitizeProjectName(options.project ?? getProjectName(options.cwd));\n const readOptions = readOptionsFromCli(options);\n const entries = readDevHosts(readOptions);\n const configPath = resolveDevHostsPath(readOptions).path;\n const caddyfilePath = getCaddyfilePath(options.cwd);\n const statePath = getLocalghostStatePath(options.cwd);\n const state = readLocalghostState(options.cwd);\n const https = options.https === true;\n const reasons: string[] = [];\n\n if (!state) {\n reasons.push(`No Localghost setup state found at ${statePath}.`);\n } else {\n if (state.action !== \"setup\") reasons.push(`Last Localghost action is ${state.action}, not setup.`);\n if (state.projectName !== projectName) reasons.push(`Setup state is for project ${state.projectName}, not ${projectName}.`);\n if (state.configPath !== configPath) reasons.push(`Setup state points at ${state.configPath ?? \"no config\"}, not ${configPath}.`);\n }\n\n const hostsPath = getSystemHostsPath();\n try {\n const hosts = readFileSync(hostsPath, \"utf8\");\n const expectedHostsBlock = renderHostsBlock(projectName, entries).trimEnd();\n if (!hosts.includes(expectedHostsBlock)) {\n reasons.push(`The Localghost hosts block in ${hostsPath} is missing or stale.`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n reasons.push(`Could not read ${hostsPath}: ${message}`);\n }\n\n if (!options.ignoreCaddyfile) {\n if (!existsSync(caddyfilePath)) {\n reasons.push(`Missing Caddyfile at ${caddyfilePath}.`);\n } else {\n const expectedCaddyfile = renderCaddyfile(entries, { https });\n const currentCaddyfile = readFileSync(caddyfilePath, \"utf8\");\n if (currentCaddyfile !== expectedCaddyfile) {\n reasons.push(`Caddyfile at ${caddyfilePath} is stale for ${https ? \"HTTPS\" : \"HTTP\"} mode.`);\n }\n }\n }\n\n return {\n ready: reasons.length === 0,\n reasons,\n entries,\n projectName,\n configPath,\n caddyfilePath,\n statePath,\n setupCommand: getSetupCommand(options)\n };\n}\n\nasync function runSetupFromReadiness(\n cwd: string,\n https: boolean,\n readiness: ReturnType<typeof getSetupReadiness>\n) {\n explainHostsPassword();\n const hostsResult = await updateSystemHosts(readiness.projectName, readiness.entries);\n const caddyfilePath = await writeCaddyfile(readiness.entries, cwd, { https });\n await validateCaddyfile(caddyfilePath);\n writeLocalghostState(cwd, {\n action: \"setup\",\n projectName: readiness.projectName,\n cwd,\n configPath: readiness.configPath,\n hostsPath: hostsResult.hostsPath,\n hostsChanged: hostsResult.changed,\n ...(hostsResult.tempPath ? { hostsTempPath: hostsResult.tempPath } : {}),\n caddyfilePath,\n caddyHttps: https,\n entries: readiness.entries\n });\n}\n\ntype LocalghostRunView = LocalghostRunRecord & {\n routes: Array<{\n host: string;\n port: number;\n target: string;\n listening: boolean;\n }>;\n};\n\nfunction maybePid(pid: number | undefined) {\n return typeof pid === \"number\" && Number.isInteger(pid) && pid > 0 ? pid : undefined;\n}\n\nfunction registerCleanup(id: string) {\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n unregisterLocalghostRun(id);\n };\n\n process.once(\"exit\", cleanup);\n\n return () => {\n cleanup();\n process.off(\"exit\", cleanup);\n };\n}\n\nasync function getRunView(run: LocalghostRunRecord): Promise<LocalghostRunView> {\n const portStatus = new Map<number, boolean>();\n\n for (const entry of run.entries) {\n if (!portStatus.has(entry.port)) {\n portStatus.set(entry.port, !(await isPortAvailable(entry.port)));\n }\n }\n\n return {\n ...run,\n routes: run.entries.map((entry) => ({\n host: entry.host,\n port: entry.port,\n target: `127.0.0.1:${entry.port}`,\n listening: portStatus.get(entry.port) ?? false\n }))\n };\n}\n\nfunction formatRunViews(runs: LocalghostRunView[]) {\n if (runs.length === 0) return \"No Localghost apps are running.\";\n\n const lines = [\"localghost ps\"];\n for (const run of runs) {\n const command = run.childCommand?.length ? ` ${run.childCommand.join(\" \")}` : \"\";\n const mode = command ? `${run.mode}:${command}` : run.mode;\n lines.push(\"\");\n lines.push(`${run.projectName} ${mode}`);\n lines.push(` cwd: ${run.cwd}`);\n lines.push(` pid: ${run.pid}${run.caddyPid ? `, caddy: ${run.caddyPid}` : \"\"}${run.childPid ? `, child: ${run.childPid}` : \"\"}`);\n lines.push(` started: ${run.startedAt}`);\n for (const route of run.routes) {\n lines.push(` ${route.host} -> ${route.target} (${route.listening ? \"listening\" : \"not listening\"})`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nconst program = new Command();\n\nprogram\n .name(\"localghost\")\n .description(\"Buh. Friendly local hostnames for app repos.\")\n .version(LOCALGHOST_VERSION)\n .option(\"--no-update-check\", \"Skip the npm update check for this run\");\n\nprogram.hook(\"postAction\", async (_thisCommand, actionCommand) => {\n if (actionCommand.name() === \"update\") return;\n\n const options = program.opts<{ updateCheck?: boolean }>();\n await maybeNotifyAboutUpdate({ disabled: options.updateCheck === false });\n});\n\nprogram\n .command(\"init\")\n .description(\"Create a .localghost config for this project\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to create\", \".localghost\")\n .option(\"--host <host>\", \"Primary local hostname\")\n .option(\"--port <number>\", \"Primary app port\", parsePort)\n .option(\"--api-host <host>\", \"API local hostname\")\n .option(\"--api-port <number>\", \"API port\", parsePort)\n .option(\"--package-manager <npm|yarn|pnpm>\", \"Package manager for suggested commands\", parsePackageManager)\n .option(\"--write-scripts\", \"Add localghost scripts to package.json\")\n .option(\"--force\", \"Overwrite an existing config file\")\n .action((options: {\n cwd: string;\n config: string;\n host?: string;\n port?: number;\n apiHost?: string;\n apiPort?: number;\n packageManager?: PackageManager;\n writeScripts?: boolean;\n force?: boolean;\n }) => {\n const result = initLocalghost({ ...options, configFile: options.config });\n\n if (result.configCreated) {\n console.log(`Buh. Created ${result.configPath}`);\n } else {\n console.log(`${result.configPath} already exists. Use --force to rewrite it.`);\n }\n\n if (options.writeScripts) {\n if (result.packageJsonChanged) {\n console.log(`Updated ${result.packageJsonPath}`);\n } else if (result.packageJsonPath) {\n console.log(`${result.packageJsonPath} already has localghost scripts.`);\n } else {\n console.log(\"No package.json found; skipped script setup.\");\n }\n }\n\n console.log(\"Next:\");\n for (const step of result.nextSteps) {\n console.log(` ${step}`);\n }\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Check machine prerequisites\")\n .action(async () => {\n const result = await runDoctor();\n\n if (result.caddy.found) {\n console.log(`Caddy: ${result.caddy.version ?? \"found\"}`);\n } else {\n console.log(\"Caddy: missing\");\n console.log(`Run: ${result.caddy.installHint}`);\n console.log(\"Localghost will not install it for you. No surprise spells.\");\n }\n\n if (!result.ok) {\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"update\")\n .description(\"Check npm for a newer localghost release\")\n .option(\"--json\", \"Print raw JSON\")\n .action(async (options: { json?: boolean }) => {\n const result = await checkForUpdate({ force: true, timeoutMs: 5000 });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const message = formatUpdateMessage(result);\n if (message) {\n console.log(message);\n return;\n }\n\n if (result.source === \"error\") {\n console.log(`Could not check npm for updates: ${result.error ?? \"unknown error\"}`);\n process.exitCode = 1;\n return;\n }\n\n console.log(`localghost is up to date. Current: ${result.currentVersion}`);\n });\n\nprogram\n .command(\"setup\")\n .description(\"Update /etc/hosts and generate/validate Caddyfile\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .option(\"--https\", \"Generate a local HTTPS Caddy proxy with Caddy local certificates\")\n .option(\"--ssl\", \"Alias for --https\")\n .action(async (options: ConfigCliOptions & { project?: string } & ProxyModeCliOptions) => {\n assertLocalDevelopment(\"setup\");\n await assertCaddyReady();\n\n const https = useHttps(options);\n const projectName = sanitizeProjectName(options.project ?? getProjectName(options.cwd));\n const readOptions = readOptionsFromCli(options);\n const configPath = resolveDevHostsPath(readOptions).path;\n const entries = readDevHosts(readOptions);\n\n warnAboutLocalMdns(entries);\n logDomainRoutes(entries, { https });\n\n explainHostsPassword();\n const hostsResult = await updateSystemHosts(projectName, entries);\n\n if (hostsResult.changed) {\n console.log(`Updated ${hostsResult.hostsPath}`);\n } else {\n console.log(`${hostsResult.hostsPath} already up to date`);\n }\n\n const caddyfile = await writeCaddyfile(entries, options.cwd, { https });\n await validateCaddyfile(caddyfile);\n\n const statePath = writeLocalghostState(options.cwd, {\n action: \"setup\",\n projectName,\n cwd: options.cwd,\n configPath,\n hostsPath: hostsResult.hostsPath,\n hostsChanged: hostsResult.changed,\n ...(hostsResult.tempPath ? { hostsTempPath: hostsResult.tempPath } : {}),\n caddyfilePath: caddyfile,\n caddyHttps: https,\n entries\n });\n\n console.log(`Generated ${caddyfile}`);\n console.log(`Mode ${https ? \"HTTPS\" : \"HTTP\"}`);\n console.log(`State ${statePath}`);\n console.log(\"Setup complete.\");\n });\n\nprogram\n .command(\"reset\")\n .description(\"Remove Localghost setup state without deleting .localghost\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .action(async (options: { project?: string; cwd: string }) => {\n assertLocalDevelopment(\"reset\");\n\n const projectName = sanitizeProjectName(options.project ?? getProjectName(options.cwd));\n const caddyfilePath = getCaddyfilePath(options.cwd);\n const statePath = getLocalghostStatePath(options.cwd);\n\n explainHostsPassword();\n const hostsResult = await removeSystemHosts(projectName);\n\n if (existsSync(caddyfilePath)) {\n unlinkSync(caddyfilePath);\n console.log(`Removed ${caddyfilePath}`);\n } else {\n console.log(`${caddyfilePath} was not present`);\n }\n\n if (existsSync(statePath)) {\n unlinkSync(statePath);\n console.log(`Removed ${statePath}`);\n } else {\n console.log(`${statePath} was not present`);\n }\n\n if (hostsResult.removed) {\n console.log(`Removed Localghost hosts block from ${hostsResult.hostsPath}`);\n } else {\n console.log(`No Localghost hosts block found in ${hostsResult.hostsPath}`);\n }\n\n console.log(\".localghost was left in place. Run localghost setup when you are ready.\");\n });\n\nprogram\n .command(\"teardown\")\n .description(\"Remove Localghost's managed /etc/hosts block\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--remove-caddyfile\", \"Also remove ops/local/Caddyfile\")\n .action(async (options: { project?: string; cwd: string; removeCaddyfile?: boolean }) => {\n assertLocalDevelopment(\"teardown\");\n const projectName = sanitizeProjectName(options.project ?? getProjectName(options.cwd));\n explainHostsPassword();\n const hostsResult = await removeSystemHosts(projectName);\n const caddyfilePath = getCaddyfilePath(options.cwd);\n let caddyfileRemoved = false;\n\n if (options.removeCaddyfile && existsSync(caddyfilePath)) {\n unlinkSync(caddyfilePath);\n caddyfileRemoved = true;\n }\n\n const statePath = writeLocalghostState(options.cwd, {\n action: \"teardown\",\n projectName,\n cwd: options.cwd,\n hostsPath: hostsResult.hostsPath,\n hostsChanged: hostsResult.changed,\n ...(hostsResult.tempPath ? { hostsTempPath: hostsResult.tempPath } : {}),\n caddyfilePath,\n caddyfileRemoved\n });\n\n if (hostsResult.removed) {\n console.log(`Removed Localghost hosts block from ${hostsResult.hostsPath}`);\n } else {\n console.log(`No Localghost hosts block found in ${hostsResult.hostsPath}`);\n }\n\n if (options.removeCaddyfile) {\n console.log(caddyfileRemoved ? `Removed ${caddyfilePath}` : `${caddyfilePath} was not present`);\n }\n\n console.log(`State ${statePath}`);\n });\n\nprogram\n .command(\"status\")\n .description(\"Print Localghost's project-local state file\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .option(\"--ready\", \"Exit non-zero when setup is missing or stale\")\n .option(\"--https\", \"Check setup readiness for HTTPS mode\")\n .option(\"--ssl\", \"Alias for --https\")\n .option(\"--json\", \"Print raw JSON\")\n .action((options: ConfigCliOptions & { project?: string; ready?: boolean; json?: boolean } & ProxyModeCliOptions) => {\n const state = readLocalghostState(options.cwd);\n const statePath = getLocalghostStatePath(options.cwd);\n const readiness = getSetupReadiness({ ...options, https: useHttps(options) });\n\n if (options.json) {\n console.log(JSON.stringify({ state, setup: readiness }, null, 2));\n return;\n }\n\n if (!state) {\n console.log(`No Localghost state found at ${statePath}`);\n } else {\n console.log(`State: ${statePath}`);\n console.log(`Last action: ${state.action}`);\n console.log(`Updated: ${state.updatedAt}`);\n console.log(`Project: ${state.projectName}`);\n if (state.configPath) console.log(`Config: ${state.configPath}`);\n if (state.hostsPath) console.log(`Hosts: ${state.hostsPath}`);\n if (state.caddyfilePath) console.log(`Caddyfile: ${state.caddyfilePath}`);\n if (typeof state.caddyHttps === \"boolean\") console.log(`Mode: ${state.caddyHttps ? \"HTTPS\" : \"HTTP\"}`);\n if (typeof state.caddyfileRemoved === \"boolean\") console.log(`Caddyfile removed: ${state.caddyfileRemoved}`);\n }\n\n if (readiness.ready) {\n console.log(\"Setup ready: yes\");\n return;\n }\n\n console.log(\"Setup ready: no\");\n for (const reason of readiness.reasons) {\n console.log(` - ${reason}`);\n }\n console.log(`Run: ${readiness.setupCommand}`);\n\n if (options.ready) {\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"routes\")\n .description(\"Print domain to upstream routes\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .option(\"--http\", \"Print domain URLs with http instead of https\")\n .option(\"--https\", \"Print domain URLs with https\")\n .option(\"--ssl\", \"Alias for --https\")\n .action((options: ConfigCliOptions & { http?: boolean } & ProxyModeCliOptions) => {\n const entries = readDevHosts(readOptionsFromCli(options));\n warnAboutLocalMdns(entries);\n console.log(formatDomainRoutes(entries, { https: options.http ? false : useHttps(options) }));\n });\n\nprogram\n .command(\"dev\")\n .description(\"Run the Localghost Caddy proxy after setup\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .option(\"--https\", \"Run a local HTTPS proxy with Caddy local certificates\")\n .option(\"--ssl\", \"Alias for --https\")\n .option(\"--setup\", \"Run setup before starting the proxy when setup is missing or stale\")\n .action(async (options: ConfigCliOptions & { project?: string; setup?: boolean } & ProxyModeCliOptions) => {\n assertLocalDevelopment(\"dev\");\n await assertCaddyReady();\n\n const https = useHttps(options);\n const readiness = getSetupReadiness({ ...options, https });\n\n if (!readiness.ready) {\n if (!options.setup) {\n throw new Error(\n [\n \"Localghost setup is missing or stale.\",\n ...readiness.reasons.map((reason) => `- ${reason}`),\n `Run: ${readiness.setupCommand}`,\n \"Or rerun dev with --setup if you want Localghost to perform setup first.\"\n ].join(\"\\n\")\n );\n }\n\n explainHostsPassword();\n const hostsResult = await updateSystemHosts(readiness.projectName, readiness.entries);\n const caddyfilePath = await writeCaddyfile(readiness.entries, options.cwd, { https });\n await validateCaddyfile(caddyfilePath);\n writeLocalghostState(options.cwd, {\n action: \"setup\",\n projectName: readiness.projectName,\n cwd: options.cwd,\n configPath: readiness.configPath,\n hostsPath: hostsResult.hostsPath,\n hostsChanged: hostsResult.changed,\n ...(hostsResult.tempPath ? { hostsTempPath: hostsResult.tempPath } : {}),\n caddyfilePath,\n caddyHttps: https,\n entries: readiness.entries\n });\n }\n\n warnAboutLocalMdns(readiness.entries);\n logDomainRoutes(readiness.entries, { https });\n\n const caddyfile = await writeCaddyfile(readiness.entries, options.cwd, { https });\n await validateCaddyfile(caddyfile);\n const caddy = startCaddy(caddyfile);\n const caddyPid = maybePid(caddy.pid);\n const runRecord = registerLocalghostRun({\n mode: \"dev\",\n cwd: options.cwd,\n projectName: readiness.projectName,\n configPath: readiness.configPath,\n caddyfilePath: caddyfile,\n ...(caddyPid ? { caddyPid } : {}),\n https,\n entries: readiness.entries\n });\n const cleanupRun = registerCleanup(runRecord.id);\n\n try {\n await caddy;\n } finally {\n cleanupRun();\n }\n });\n\nprogram\n .command(\"run\")\n .description(\"Run Caddy and a dev command from the same Localghost context\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .option(\"--port <number>\", \"Initial app port\", parsePort)\n .option(\"--https\", \"Run a local HTTPS proxy with Caddy local certificates\")\n .option(\"--ssl\", \"Alias for --https\")\n .option(\"--setup\", \"Run setup before starting when setup is missing or stale\")\n .option(\"--dynamic-port [yes|no]\", \"Use the requested port if free, otherwise continue upward\", parseBooleanLike, false)\n .argument(\"<command...>\", \"Command to run after --, for example: localghost run -- vite\")\n .action(async (\n command: string[],\n options: ConfigCliOptions & { project?: string; port?: number; setup?: boolean; dynamicPort?: boolean } & ProxyModeCliOptions\n ) => {\n assertLocalDevelopment(\"run\");\n await assertCaddyReady();\n\n const https = useHttps(options);\n const context = await resolveLocalghostContext({\n cwd: options.cwd,\n ...(options.project ? { project: options.project } : {}),\n ...(options.config && options.config.length > 0 ? { configFiles: options.config } : {}),\n ...(options.configPattern ? { configPattern: options.configPattern } : {}),\n ...(options.port ? { port: options.port } : {}),\n https,\n ...(typeof options.dynamicPort === \"boolean\" ? { dynamicPort: options.dynamicPort } : {})\n });\n const readiness = getSetupReadiness({ ...options, https, ignoreCaddyfile: true });\n\n if (!readiness.ready) {\n const shouldSetup = options.setup === true || (canPrompt() && await confirm(\"Run caddy:setup now?\", true));\n if (!shouldSetup) {\n throw new Error(\n [\n \"Localghost setup is missing or stale.\",\n ...readiness.reasons.map((reason) => `- ${reason}`),\n `Run: ${readiness.setupCommand}`\n ].join(\"\\n\")\n );\n }\n\n await runSetupFromReadiness(options.cwd, https, readiness);\n console.log(`All set. Setup state: ${getLocalghostStatePath(options.cwd)}`);\n }\n\n if (context.dynamicPort && context.port !== context.requestedPort) {\n console.log(`Port ${context.requestedPort} is busy; using ${context.port}.`);\n }\n\n warnAboutLocalMdns(context.entries);\n logDomainRoutes(context.entries, { https });\n\n const caddyfile = await writeCaddyfile(context.entries, options.cwd, { https });\n await validateCaddyfile(caddyfile);\n const caddy = startCaddy(caddyfile);\n const caddyExit = caddy.catch((error: unknown) => {\n if (!caddy.killed) throw error;\n });\n const [binary, ...args] = command;\n if (!binary) {\n throw new Error(\"Missing command. Use: localghost run -- vite\");\n }\n\n const child = execa(binary, args, {\n cwd: options.cwd,\n stdio: \"inherit\",\n env: {\n ...process.env,\n LOCALGHOST_PORT: String(context.port),\n LOCALGHOST_DYNAMIC_PORT: context.dynamicPort ? \"1\" : \"0\",\n VITE_PORT: String(context.port)\n }\n });\n const caddyPid = maybePid(caddy.pid);\n const childPid = maybePid(child.pid);\n const runRecord = registerLocalghostRun({\n mode: \"run\",\n cwd: context.cwd,\n projectName: context.projectName,\n configPath: context.configPath,\n caddyfilePath: caddyfile,\n ...(caddyPid ? { caddyPid } : {}),\n ...(childPid ? { childPid } : {}),\n childCommand: command,\n https,\n requestedPort: context.requestedPort,\n port: context.port,\n dynamicPort: context.dynamicPort,\n entries: context.entries\n });\n const cleanupRun = registerCleanup(runRecord.id);\n\n const stopCaddy = () => {\n if (!caddy.killed) caddy.kill(\"SIGINT\");\n };\n const stopChild = () => {\n if (!child.killed) child.kill(\"SIGINT\");\n };\n\n try {\n await Promise.race([child, caddyExit]);\n } finally {\n stopChild();\n stopCaddy();\n await Promise.allSettled([child, caddyExit]);\n cleanupRun();\n }\n });\n\nprogram\n .command(\"ps\")\n .description(\"Show Localghost dev sessions that are currently running\")\n .option(\"--json\", \"Print raw JSON\")\n .action(async (options: { json?: boolean }) => {\n const runs = await Promise.all(listLocalghostRuns().map((run) => getRunView(run)));\n\n if (options.json) {\n console.log(JSON.stringify({ activityPath: getLocalghostActivityPath(), runs }, null, 2));\n return;\n }\n\n console.log(formatRunViews(runs));\n });\n\nprogram\n .command(\"print\")\n .description(\"Print parsed host config\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .action((options: ConfigCliOptions) => {\n const entries = readDevHosts(readOptionsFromCli(options));\n warnAboutLocalMdns(entries);\n console.log(JSON.stringify(entries, null, 2));\n });\n\nprogram.parseAsync().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n});\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { DevHostEntry } from \"./parse.js\";\n\nexport const LOCALGHOST_ACTIVITY_VERSION = 1;\n\nexport type LocalghostRunMode = \"dev\" | \"run\";\n\nexport type LocalghostRunRecord = {\n id: string;\n mode: LocalghostRunMode;\n pid: number;\n cwd: string;\n projectName: string;\n startedAt: string;\n updatedAt: string;\n configPath?: string;\n caddyfilePath?: string;\n caddyPid?: number;\n childPid?: number;\n childCommand?: string[];\n https?: boolean;\n requestedPort?: number;\n port?: number;\n dynamicPort?: boolean;\n entries: DevHostEntry[];\n};\n\nexport type LocalghostActivity = {\n version: typeof LOCALGHOST_ACTIVITY_VERSION;\n runs: LocalghostRunRecord[];\n};\n\nexport type RegisterLocalghostRunInput = Omit<LocalghostRunRecord, \"id\" | \"pid\" | \"startedAt\" | \"updatedAt\"> & {\n id?: string;\n pid?: number;\n startedAt?: string;\n};\n\nexport function getLocalghostActivityPath(env: NodeJS.ProcessEnv = process.env) {\n if (env.LOCALGHOST_ACTIVITY_PATH) return env.LOCALGHOST_ACTIVITY_PATH;\n\n const stateRoot = env.XDG_STATE_HOME || join(homedir(), \".local/state\");\n return join(stateRoot, \"localghost\", \"activity.json\");\n}\n\nexport function isProcessRunning(pid: number) {\n if (!Number.isInteger(pid) || pid < 1) return false;\n\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n const code = typeof error === \"object\" && error !== null && \"code\" in error ? error.code : undefined;\n return code === \"EPERM\";\n }\n}\n\nfunction emptyActivity(): LocalghostActivity {\n return { version: LOCALGHOST_ACTIVITY_VERSION, runs: [] };\n}\n\nexport function readLocalghostActivity(path = getLocalghostActivityPath()): LocalghostActivity {\n if (!existsSync(path)) return emptyActivity();\n\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf8\")) as Partial<LocalghostActivity>;\n return {\n version: LOCALGHOST_ACTIVITY_VERSION,\n runs: Array.isArray(parsed.runs) ? parsed.runs : []\n };\n } catch {\n return emptyActivity();\n }\n}\n\nexport function writeLocalghostActivity(activity: LocalghostActivity, path = getLocalghostActivityPath()) {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(activity, null, 2)}\\n`, \"utf8\");\n return path;\n}\n\nfunction createRunId(input: Pick<RegisterLocalghostRunInput, \"mode\" | \"cwd\" | \"projectName\">, pid: number) {\n return `${input.projectName}:${input.mode}:${pid}:${Date.now()}`;\n}\n\nexport function pruneLocalghostActivity(path = getLocalghostActivityPath()) {\n const activity = readLocalghostActivity(path);\n const activeRuns = activity.runs.filter((run) => isProcessRunning(run.pid));\n const pruned = activeRuns.length !== activity.runs.length;\n\n if (pruned) {\n writeLocalghostActivity({ version: LOCALGHOST_ACTIVITY_VERSION, runs: activeRuns }, path);\n }\n\n return {\n path,\n pruned,\n runs: activeRuns\n };\n}\n\nexport function listLocalghostRuns(path = getLocalghostActivityPath()) {\n return pruneLocalghostActivity(path).runs;\n}\n\nexport function registerLocalghostRun(input: RegisterLocalghostRunInput, path = getLocalghostActivityPath()) {\n const now = new Date().toISOString();\n const pid = input.pid ?? process.pid;\n const record: LocalghostRunRecord = {\n id: input.id ?? createRunId(input, pid),\n mode: input.mode,\n pid,\n cwd: input.cwd,\n projectName: input.projectName,\n startedAt: input.startedAt ?? now,\n updatedAt: now,\n ...(input.configPath ? { configPath: input.configPath } : {}),\n ...(input.caddyfilePath ? { caddyfilePath: input.caddyfilePath } : {}),\n ...(input.caddyPid ? { caddyPid: input.caddyPid } : {}),\n ...(input.childPid ? { childPid: input.childPid } : {}),\n ...(input.childCommand ? { childCommand: input.childCommand } : {}),\n ...(typeof input.https === \"boolean\" ? { https: input.https } : {}),\n ...(input.requestedPort ? { requestedPort: input.requestedPort } : {}),\n ...(input.port ? { port: input.port } : {}),\n ...(typeof input.dynamicPort === \"boolean\" ? { dynamicPort: input.dynamicPort } : {}),\n entries: input.entries\n };\n const current = pruneLocalghostActivity(path).runs.filter((run) => run.id !== record.id);\n writeLocalghostActivity({ version: LOCALGHOST_ACTIVITY_VERSION, runs: [...current, record] }, path);\n return record;\n}\n\nexport function unregisterLocalghostRun(id: string, path = getLocalghostActivityPath()) {\n const activity = readLocalghostActivity(path);\n const runs = activity.runs.filter((run) => run.id !== id);\n\n if (runs.length !== activity.runs.length) {\n writeLocalghostActivity({ version: LOCALGHOST_ACTIVITY_VERSION, runs }, path);\n }\n}\n","import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { basename, join, resolve } from \"node:path\";\nimport { parseDevHosts } from \"./parse.js\";\n\nexport const LOCALGHOST_CONFIG_FILE = \".localghost\";\n\nexport type ConfigPattern = string | RegExp;\n\nexport type ReadDevHostsOptions = {\n cwd?: string;\n fileName?: string;\n configFiles?: string[];\n configPattern?: ConfigPattern;\n};\n\nexport type ResolvedDevHostsPath = {\n path: string;\n fileName: string;\n exists: boolean;\n searchedFiles: string[];\n configPattern?: ConfigPattern;\n};\n\nfunction unique(values: string[]) {\n return [...new Set(values.filter(Boolean))];\n}\n\nfunction toRegExp(pattern: ConfigPattern) {\n return typeof pattern === \"string\" ? new RegExp(pattern) : pattern;\n}\n\nfunction findPatternMatches(cwd: string, pattern: ConfigPattern) {\n const matcher = toRegExp(pattern);\n\n return readdirSync(cwd, { withFileTypes: true })\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((name) => {\n matcher.lastIndex = 0;\n return matcher.test(name);\n })\n .sort();\n}\n\nexport function getConfigFileCandidates(options: ReadDevHostsOptions = {}) {\n const cwd = options.cwd ?? process.cwd();\n const exactFiles = unique([\n ...(options.fileName ? [options.fileName] : []),\n ...(options.configFiles ?? [])\n ]);\n const patternFiles = options.configPattern ? findPatternMatches(cwd, options.configPattern) : [];\n const candidates = unique([...exactFiles, ...patternFiles]);\n\n if (candidates.length > 0) return candidates;\n if (exactFiles.length > 0 || options.configPattern) return [];\n return [LOCALGHOST_CONFIG_FILE];\n}\n\nexport function resolveDevHostsPath(options: ReadDevHostsOptions = {}): ResolvedDevHostsPath {\n const cwd = options.cwd ?? process.cwd();\n const searchedFiles = getConfigFileCandidates(options);\n\n for (const fileName of searchedFiles) {\n const path = resolve(cwd, fileName);\n if (existsSync(path)) {\n return {\n path,\n fileName: basename(fileName),\n exists: true,\n searchedFiles,\n ...(options.configPattern ? { configPattern: options.configPattern } : {})\n };\n }\n }\n\n const fileName = searchedFiles[0] ?? LOCALGHOST_CONFIG_FILE;\n\n return {\n path: resolve(cwd, fileName),\n fileName: basename(fileName),\n exists: false,\n searchedFiles,\n ...(options.configPattern ? { configPattern: options.configPattern } : {})\n };\n}\n\nexport function getDevHostsPath(options: ReadDevHostsOptions = {}) {\n return resolveDevHostsPath(options).path;\n}\n\nfunction formatSearchedFiles(files: string[], pattern?: ConfigPattern) {\n if (files.length > 0) return files.map((file) => `\\`${file}\\``).join(\", \");\n if (pattern) return `files matching ${pattern.toString()}`;\n return `\\`${LOCALGHOST_CONFIG_FILE}\\``;\n}\n\nexport function readDevHosts(options: ReadDevHostsOptions | string = {}) {\n const resolvedOptions = typeof options === \"string\" ? { cwd: options } : options;\n const resolvedPath = resolveDevHostsPath(resolvedOptions);\n\n if (!resolvedPath.exists) {\n const cwd = resolvedOptions.cwd ?? process.cwd();\n throw new Error(\n `Missing Localghost config in ${cwd}. Looked for ${formatSearchedFiles(resolvedPath.searchedFiles, resolvedPath.configPattern)}. Run \\`localghost init\\` or pass --config/--config-pattern.`\n );\n }\n\n return parseDevHosts(readFileSync(resolvedPath.path, \"utf8\"), resolvedPath.fileName);\n}\n\nexport function getProjectName(cwd = process.cwd()) {\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as { name?: unknown };\n const name = typeof pkg.name === \"string\" && pkg.name ? pkg.name : \"app\";\n return sanitizeProjectName(name.replace(/^@/, \"\"));\n } catch {\n return \"app\";\n }\n}\n\nexport function sanitizeProjectName(value: string) {\n const projectName = value.replace(/[^\\w.-]+/g, \"-\").replace(/^-+|-+$/g, \"\");\n return projectName || \"app\";\n}\n","export type DevHostEntry = {\n host: string;\n port: number;\n target: string;\n};\n\nconst HOST_PATTERN = /^(?=.{1,253}$)(?!-)[a-z0-9-]+(\\.[a-z0-9-]+)*\\.?$/i;\n\nexport function parseDevHosts(input: string, fileName = \".localghost\"): DevHostEntry[] {\n const entries: DevHostEntry[] = [];\n\n input.split(/\\r?\\n/).forEach((rawLine, index) => {\n const line = rawLine.replace(/#.*/, \"\").trim();\n\n if (!line) {\n return;\n }\n\n const parts = line.split(/\\s+/);\n const host = parts[0];\n const portRaw = parts[1];\n\n if (!host || !portRaw || parts.length > 2) {\n throw new Error(`Invalid ${fileName} line ${index + 1}: \"${rawLine}\"`);\n }\n\n if (!HOST_PATTERN.test(host)) {\n throw new Error(`Invalid host on line ${index + 1}: \"${host}\"`);\n }\n\n const port = Number(portRaw);\n\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(`Invalid port on line ${index + 1}: \"${portRaw}\"`);\n }\n\n entries.push({\n host: host.toLowerCase().replace(/\\.$/, \"\"),\n port,\n target: `127.0.0.1:${port}`\n });\n });\n\n return entries;\n}\n\nexport function findLocalMdnsHosts(entries: DevHostEntry[]): string[] {\n return [...new Set(entries.map((entry) => entry.host).filter((host) => host.endsWith(\".local\")))];\n}\n","import { dirname, join } from \"node:path\";\nimport { execa } from \"execa\";\nimport { writeTextFile } from \"./fs.js\";\nimport type { DevHostEntry } from \"./parse.js\";\n\nexport type CaddyModeOptions = {\n https?: boolean;\n};\n\nfunction groupByPort(entries: DevHostEntry[]) {\n const groups = new Map<number, DevHostEntry[]>();\n\n for (const entry of entries) {\n const group = groups.get(entry.port) ?? [];\n group.push(entry);\n groups.set(entry.port, group);\n }\n\n return groups;\n}\n\nexport function getCaddyfilePath(cwd = process.cwd()) {\n return join(cwd, \"ops/local/Caddyfile\");\n}\n\nexport function renderCaddyfile(entries: DevHostEntry[], options: CaddyModeOptions = {}) {\n const groups = groupByPort(entries);\n const https = options.https === true;\n const blocks = [...groups.entries()]\n .sort(([leftPort], [rightPort]) => leftPort - rightPort)\n .map(([port, group]) => {\n const hosts = group\n .map((entry) => (https ? entry.host : `http://${entry.host}`))\n .sort()\n .join(\", \");\n\n return `${hosts} {\n reverse_proxy 127.0.0.1:${port}\n}`;\n });\n\n const globalOptions = https\n ? `{\n local_certs\n}\n\n`\n : \"\";\n\n return `${globalOptions}${blocks.join(\"\\n\\n\")}\n`;\n}\n\nexport async function writeCaddyfile(entries: DevHostEntry[], cwd = process.cwd(), options: CaddyModeOptions = {}) {\n const path = getCaddyfilePath(cwd);\n writeTextFile(path, renderCaddyfile(entries, options));\n return path;\n}\n\nexport async function validateCaddyfile(path: string) {\n await execa(\"caddy\", [\"validate\", \"--config\", path], {\n cwd: dirname(path),\n stdio: \"inherit\"\n });\n}\n\nexport async function runCaddy(path: string) {\n await execa(\"caddy\", [\"run\", \"--config\", path], {\n cwd: dirname(path),\n stdio: \"inherit\"\n });\n}\n\nexport function startCaddy(path: string) {\n return execa(\"caddy\", [\"run\", \"--config\", path], {\n cwd: dirname(path),\n stdio: \"inherit\"\n });\n}\n","import { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nexport function readTextFile(path: string) {\n return readFileSync(path, \"utf8\");\n}\n\nexport function writeTextFile(path: string, value: string) {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, value, \"utf8\");\n return path;\n}\n","import { createServer } from \"node:net\";\n\nexport type FindAvailablePortOptions = {\n host?: string;\n maxAttempts?: number;\n};\n\nexport async function isPortAvailable(port: number, host = \"127.0.0.1\") {\n return new Promise<boolean>((resolve) => {\n const server = createServer();\n\n server.once(\"error\", () => {\n resolve(false);\n });\n\n server.once(\"listening\", () => {\n server.close(() => resolve(true));\n });\n\n server.listen(port, host);\n });\n}\n\nexport async function findAvailablePort(startPort: number, options: FindAvailablePortOptions = {}) {\n const host = options.host ?? \"127.0.0.1\";\n const maxAttempts = options.maxAttempts ?? 50;\n\n for (let offset = 0; offset < maxAttempts; offset += 1) {\n const port = startPort + offset;\n if (await isPortAvailable(port, host)) {\n return port;\n }\n }\n\n throw new Error(`No available port found from ${startPort} to ${startPort + maxAttempts - 1}.`);\n}\n","import {\n getProjectName,\n readDevHosts,\n resolveDevHostsPath,\n sanitizeProjectName,\n type ConfigPattern,\n type ReadDevHostsOptions\n} from \"./config.js\";\nimport { findAvailablePort } from \"./port.js\";\nimport type { DevHostEntry } from \"./parse.js\";\n\nexport type LocalghostContextOptions = {\n cwd?: string;\n project?: string;\n fileName?: string;\n configFiles?: string[];\n configPattern?: ConfigPattern;\n port?: number;\n https?: boolean;\n bindHost?: string | boolean;\n primaryHost?: string;\n dynamicPort?: boolean;\n};\n\nexport type LocalghostContext = {\n cwd: string;\n projectName: string;\n readOptions: ReadDevHostsOptions;\n configPath: string;\n configFileName: string;\n configEntries: DevHostEntry[];\n entries: DevHostEntry[];\n hosts: string[];\n requestedPort: number;\n port: number;\n dynamicPort: boolean;\n bindHost: string | boolean;\n primaryHost: string;\n https: boolean;\n};\n\nfunction parsePort(value: string | undefined) {\n if (!value) return undefined;\n const port = Number.parseInt(value, 10);\n return Number.isInteger(port) && port > 0 && port <= 65535 ? port : undefined;\n}\n\nfunction envPort() {\n return parsePort(process.env.LOCALGHOST_PORT) ?? parsePort(process.env.VITE_PORT);\n}\n\nfunction envDynamicPort() {\n const value = process.env.LOCALGHOST_DYNAMIC_PORT;\n if (!value) return undefined;\n return [\"1\", \"true\", \"yes\", \"on\"].includes(value.toLowerCase());\n}\n\nfunction readOptionsFromContext(options: LocalghostContextOptions): ReadDevHostsOptions {\n return {\n cwd: options.cwd ?? process.cwd(),\n ...(options.fileName ? { fileName: options.fileName } : {}),\n ...(options.configFiles ? { configFiles: options.configFiles } : {}),\n ...(options.configPattern ? { configPattern: options.configPattern } : {})\n };\n}\n\nfunction withRuntimePort(entries: DevHostEntry[], requestedPort: number, port: number) {\n if (requestedPort === port) return entries;\n\n const hasRequestedPort = entries.some((entry) => entry.port === requestedPort);\n if (!hasRequestedPort) return entries;\n\n return entries.map((entry) => (entry.port === requestedPort ? { ...entry, port } : entry));\n}\n\nfunction uniqueHosts(entries: DevHostEntry[]) {\n return [...new Set(entries.map((entry) => entry.host))];\n}\n\nexport function defineLocalghostConfig<T extends LocalghostContextOptions>(config: T) {\n return config;\n}\n\nexport async function resolveLocalghostContext(options: LocalghostContextOptions = {}): Promise<LocalghostContext> {\n const cwd = options.cwd ?? process.cwd();\n const readOptions = readOptionsFromContext({ ...options, cwd });\n const resolvedPath = resolveDevHostsPath(readOptions);\n const configEntries = readDevHosts(readOptions);\n const requestedPort = options.port ?? envPort() ?? configEntries[0]?.port ?? 5173;\n const dynamicPort = options.dynamicPort ?? envDynamicPort() ?? false;\n const bindHost = options.bindHost ?? \"127.0.0.1\";\n const probeHost = typeof bindHost === \"string\" ? bindHost : \"127.0.0.1\";\n const port = dynamicPort ? await findAvailablePort(requestedPort, { host: probeHost }) : requestedPort;\n const entries = withRuntimePort(configEntries, requestedPort, port);\n const hosts = uniqueHosts(entries);\n const primaryHost =\n options.primaryHost ??\n entries.find((entry) => entry.port === port)?.host ??\n hosts[0] ??\n `${sanitizeProjectName(getProjectName(cwd))}.localhost`;\n\n return {\n cwd,\n projectName: sanitizeProjectName(options.project ?? getProjectName(cwd)),\n readOptions,\n configPath: resolvedPath.path,\n configFileName: resolvedPath.fileName,\n configEntries,\n entries,\n hosts,\n requestedPort,\n port,\n dynamicPort,\n bindHost,\n primaryHost,\n https: options.https === true\n };\n}\n","import { execa } from \"execa\";\n\nexport type DoctorResult = {\n ok: boolean;\n caddy: {\n found: boolean;\n version?: string;\n installHint: string;\n };\n};\n\nexport async function checkCaddy(): Promise<DoctorResult[\"caddy\"]> {\n try {\n const result = await execa(\"caddy\", [\"version\"], { reject: false });\n const version = [result.stdout, result.stderr].filter(Boolean).join(\"\\n\").trim();\n\n return {\n found: result.exitCode === 0,\n ...(version ? { version } : {}),\n installHint: \"brew install caddy\"\n };\n } catch {\n return {\n found: false,\n installHint: \"brew install caddy\"\n };\n }\n}\n\nexport async function runDoctor(): Promise<DoctorResult> {\n const caddy = await checkCaddy();\n return {\n ok: caddy.found,\n caddy\n };\n}\n","export type LocalghostEnvironment = NodeJS.ProcessEnv;\n\nconst PRODUCTION_ENV_KEYS = [\"NODE_ENV\", \"VERCEL_ENV\", \"NETLIFY\", \"CF_PAGES_BRANCH\", \"LOCALGHOST_ENV\"] as const;\n\nexport function getProductionReason(env: LocalghostEnvironment = process.env) {\n if (env.LOCALGHOST_ENV === \"production\") return \"LOCALGHOST_ENV=production\";\n if (env.NODE_ENV === \"production\") return \"NODE_ENV=production\";\n if (env.VERCEL_ENV === \"production\") return \"VERCEL_ENV=production\";\n if (env.NETLIFY === \"true\" && env.CONTEXT === \"production\") return \"NETLIFY=true and CONTEXT=production\";\n if (env.CF_PAGES_BRANCH && env.CF_PAGES_BRANCH === env.CF_PAGES_PRODUCTION_BRANCH) {\n return \"CF_PAGES_BRANCH matches CF_PAGES_PRODUCTION_BRANCH\";\n }\n\n return null;\n}\n\nexport function isProductionLike(env: LocalghostEnvironment = process.env) {\n return getProductionReason(env) !== null;\n}\n\nexport function assertLocalDevelopment(command: string, env: LocalghostEnvironment = process.env) {\n const reason = getProductionReason(env);\n if (!reason) return;\n\n throw new Error(`Localghost only runs in local development. Refusing \\`${command}\\` because ${reason}.`);\n}\n\nexport function getProductionEnvKeys() {\n return PRODUCTION_ENV_KEYS;\n}\n","import { writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport { sanitizeProjectName } from \"./config.js\";\nimport { readTextFile } from \"./fs.js\";\nimport type { DevHostEntry } from \"./parse.js\";\n\nexport type UpdateSystemHostsResult = {\n changed: boolean;\n hostsPath: string;\n tempPath?: string;\n};\n\nexport type RemoveSystemHostsResult = UpdateSystemHostsResult & {\n removed: boolean;\n};\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction getManagedBlockPattern(projectName: string) {\n const sanitizedProjectName = sanitizeProjectName(projectName);\n const start = `# localghost:start ${sanitizedProjectName}`;\n const end = `# localghost:end ${sanitizedProjectName}`;\n return new RegExp(`${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}\\\\n?`, \"m\");\n}\n\nexport function getSystemHostsPath() {\n return process.platform === \"win32\" ? \"C:\\\\Windows\\\\System32\\\\drivers\\\\etc\\\\hosts\" : \"/etc/hosts\";\n}\n\nexport function renderHostsBlock(projectName: string, entries: DevHostEntry[]) {\n const sanitizedProjectName = sanitizeProjectName(projectName);\n const hosts = [...new Set(entries.map((entry) => entry.host))].sort();\n\n return [\n `# localghost:start ${sanitizedProjectName}`,\n ...hosts.map((host) => `127.0.0.1 ${host}`),\n `# localghost:end ${sanitizedProjectName}`,\n \"\"\n ].join(\"\\n\");\n}\n\nexport function upsertManagedBlock(existing: string, projectName: string, block: string) {\n const pattern = getManagedBlockPattern(projectName);\n\n if (pattern.test(existing)) {\n return existing.replace(pattern, block);\n }\n\n return `${existing.trimEnd()}\\n\\n${block}`;\n}\n\nexport function removeManagedBlock(existing: string, projectName: string) {\n const pattern = getManagedBlockPattern(projectName);\n\n if (!pattern.test(existing)) {\n return existing;\n }\n\n return existing.replace(pattern, \"\").replace(/\\n{3,}/g, \"\\n\\n\").trimEnd() + \"\\n\";\n}\n\nasync function writeSystemHostsFile(hostsPath: string, next: string, projectName: string) {\n const sanitizedProjectName = sanitizeProjectName(projectName);\n const tempPath = join(tmpdir(), `localghost-${sanitizedProjectName}-hosts`);\n writeFileSync(tempPath, next, \"utf8\");\n\n if (process.platform === \"win32\") {\n throw new Error(`Windows support: run as administrator and copy ${tempPath} to ${hostsPath}.`);\n }\n\n await execa(\"sudo\", [\"cp\", tempPath, hostsPath], { stdio: \"inherit\" });\n\n return tempPath;\n}\n\nexport async function updateSystemHosts(projectName: string, entries: DevHostEntry[]): Promise<UpdateSystemHostsResult> {\n const sanitizedProjectName = sanitizeProjectName(projectName);\n const hostsPath = getSystemHostsPath();\n const existing = readTextFile(hostsPath);\n const block = renderHostsBlock(sanitizedProjectName, entries);\n const next = upsertManagedBlock(existing, sanitizedProjectName, block);\n\n if (next === existing) {\n return { changed: false, hostsPath };\n }\n\n const tempPath = await writeSystemHostsFile(hostsPath, next, sanitizedProjectName);\n\n return { changed: true, hostsPath, tempPath };\n}\n\nexport async function removeSystemHosts(projectName: string): Promise<RemoveSystemHostsResult> {\n const sanitizedProjectName = sanitizeProjectName(projectName);\n const hostsPath = getSystemHostsPath();\n const existing = readTextFile(hostsPath);\n const next = removeManagedBlock(existing, sanitizedProjectName);\n\n if (next === existing) {\n return { changed: false, removed: false, hostsPath };\n }\n\n const tempPath = await writeSystemHostsFile(hostsPath, next, sanitizedProjectName);\n\n return { changed: true, removed: true, hostsPath, tempPath };\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getProjectName, LOCALGHOST_CONFIG_FILE, sanitizeProjectName } from \"./config.js\";\nimport { writeTextFile } from \"./fs.js\";\n\nexport type PackageManager = \"npm\" | \"yarn\" | \"pnpm\";\n\nexport type InitOptions = {\n cwd?: string;\n host?: string;\n port?: number;\n apiHost?: string;\n apiPort?: number;\n force?: boolean;\n packageManager?: PackageManager;\n writeScripts?: boolean;\n configFile?: string;\n};\n\nexport type InitResult = {\n configPath: string;\n configCreated: boolean;\n packageJsonPath?: string;\n packageJsonChanged: boolean;\n packageManager: PackageManager;\n nextSteps: string[];\n};\n\nexport function detectPackageManager(cwd = process.cwd()): PackageManager {\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\nexport function packageRunCommand(packageManager: PackageManager, script: string): string {\n if (packageManager === \"yarn\") return `yarn ${script}`;\n if (packageManager === \"pnpm\") return `pnpm ${script}`;\n return `npm run ${script}`;\n}\n\nexport function packageAddCommand(packageManager: PackageManager, packageName = \"@hamedb89/localghost\"): string {\n if (packageManager === \"yarn\") return `yarn add -D ${packageName}`;\n if (packageManager === \"pnpm\") return `pnpm add -D ${packageName}`;\n return `npm install -D ${packageName}`;\n}\n\nfunction renderConfig(options: Required<Pick<InitOptions, \"host\" | \"port\" | \"apiHost\" | \"apiPort\">>) {\n return [\n \"# Buh. Friendly names for local services.\",\n \"# Format: <host> <port>\",\n `${options.host} ${options.port}`,\n `www.${options.host} ${options.port}`,\n `${options.apiHost} ${options.apiPort}`,\n \"\"\n ].join(\"\\n\");\n}\n\nfunction readPackageJson(path: string): Record<string, unknown> | null {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction shellQuote(value: string) {\n if (/^[A-Za-z0-9_./:-]+$/.test(value)) return value;\n return `'${value.replace(/'/g, `'\"'\"'`)}'`;\n}\n\nfunction getConfigFlag(configFile: string) {\n return configFile === LOCALGHOST_CONFIG_FILE ? \"\" : ` --config ${shellQuote(configFile)}`;\n}\n\nfunction updatePackageScripts(packageJsonPath: string, configFile: string): boolean {\n const pkg = readPackageJson(packageJsonPath);\n if (!pkg) return false;\n\n const scripts = typeof pkg.scripts === \"object\" && pkg.scripts ? (pkg.scripts as Record<string, unknown>) : {};\n const configFlag = getConfigFlag(configFile);\n const nextScripts = {\n ...scripts,\n \"localghost:setup\": scripts[\"localghost:setup\"] ?? `localghost setup${configFlag}`,\n \"localghost:proxy\": scripts[\"localghost:proxy\"] ?? `localghost dev${configFlag}`,\n \"localghost:proxy:https\": scripts[\"localghost:proxy:https\"] ?? `localghost dev${configFlag} --https`,\n \"localghost:run\": scripts[\"localghost:run\"] ?? `localghost run${configFlag} --`,\n \"localghost:ready\": scripts[\"localghost:ready\"] ?? `localghost status${configFlag} --ready`,\n \"localghost:ps\": scripts[\"localghost:ps\"] ?? \"localghost ps\",\n \"localghost:print\": scripts[\"localghost:print\"] ?? `localghost print${configFlag}`,\n \"localghost:routes\": scripts[\"localghost:routes\"] ?? `localghost routes${configFlag}`,\n \"localghost:status\": scripts[\"localghost:status\"] ?? \"localghost status\",\n \"localghost:reset\": scripts[\"localghost:reset\"] ?? \"localghost reset\",\n \"localghost:teardown\": scripts[\"localghost:teardown\"] ?? \"localghost teardown\",\n \"localghost:doctor\": scripts[\"localghost:doctor\"] ?? \"localghost doctor\",\n \"localghost:update\": scripts[\"localghost:update\"] ?? \"localghost update\",\n \"caddy:setup\": scripts[\"caddy:setup\"] ?? `localghost setup${configFlag}`,\n \"caddy:dev\": scripts[\"caddy:dev\"] ?? `localghost dev${configFlag}`\n };\n\n const changed = JSON.stringify(scripts) !== JSON.stringify(nextScripts);\n if (!changed) return false;\n\n pkg.scripts = nextScripts;\n writeFileSync(packageJsonPath, `${JSON.stringify(pkg, null, 2)}\\n`, \"utf8\");\n return true;\n}\n\nexport function initLocalghost(options: InitOptions = {}): InitResult {\n const cwd = options.cwd ?? process.cwd();\n const projectName = sanitizeProjectName(getProjectName(cwd).split(\"/\").pop() ?? \"app\");\n const host = options.host ?? `${projectName}.localhost`;\n const port = options.port ?? 5173;\n const apiHost = options.apiHost ?? `api.${host}`;\n const apiPort = options.apiPort ?? 8787;\n const packageManager = options.packageManager ?? detectPackageManager(cwd);\n const configFile = options.configFile ?? LOCALGHOST_CONFIG_FILE;\n const configPath = join(cwd, configFile);\n const configExists = existsSync(configPath);\n\n if (configExists && !options.force) {\n return {\n configPath,\n configCreated: false,\n packageJsonChanged: false,\n packageManager,\n nextSteps: [\n packageRunCommand(packageManager, \"localghost:doctor\"),\n packageRunCommand(packageManager, \"localghost:setup\"),\n packageRunCommand(packageManager, \"localghost:ready\"),\n packageRunCommand(packageManager, \"localghost:proxy\")\n ]\n };\n }\n\n writeTextFile(configPath, renderConfig({ host, port, apiHost, apiPort }));\n\n const packageJsonPath = join(cwd, \"package.json\");\n const packageJsonChanged = options.writeScripts ? updatePackageScripts(packageJsonPath, configFile) : false;\n\n return {\n configPath,\n configCreated: true,\n ...(existsSync(packageJsonPath) ? { packageJsonPath } : {}),\n packageJsonChanged,\n packageManager,\n nextSteps: [\n packageRunCommand(packageManager, \"localghost:doctor\"),\n packageRunCommand(packageManager, \"localghost:setup\"),\n packageRunCommand(packageManager, \"localghost:ready\"),\n packageRunCommand(packageManager, \"localghost:proxy\")\n ]\n };\n}\n","import { stdin as input, stdout as output } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\n\nexport function canPrompt() {\n return Boolean(input.isTTY && output.isTTY);\n}\n\nexport async function withPrompt<T>(run: (prompt: (question: string) => Promise<string>) => Promise<T>) {\n const rl = createInterface({ input, output });\n try {\n return await run((question) => rl.question(question));\n } finally {\n rl.close();\n }\n}\n\nexport async function confirm(question: string, defaultValue = true) {\n return withPrompt(async (prompt) => {\n const suffix = defaultValue ? \" [Y/n] \" : \" [y/N] \";\n const answer = (await prompt(`${question}${suffix}`)).trim().toLowerCase();\n if (!answer) return defaultValue;\n return answer === \"y\" || answer === \"yes\";\n });\n}\n\nexport async function ask(question: string, defaultValue?: string) {\n return withPrompt(async (prompt) => {\n const suffix = defaultValue ? ` (${defaultValue}) ` : \" \";\n const answer = (await prompt(`${question}${suffix}`)).trim();\n return answer || defaultValue || \"\";\n });\n}\n","import type { DevHostEntry } from \"./parse.js\";\n\nexport type DomainRoute = {\n host: string;\n port: number;\n url: string;\n upstream: string;\n};\n\nexport type DomainRouteOptions = {\n https?: boolean;\n};\n\nexport function getDomainRoutes(entries: DevHostEntry[], options: DomainRouteOptions = {}): DomainRoute[] {\n const protocol = options.https === true ? \"https\" : \"http\";\n\n return [...entries]\n .sort((left, right) => left.host.localeCompare(right.host) || left.port - right.port)\n .map((entry) => ({\n host: entry.host,\n port: entry.port,\n url: `${protocol}://${entry.host}/`,\n upstream: `http://${entry.target}`\n }));\n}\n\nexport function formatDomainRoutes(entries: DevHostEntry[], options: DomainRouteOptions = {}) {\n const routes = getDomainRoutes(entries, options);\n\n if (routes.length === 0) {\n return \"localghost routes\\n no routes\";\n }\n\n return [\n \"localghost routes\",\n ...routes.map((route) => ` ${route.url} -> ${route.upstream}`)\n ].join(\"\\n\");\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { readTextFile, writeTextFile } from \"./fs.js\";\nimport type { DevHostEntry } from \"./parse.js\";\n\nexport const LOCALGHOST_STATE_FILE = \"ops/local/localghost-state.json\";\n\nexport type LocalghostStateAction = \"setup\" | \"teardown\";\n\nexport type LocalghostState = {\n version: 1;\n action: LocalghostStateAction;\n updatedAt: string;\n projectName: string;\n cwd: string;\n configPath?: string;\n hostsPath?: string;\n hostsChanged?: boolean;\n hostsTempPath?: string;\n caddyfilePath?: string;\n caddyfileRemoved?: boolean;\n caddyHttps?: boolean;\n entries?: DevHostEntry[];\n};\n\nexport type WriteLocalghostStateInput = Omit<LocalghostState, \"version\" | \"updatedAt\">;\n\nexport function getLocalghostStatePath(cwd = process.cwd()) {\n return join(cwd, LOCALGHOST_STATE_FILE);\n}\n\nexport function readLocalghostState(cwd = process.cwd()): LocalghostState | null {\n const path = getLocalghostStatePath(cwd);\n if (!existsSync(path)) return null;\n return JSON.parse(readTextFile(path)) as LocalghostState;\n}\n\nexport function writeLocalghostState(cwd: string, state: WriteLocalghostStateInput) {\n const path = getLocalghostStatePath(cwd);\n writeTextFile(path, `${JSON.stringify({ version: 1, updatedAt: new Date().toISOString(), ...state }, null, 2)}\\n`);\n return path;\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport const LOCALGHOST_PACKAGE_NAME = \"@hamedb89/localghost\";\nexport const LOCALGHOST_VERSION = \"0.1.6\";\nexport const UPDATE_CHECK_CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nexport const UPDATE_CHECK_NOTIFY_TTL_MS = 24 * 60 * 60 * 1000;\nexport const UPDATE_CHECK_TIMEOUT_MS = 900;\n\nexport type UpdateCheckCache = {\n checkedAt: string;\n latestVersion?: string;\n notifiedVersion?: string;\n notifiedAt?: string;\n};\n\nexport type UpdateCheckResult = {\n currentVersion: string;\n packageName: string;\n latestVersion?: string;\n updateAvailable: boolean;\n source: \"cache\" | \"registry\" | \"disabled\" | \"error\";\n error?: string;\n};\n\ntype RegistryPackageResponse = {\n \"dist-tags\"?: {\n latest?: unknown;\n };\n};\n\nfunction truthyEnv(value: string | undefined) {\n return value === \"1\" || value === \"true\" || value === \"yes\";\n}\n\nexport function isUpdateCheckDisabled(env: NodeJS.ProcessEnv = process.env) {\n return truthyEnv(env.LOCALGHOST_NO_UPDATE_CHECK);\n}\n\nexport function getUpdateCheckCachePath(env: NodeJS.ProcessEnv = process.env) {\n if (env.LOCALGHOST_UPDATE_CHECK_CACHE) return env.LOCALGHOST_UPDATE_CHECK_CACHE;\n\n const cacheRoot = env.XDG_CACHE_HOME || join(homedir(), \".cache\");\n return join(cacheRoot, \"localghost\", \"update-check.json\");\n}\n\nfunction readCache(path = getUpdateCheckCachePath()): UpdateCheckCache | null {\n if (!existsSync(path)) return null;\n\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as UpdateCheckCache;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(cache: UpdateCheckCache, path = getUpdateCheckCachePath()) {\n try {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(cache, null, 2)}\\n`, \"utf8\");\n } catch {\n // Update checks should never make the real command fail.\n }\n}\n\nfunction ageMs(date: string | undefined, now = Date.now()) {\n if (!date) return Number.POSITIVE_INFINITY;\n const time = Date.parse(date);\n return Number.isFinite(time) ? now - time : Number.POSITIVE_INFINITY;\n}\n\nfunction isCacheFresh(cache: UpdateCheckCache | null, ttlMs: number, now = Date.now()) {\n return Boolean(cache?.latestVersion && ageMs(cache.checkedAt, now) >= 0 && ageMs(cache.checkedAt, now) < ttlMs);\n}\n\ntype ParsedVersion = {\n major: number;\n minor: number;\n patch: number;\n prerelease?: string;\n};\n\nfunction parseVersion(version: string): ParsedVersion | null {\n const match = version.trim().replace(/^v/, \"\").match(/^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?$/);\n if (!match) return null;\n\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n ...(match[4] ? { prerelease: match[4] } : {})\n };\n}\n\nexport function compareVersions(a: string, b: string) {\n const left = parseVersion(a);\n const right = parseVersion(b);\n\n if (!left || !right) return a.localeCompare(b);\n\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (left[key] !== right[key]) return left[key] > right[key] ? 1 : -1;\n }\n\n if (left.prerelease === right.prerelease) return 0;\n if (!left.prerelease) return 1;\n if (!right.prerelease) return -1;\n return left.prerelease.localeCompare(right.prerelease);\n}\n\nexport function isNewerVersion(candidate: string | undefined, current = LOCALGHOST_VERSION) {\n return Boolean(candidate && compareVersions(candidate, current) > 0);\n}\n\nasync function fetchLatestVersion(packageName: string, timeoutMs: number) {\n const encodedName = packageName.startsWith(\"@\") ? `@${packageName.slice(1).replace(\"/\", \"%2f\")}` : packageName;\n const response = await fetch(`https://registry.npmjs.org/${encodedName}`, {\n signal: AbortSignal.timeout(timeoutMs),\n headers: {\n accept: \"application/vnd.npm.install-v1+json\"\n }\n });\n\n if (!response.ok) throw new Error(`npm registry returned ${response.status}`);\n\n const data = (await response.json()) as RegistryPackageResponse;\n const latest = data[\"dist-tags\"]?.latest;\n if (typeof latest !== \"string\" || latest.length === 0) throw new Error(\"npm registry response did not include latest dist-tag\");\n\n return latest;\n}\n\nexport async function checkForUpdate(options: {\n force?: boolean;\n packageName?: string;\n currentVersion?: string;\n timeoutMs?: number;\n cachePath?: string;\n env?: NodeJS.ProcessEnv;\n} = {}): Promise<UpdateCheckResult> {\n const env = options.env ?? process.env;\n const packageName = options.packageName ?? LOCALGHOST_PACKAGE_NAME;\n const currentVersion = options.currentVersion ?? LOCALGHOST_VERSION;\n const cachePath = options.cachePath ?? getUpdateCheckCachePath(env);\n\n if (!options.force && isUpdateCheckDisabled(env)) {\n return {\n currentVersion,\n packageName,\n updateAvailable: false,\n source: \"disabled\"\n };\n }\n\n const cache = readCache(cachePath);\n if (!options.force && isCacheFresh(cache, UPDATE_CHECK_CACHE_TTL_MS)) {\n const latestVersion = cache?.latestVersion;\n return {\n currentVersion,\n packageName,\n ...(latestVersion ? { latestVersion } : {}),\n updateAvailable: isNewerVersion(latestVersion, currentVersion),\n source: \"cache\"\n };\n }\n\n try {\n const latestVersion = await fetchLatestVersion(packageName, options.timeoutMs ?? UPDATE_CHECK_TIMEOUT_MS);\n writeCache({ checkedAt: new Date().toISOString(), latestVersion }, cachePath);\n\n return {\n currentVersion,\n packageName,\n latestVersion,\n updateAvailable: isNewerVersion(latestVersion, currentVersion),\n source: \"registry\"\n };\n } catch (error) {\n const latestVersion = cache?.latestVersion;\n return {\n currentVersion,\n packageName,\n ...(latestVersion ? { latestVersion } : {}),\n updateAvailable: isNewerVersion(latestVersion, currentVersion),\n source: \"error\",\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nexport function formatUpdateMessage(result: UpdateCheckResult) {\n if (!result.updateAvailable || !result.latestVersion) return null;\n\n return [\n `localghost ${result.latestVersion} is available. Current: ${result.currentVersion}`,\n `Update with: npm i -g ${result.packageName}@latest`\n ].join(\"\\n\");\n}\n\nexport function shouldNotifyAboutUpdate(result: UpdateCheckResult, cachePath = getUpdateCheckCachePath(), now = Date.now()) {\n if (!result.updateAvailable || !result.latestVersion) return false;\n\n const cache = readCache(cachePath);\n if (cache?.notifiedVersion !== result.latestVersion) return true;\n\n return ageMs(cache.notifiedAt, now) >= UPDATE_CHECK_NOTIFY_TTL_MS;\n}\n\nexport function markUpdateNotified(result: UpdateCheckResult, cachePath = getUpdateCheckCachePath()) {\n if (!result.latestVersion) return;\n\n const cache = readCache(cachePath) ?? { checkedAt: new Date().toISOString() };\n writeCache(\n {\n ...cache,\n latestVersion: result.latestVersion,\n notifiedVersion: result.latestVersion,\n notifiedAt: new Date().toISOString()\n },\n cachePath\n );\n}\n\nexport async function maybeNotifyAboutUpdate(options: { disabled?: boolean } = {}) {\n if (options.disabled) return;\n\n const cachePath = getUpdateCheckCachePath();\n const result = await checkForUpdate({ cachePath });\n if (!shouldNotifyAboutUpdate(result, cachePath)) return;\n\n const message = formatUpdateMessage(result);\n if (!message) return;\n\n console.warn(`\\n${message}`);\n markUpdateNotified(result, cachePath);\n}\n"],"mappings":"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","names":["existsSync","readFileSync","input","existsSync","readFileSync","join","input","fileName","existsSync","readFileSync","join","dirname","join","mkdirSync","readFileSync","writeFileSync","dirname","join","dirname","dirname","resolve","execa","writeFileSync","join","execa","join","writeFileSync","execa","existsSync","readFileSync","writeFileSync","join","existsSync","join","readFileSync","writeFileSync","join","existsSync","existsSync","join","join","existsSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","execa","parsePort","readFileSync","existsSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/activity.ts","../src/config.ts","../src/parse.ts","../src/caddy.ts","../src/fs.ts","../src/context.ts","../src/port.ts","../src/doctor.ts","../src/env.ts","../src/hosts-file.ts","../src/init.ts","../src/prompt.ts","../src/routes.ts","../src/state.ts","../src/update-check.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { existsSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { Command, InvalidArgumentError } from \"commander\";\nimport {\n getLocalghostActivityPath,\n listLocalghostRuns,\n registerLocalghostRun,\n unregisterLocalghostRun,\n type LocalghostRunRecord\n} from \"./activity.js\";\nimport { getProjectName, readDevHosts, resolveDevHostsPath, sanitizeProjectName, type ReadDevHostsOptions } from \"./config.js\";\nimport { getCaddyfilePath, renderCaddyfile, validateCaddyfile, writeCaddyfile, startCaddy, trustCaddy } from \"./caddy.js\";\nimport { resolveLocalghostContext } from \"./context.js\";\nimport { checkCaddy, runDoctor } from \"./doctor.js\";\nimport { assertLocalDevelopment } from \"./env.js\";\nimport { getSystemHostsPath, removeSystemHosts, renderHostsBlock, updateSystemHosts } from \"./hosts-file.js\";\nimport { initLocalghost, type PackageManager } from \"./init.js\";\nimport { findLocalMdnsHosts, type DevHostEntry } from \"./parse.js\";\nimport { isPortAvailable } from \"./port.js\";\nimport { canPrompt, confirm } from \"./prompt.js\";\nimport { formatDomainRoutes } from \"./routes.js\";\nimport { getLocalghostStatePath, patchLocalghostState, readLocalghostState, writeLocalghostState } from \"./state.js\";\nimport { checkForUpdate, formatUpdateMessage, LOCALGHOST_VERSION, maybeNotifyAboutUpdate } from \"./update-check.js\";\nimport { execa } from \"execa\";\n\nfunction warnAboutLocalMdns(entries: ReturnType<typeof readDevHosts>) {\n const localHosts = findLocalMdnsHosts(entries);\n\n if (localHosts.length > 0) {\n console.warn(\n `Warning: .local can collide with mDNS/Bonjour. Prefer .localhost for dev hosts: ${localHosts.join(\", \")}`\n );\n }\n}\n\nfunction logDomainRoutes(entries: ReturnType<typeof readDevHosts>, options: { https?: boolean } = {}) {\n console.log(formatDomainRoutes(entries, options));\n}\n\nfunction parsePort(value: string) {\n const port = Number.parseInt(value, 10);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new InvalidArgumentError(\"Port must be a number between 1 and 65535.\");\n }\n\n return port;\n}\n\nfunction parsePackageManager(value: string): PackageManager {\n if (value === \"npm\" || value === \"yarn\" || value === \"pnpm\") return value;\n throw new InvalidArgumentError(\"Package manager must be npm, yarn, or pnpm.\");\n}\n\nfunction collect(value: string, previous: string[] = []) {\n return [...previous, value];\n}\n\nfunction parseBooleanLike(value: string | boolean) {\n if (value === true) return true;\n if (value === false) return false;\n const normalized = value.toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"y\", \"on\"].includes(normalized)) return true;\n if ([\"0\", \"false\", \"no\", \"n\", \"off\"].includes(normalized)) return false;\n throw new InvalidArgumentError(\"Value must be yes or no.\");\n}\n\ntype ConfigCliOptions = {\n cwd: string;\n config?: string[];\n configPattern?: string;\n};\n\ntype ProxyModeCliOptions = {\n https?: boolean;\n ssl?: boolean;\n};\n\ntype TrustCliOptions = {\n trust?: boolean;\n};\n\nfunction contextOptionsFromCli(options: ConfigCliOptions & { project?: string } & ProxyModeCliOptions) {\n return {\n cwd: options.cwd,\n ...(options.project ? { project: options.project } : {}),\n ...(options.config && options.config.length > 0 ? { configFiles: options.config } : {}),\n ...(options.configPattern ? { configPattern: options.configPattern } : {}),\n ...(useHttps(options) ? { https: true } : {})\n };\n}\n\nfunction readOptionsFromCli(options: ConfigCliOptions): ReadDevHostsOptions {\n return {\n cwd: options.cwd,\n ...(options.config && options.config.length > 0 ? { configFiles: options.config } : {}),\n ...(options.configPattern ? { configPattern: options.configPattern } : {})\n };\n}\n\nasync function assertCaddyReady() {\n const caddy = await checkCaddy();\n if (caddy.found) return;\n\n throw new Error([\n \"Caddy was not found.\",\n `Install it with: ${caddy.installHint}`,\n \"Localghost will not install it for you. No surprise spells.\"\n ].join(\"\\n\"));\n}\n\nfunction existingTrustMarkers(cwd: string) {\n const state = readLocalghostState(cwd);\n return {\n ...(state?.caddyTrustedAt ? { caddyTrustedAt: state.caddyTrustedAt } : {}),\n ...(state?.caddyTrustPromptedAt ? { caddyTrustPromptedAt: state.caddyTrustPromptedAt } : {})\n };\n}\n\nfunction explainHostsPassword() {\n console.log(\"Localghost may ask for your password to update its managed block in /etc/hosts.\");\n console.log(\"It will only touch the lines between # localghost:start and # localghost:end.\");\n}\n\nfunction explainTrustPassword() {\n console.log(\"Localghost can trust Caddy's local HTTPS CA so browsers stop showing local certificate warnings.\");\n console.log(\"macOS may ask for your password to add that local CA to Keychain.\");\n console.log(\"This only affects Caddy's local development certificates on this machine.\");\n}\n\nfunction useHttps(options: ProxyModeCliOptions) {\n return options.https === true || options.ssl === true;\n}\n\nfunction getSetupCommand(options: { https?: boolean; config?: string[]; configPattern?: string }) {\n const configFlags = [\n ...(options.config ?? []).map((config) => ` --config ${config}`),\n ...(options.configPattern ? [` --config-pattern ${options.configPattern}`] : [])\n ].join(\"\");\n return `localghost setup${configFlags}${options.https ? \" --https\" : \"\"}`;\n}\n\nfunction getSetupReadiness(options: ConfigCliOptions & {\n project?: string;\n https?: boolean;\n ignoreCaddyfile?: boolean;\n entries?: DevHostEntry[];\n configPath?: string;\n projectName?: string;\n}) {\n const projectName = sanitizeProjectName(options.projectName ?? options.project ?? getProjectName(options.cwd));\n const readOptions = readOptionsFromCli(options);\n const entries = options.entries ?? readDevHosts(readOptions);\n const configPath = options.configPath ?? resolveDevHostsPath(readOptions).path;\n const caddyfilePath = getCaddyfilePath(options.cwd);\n const statePath = getLocalghostStatePath(options.cwd);\n const state = readLocalghostState(options.cwd);\n const https = options.https === true;\n const reasons: string[] = [];\n\n if (!state) {\n reasons.push(`No Localghost setup state found at ${statePath}.`);\n } else {\n if (state.action !== \"setup\") reasons.push(`Last Localghost action is ${state.action}, not setup.`);\n if (state.projectName !== projectName) reasons.push(`Setup state is for project ${state.projectName}, not ${projectName}.`);\n if (state.configPath !== configPath) reasons.push(`Setup state points at ${state.configPath ?? \"no config\"}, not ${configPath}.`);\n }\n\n const hostsPath = getSystemHostsPath();\n try {\n const hosts = readFileSync(hostsPath, \"utf8\");\n const expectedHostsBlock = renderHostsBlock(projectName, entries).trimEnd();\n if (!hosts.includes(expectedHostsBlock)) {\n reasons.push(`The Localghost hosts block in ${hostsPath} is missing or stale.`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n reasons.push(`Could not read ${hostsPath}: ${message}`);\n }\n\n if (!options.ignoreCaddyfile) {\n if (!existsSync(caddyfilePath)) {\n reasons.push(`Missing Caddyfile at ${caddyfilePath}.`);\n } else {\n const expectedCaddyfile = renderCaddyfile(entries, { https });\n const currentCaddyfile = readFileSync(caddyfilePath, \"utf8\");\n if (currentCaddyfile !== expectedCaddyfile) {\n reasons.push(`Caddyfile at ${caddyfilePath} is stale for ${https ? \"HTTPS\" : \"HTTP\"} mode.`);\n }\n }\n }\n\n return {\n ready: reasons.length === 0,\n reasons,\n entries,\n projectName,\n configPath,\n caddyfilePath,\n statePath,\n setupCommand: getSetupCommand(options)\n };\n}\n\nasync function runSetupFromReadiness(\n cwd: string,\n https: boolean,\n readiness: ReturnType<typeof getSetupReadiness>\n) {\n explainHostsPassword();\n const hostsResult = await updateSystemHosts(readiness.projectName, readiness.entries);\n const caddyfilePath = await writeCaddyfile(readiness.entries, cwd, { https });\n await validateCaddyfile(caddyfilePath);\n writeLocalghostState(cwd, {\n action: \"setup\",\n projectName: readiness.projectName,\n cwd,\n configPath: readiness.configPath,\n hostsPath: hostsResult.hostsPath,\n hostsChanged: hostsResult.changed,\n ...(hostsResult.tempPath ? { hostsTempPath: hostsResult.tempPath } : {}),\n caddyfilePath,\n caddyHttps: https,\n ...existingTrustMarkers(cwd),\n entries: readiness.entries\n });\n}\n\nfunction wait(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function runTrust(cwd: string, caddyfilePath: string) {\n await wait(350);\n try {\n await trustCaddy(caddyfilePath);\n } catch {\n await wait(750);\n await trustCaddy(caddyfilePath);\n }\n\n patchLocalghostState(cwd, { caddyTrustedAt: new Date().toISOString() });\n console.log(\"Local HTTPS trust is ready.\");\n}\n\nasync function maybeTrustCaddy(\n options: {\n cwd: string;\n https: boolean;\n caddyfilePath: string;\n trust?: boolean;\n }\n) {\n if (!options.https) return;\n\n const state = readLocalghostState(options.cwd);\n if (!options.trust && state?.caddyTrustedAt) return;\n\n let shouldTrust = options.trust === true;\n\n if (!shouldTrust) {\n if (state?.caddyTrustPromptedAt || !canPrompt()) return;\n\n explainTrustPassword();\n shouldTrust = await confirm(\"Trust local HTTPS certificates now?\", true);\n }\n\n if (!shouldTrust) {\n patchLocalghostState(options.cwd, { caddyTrustPromptedAt: new Date().toISOString() });\n console.log(\"Okay. Localghost will still run HTTPS, but the browser may show a certificate warning.\");\n console.log(\"Run localghost trust when you want to trust Caddy's local CA.\");\n return;\n }\n\n await runTrust(options.cwd, options.caddyfilePath);\n}\n\ntype LocalghostRunView = LocalghostRunRecord & {\n routes: Array<{\n host: string;\n port: number;\n target: string;\n listening: boolean;\n }>;\n};\n\nfunction maybePid(pid: number | undefined) {\n return typeof pid === \"number\" && Number.isInteger(pid) && pid > 0 ? pid : undefined;\n}\n\nfunction registerCleanup(id: string) {\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n unregisterLocalghostRun(id);\n };\n\n process.once(\"exit\", cleanup);\n\n return () => {\n cleanup();\n process.off(\"exit\", cleanup);\n };\n}\n\nasync function getRunView(run: LocalghostRunRecord): Promise<LocalghostRunView> {\n const portStatus = new Map<number, boolean>();\n\n for (const entry of run.entries) {\n if (!portStatus.has(entry.port)) {\n portStatus.set(entry.port, !(await isPortAvailable(entry.port)));\n }\n }\n\n return {\n ...run,\n routes: run.entries.map((entry) => ({\n host: entry.host,\n port: entry.port,\n target: `127.0.0.1:${entry.port}`,\n listening: portStatus.get(entry.port) ?? false\n }))\n };\n}\n\nfunction formatRunViews(runs: LocalghostRunView[]) {\n if (runs.length === 0) return \"No Localghost apps are running.\";\n\n const lines = [\"localghost ps\"];\n for (const run of runs) {\n const command = run.childCommand?.length ? ` ${run.childCommand.join(\" \")}` : \"\";\n const mode = command ? `${run.mode}:${command}` : run.mode;\n lines.push(\"\");\n lines.push(`${run.projectName} ${mode}`);\n lines.push(` cwd: ${run.cwd}`);\n lines.push(` pid: ${run.pid}${run.caddyPid ? `, caddy: ${run.caddyPid}` : \"\"}${run.childPid ? `, child: ${run.childPid}` : \"\"}`);\n lines.push(` started: ${run.startedAt}`);\n for (const route of run.routes) {\n lines.push(` ${route.host} -> ${route.target} (${route.listening ? \"listening\" : \"not listening\"})`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nconst program = new Command();\n\nprogram\n .name(\"localghost\")\n .description(\"Buh. Friendly local hostnames for app repos.\")\n .version(LOCALGHOST_VERSION)\n .option(\"--no-update-check\", \"Skip the npm update check for this run\");\n\nprogram.hook(\"postAction\", async (_thisCommand, actionCommand) => {\n if (actionCommand.name() === \"update\") return;\n\n const options = program.opts<{ updateCheck?: boolean }>();\n await maybeNotifyAboutUpdate({ disabled: options.updateCheck === false });\n});\n\nprogram\n .command(\"init\")\n .description(\"Create a .localghost config for this project\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to create\", \".localghost\")\n .option(\"--host <host>\", \"Primary local hostname\")\n .option(\"--port <number>\", \"Primary app port\", parsePort)\n .option(\"--api-host <host>\", \"API local hostname\")\n .option(\"--api-port <number>\", \"API port\", parsePort)\n .option(\"--package-manager <npm|yarn|pnpm>\", \"Package manager for suggested commands\", parsePackageManager)\n .option(\"--write-scripts\", \"Add localghost scripts to package.json\")\n .option(\"--force\", \"Overwrite an existing config file\")\n .action((options: {\n cwd: string;\n config: string;\n host?: string;\n port?: number;\n apiHost?: string;\n apiPort?: number;\n packageManager?: PackageManager;\n writeScripts?: boolean;\n force?: boolean;\n }) => {\n const result = initLocalghost({ ...options, configFile: options.config });\n\n if (result.configCreated) {\n console.log(`Buh. Created ${result.configPath}`);\n } else {\n console.log(`${result.configPath} already exists. Use --force to rewrite it.`);\n }\n\n if (options.writeScripts) {\n if (result.packageJsonChanged) {\n console.log(`Updated ${result.packageJsonPath}`);\n } else if (result.packageJsonPath) {\n console.log(`${result.packageJsonPath} already has localghost scripts.`);\n } else {\n console.log(\"No package.json found; skipped script setup.\");\n }\n }\n\n console.log(\"Next:\");\n for (const step of result.nextSteps) {\n console.log(` ${step}`);\n }\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Check machine prerequisites\")\n .action(async () => {\n const result = await runDoctor();\n\n if (result.caddy.found) {\n console.log(`Caddy: ${result.caddy.version ?? \"found\"}`);\n } else {\n console.log(\"Caddy: missing\");\n console.log(`Run: ${result.caddy.installHint}`);\n console.log(\"Localghost will not install it for you. No surprise spells.\");\n }\n\n if (!result.ok) {\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"update\")\n .description(\"Check npm for a newer localghost release\")\n .option(\"--json\", \"Print raw JSON\")\n .action(async (options: { json?: boolean }) => {\n const result = await checkForUpdate({ force: true, timeoutMs: 5000 });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const message = formatUpdateMessage(result);\n if (message) {\n console.log(message);\n return;\n }\n\n if (result.source === \"error\") {\n console.log(`Could not check npm for updates: ${result.error ?? \"unknown error\"}`);\n process.exitCode = 1;\n return;\n }\n\n console.log(`localghost is up to date. Current: ${result.currentVersion}`);\n });\n\nprogram\n .command(\"setup\")\n .description(\"Update /etc/hosts and generate/validate Caddyfile\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .option(\"--https\", \"Generate a local HTTPS Caddy proxy with Caddy local certificates\")\n .option(\"--ssl\", \"Alias for --https\")\n .action(async (options: ConfigCliOptions & { project?: string } & ProxyModeCliOptions) => {\n assertLocalDevelopment(\"setup\");\n await assertCaddyReady();\n\n const context = await resolveLocalghostContext({ ...contextOptionsFromCli(options), dynamicPort: false });\n const https = context.https;\n const projectName = context.projectName;\n const configPath = context.configPath;\n const entries = context.entries;\n\n warnAboutLocalMdns(entries);\n logDomainRoutes(entries, { https });\n\n explainHostsPassword();\n const hostsResult = await updateSystemHosts(projectName, entries);\n\n if (hostsResult.changed) {\n console.log(`Updated ${hostsResult.hostsPath}`);\n } else {\n console.log(`${hostsResult.hostsPath} already up to date`);\n }\n\n const caddyfile = await writeCaddyfile(entries, options.cwd, { https });\n await validateCaddyfile(caddyfile);\n\n const statePath = writeLocalghostState(options.cwd, {\n action: \"setup\",\n projectName,\n cwd: options.cwd,\n configPath,\n hostsPath: hostsResult.hostsPath,\n hostsChanged: hostsResult.changed,\n ...(hostsResult.tempPath ? { hostsTempPath: hostsResult.tempPath } : {}),\n caddyfilePath: caddyfile,\n caddyHttps: https,\n ...existingTrustMarkers(options.cwd),\n entries\n });\n\n console.log(`Generated ${caddyfile}`);\n console.log(`Mode ${https ? \"HTTPS\" : \"HTTP\"}`);\n console.log(`State ${statePath}`);\n console.log(\"Setup complete.\");\n });\n\nprogram\n .command(\"trust\")\n .description(\"Trust Caddy's local HTTPS CA for this project's HTTPS proxy\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .option(\"--https\", \"Use HTTPS mode for the Caddyfile\")\n .option(\"--ssl\", \"Alias for --https\")\n .action(async (options: ConfigCliOptions & { project?: string } & ProxyModeCliOptions) => {\n assertLocalDevelopment(\"trust\");\n await assertCaddyReady();\n\n const context = await resolveLocalghostContext({ ...contextOptionsFromCli(options), dynamicPort: false });\n if (!context.https) {\n throw new Error(\"Localghost HTTPS is not enabled for this context. Set https: true in localghost.config.mjs or pass --https.\");\n }\n\n warnAboutLocalMdns(context.entries);\n logDomainRoutes(context.entries, { https: true });\n explainTrustPassword();\n\n const caddyfile = await writeCaddyfile(context.entries, options.cwd, { https: true });\n await validateCaddyfile(caddyfile);\n await runTrust(options.cwd, caddyfile);\n });\n\nprogram\n .command(\"reset\")\n .description(\"Remove Localghost setup state without deleting .localghost\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .action(async (options: { project?: string; cwd: string }) => {\n assertLocalDevelopment(\"reset\");\n\n const projectName = sanitizeProjectName(options.project ?? getProjectName(options.cwd));\n const caddyfilePath = getCaddyfilePath(options.cwd);\n const statePath = getLocalghostStatePath(options.cwd);\n\n explainHostsPassword();\n const hostsResult = await removeSystemHosts(projectName);\n\n if (existsSync(caddyfilePath)) {\n unlinkSync(caddyfilePath);\n console.log(`Removed ${caddyfilePath}`);\n } else {\n console.log(`${caddyfilePath} was not present`);\n }\n\n if (existsSync(statePath)) {\n unlinkSync(statePath);\n console.log(`Removed ${statePath}`);\n } else {\n console.log(`${statePath} was not present`);\n }\n\n if (hostsResult.removed) {\n console.log(`Removed Localghost hosts block from ${hostsResult.hostsPath}`);\n } else {\n console.log(`No Localghost hosts block found in ${hostsResult.hostsPath}`);\n }\n\n console.log(\".localghost was left in place. Run localghost setup when you are ready.\");\n });\n\nprogram\n .command(\"teardown\")\n .description(\"Remove Localghost's managed /etc/hosts block\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--remove-caddyfile\", \"Also remove ops/local/Caddyfile\")\n .action(async (options: { project?: string; cwd: string; removeCaddyfile?: boolean }) => {\n assertLocalDevelopment(\"teardown\");\n const projectName = sanitizeProjectName(options.project ?? getProjectName(options.cwd));\n explainHostsPassword();\n const hostsResult = await removeSystemHosts(projectName);\n const caddyfilePath = getCaddyfilePath(options.cwd);\n let caddyfileRemoved = false;\n\n if (options.removeCaddyfile && existsSync(caddyfilePath)) {\n unlinkSync(caddyfilePath);\n caddyfileRemoved = true;\n }\n\n const statePath = writeLocalghostState(options.cwd, {\n action: \"teardown\",\n projectName,\n cwd: options.cwd,\n hostsPath: hostsResult.hostsPath,\n hostsChanged: hostsResult.changed,\n ...(hostsResult.tempPath ? { hostsTempPath: hostsResult.tempPath } : {}),\n caddyfilePath,\n caddyfileRemoved\n });\n\n if (hostsResult.removed) {\n console.log(`Removed Localghost hosts block from ${hostsResult.hostsPath}`);\n } else {\n console.log(`No Localghost hosts block found in ${hostsResult.hostsPath}`);\n }\n\n if (options.removeCaddyfile) {\n console.log(caddyfileRemoved ? `Removed ${caddyfilePath}` : `${caddyfilePath} was not present`);\n }\n\n console.log(`State ${statePath}`);\n });\n\nprogram\n .command(\"status\")\n .description(\"Print Localghost's project-local state file\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .option(\"--ready\", \"Exit non-zero when setup is missing or stale\")\n .option(\"--https\", \"Check setup readiness for HTTPS mode\")\n .option(\"--ssl\", \"Alias for --https\")\n .option(\"--json\", \"Print raw JSON\")\n .action(async (options: ConfigCliOptions & { project?: string; ready?: boolean; json?: boolean } & ProxyModeCliOptions) => {\n const state = readLocalghostState(options.cwd);\n const statePath = getLocalghostStatePath(options.cwd);\n const context = await resolveLocalghostContext({ ...contextOptionsFromCli(options), dynamicPort: false });\n const readiness = getSetupReadiness({\n ...options,\n https: context.https,\n entries: context.entries,\n configPath: context.configPath,\n projectName: context.projectName\n });\n\n if (options.json) {\n console.log(JSON.stringify({ state, setup: readiness }, null, 2));\n return;\n }\n\n if (!state) {\n console.log(`No Localghost state found at ${statePath}`);\n } else {\n console.log(`State: ${statePath}`);\n console.log(`Last action: ${state.action}`);\n console.log(`Updated: ${state.updatedAt}`);\n console.log(`Project: ${state.projectName}`);\n if (state.configPath) console.log(`Config: ${state.configPath}`);\n if (state.hostsPath) console.log(`Hosts: ${state.hostsPath}`);\n if (state.caddyfilePath) console.log(`Caddyfile: ${state.caddyfilePath}`);\n if (typeof state.caddyHttps === \"boolean\") console.log(`Mode: ${state.caddyHttps ? \"HTTPS\" : \"HTTP\"}`);\n if (state.caddyTrustedAt) console.log(`HTTPS trust: yes (${state.caddyTrustedAt})`);\n if (!state.caddyTrustedAt && state.caddyTrustPromptedAt) console.log(`HTTPS trust: not enabled (asked ${state.caddyTrustPromptedAt})`);\n if (typeof state.caddyfileRemoved === \"boolean\") console.log(`Caddyfile removed: ${state.caddyfileRemoved}`);\n }\n\n if (readiness.ready) {\n console.log(\"Setup ready: yes\");\n return;\n }\n\n console.log(\"Setup ready: no\");\n for (const reason of readiness.reasons) {\n console.log(` - ${reason}`);\n }\n console.log(`Run: ${readiness.setupCommand}`);\n\n if (options.ready) {\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"routes\")\n .description(\"Print domain to upstream routes\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .option(\"--http\", \"Print domain URLs with http instead of https\")\n .option(\"--https\", \"Print domain URLs with https\")\n .option(\"--ssl\", \"Alias for --https\")\n .action(async (options: ConfigCliOptions & { http?: boolean } & ProxyModeCliOptions) => {\n const context = await resolveLocalghostContext({ ...contextOptionsFromCli(options), dynamicPort: false });\n warnAboutLocalMdns(context.entries);\n console.log(formatDomainRoutes(context.entries, { https: options.http ? false : context.https }));\n });\n\nprogram\n .command(\"dev\")\n .description(\"Run the Localghost Caddy proxy after setup\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .option(\"--https\", \"Run a local HTTPS proxy with Caddy local certificates\")\n .option(\"--ssl\", \"Alias for --https\")\n .option(\"--setup\", \"Run setup before starting the proxy when setup is missing or stale\")\n .option(\"--trust\", \"Trust Caddy's local HTTPS CA before starting the proxy\")\n .action(async (options: ConfigCliOptions & { project?: string; setup?: boolean } & ProxyModeCliOptions & TrustCliOptions) => {\n assertLocalDevelopment(\"dev\");\n await assertCaddyReady();\n\n const context = await resolveLocalghostContext({ ...contextOptionsFromCli(options), dynamicPort: false });\n const https = context.https;\n const readiness = getSetupReadiness({\n ...options,\n https,\n entries: context.entries,\n configPath: context.configPath,\n projectName: context.projectName\n });\n\n if (!readiness.ready) {\n if (!options.setup) {\n throw new Error(\n [\n \"Localghost setup is missing or stale.\",\n ...readiness.reasons.map((reason) => `- ${reason}`),\n `Run: ${readiness.setupCommand}`,\n \"Or rerun dev with --setup if you want Localghost to perform setup first.\"\n ].join(\"\\n\")\n );\n }\n\n explainHostsPassword();\n const hostsResult = await updateSystemHosts(readiness.projectName, readiness.entries);\n const caddyfilePath = await writeCaddyfile(readiness.entries, options.cwd, { https });\n await validateCaddyfile(caddyfilePath);\n writeLocalghostState(options.cwd, {\n action: \"setup\",\n projectName: readiness.projectName,\n cwd: options.cwd,\n configPath: readiness.configPath,\n hostsPath: hostsResult.hostsPath,\n hostsChanged: hostsResult.changed,\n ...(hostsResult.tempPath ? { hostsTempPath: hostsResult.tempPath } : {}),\n caddyfilePath,\n caddyHttps: https,\n ...existingTrustMarkers(options.cwd),\n entries: readiness.entries\n });\n }\n\n warnAboutLocalMdns(readiness.entries);\n logDomainRoutes(readiness.entries, { https });\n\n const caddyfile = await writeCaddyfile(readiness.entries, options.cwd, { https });\n await validateCaddyfile(caddyfile);\n const caddy = startCaddy(caddyfile);\n try {\n await maybeTrustCaddy({\n cwd: options.cwd,\n https,\n caddyfilePath: caddyfile,\n ...(typeof options.trust === \"boolean\" ? { trust: options.trust } : {})\n });\n } catch (error) {\n if (!caddy.killed) caddy.kill(\"SIGINT\");\n throw error;\n }\n const caddyPid = maybePid(caddy.pid);\n const runRecord = registerLocalghostRun({\n mode: \"dev\",\n cwd: options.cwd,\n projectName: readiness.projectName,\n configPath: readiness.configPath,\n caddyfilePath: caddyfile,\n ...(caddyPid ? { caddyPid } : {}),\n https,\n entries: readiness.entries\n });\n const cleanupRun = registerCleanup(runRecord.id);\n\n try {\n await caddy;\n } finally {\n cleanupRun();\n }\n });\n\nprogram\n .command(\"run\")\n .description(\"Run Caddy and a dev command from the same Localghost context\")\n .option(\"--project <name>\", \"Managed /etc/hosts block name\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .option(\"--port <number>\", \"Initial app port\", parsePort)\n .option(\"--https\", \"Run a local HTTPS proxy with Caddy local certificates\")\n .option(\"--ssl\", \"Alias for --https\")\n .option(\"--setup\", \"Run setup before starting when setup is missing or stale\")\n .option(\"--trust\", \"Trust Caddy's local HTTPS CA before starting the child command\")\n .option(\"--dynamic-port [yes|no]\", \"Use the requested port if free, otherwise continue upward\", parseBooleanLike, false)\n .argument(\"<command...>\", \"Command to run after --, for example: localghost run -- vite\")\n .action(async (\n command: string[],\n options: ConfigCliOptions & { project?: string; port?: number; setup?: boolean; dynamicPort?: boolean } & ProxyModeCliOptions & TrustCliOptions\n ) => {\n assertLocalDevelopment(\"run\");\n await assertCaddyReady();\n\n const context = await resolveLocalghostContext({\n cwd: options.cwd,\n ...(options.project ? { project: options.project } : {}),\n ...(options.config && options.config.length > 0 ? { configFiles: options.config } : {}),\n ...(options.configPattern ? { configPattern: options.configPattern } : {}),\n ...(options.port ? { port: options.port } : {}),\n ...(useHttps(options) ? { https: true } : {}),\n ...(typeof options.dynamicPort === \"boolean\" ? { dynamicPort: options.dynamicPort } : {})\n });\n const https = context.https;\n const readiness = getSetupReadiness({\n ...options,\n https,\n ignoreCaddyfile: true,\n entries: context.entries,\n configPath: context.configPath,\n projectName: context.projectName\n });\n\n if (!readiness.ready) {\n const shouldSetup = options.setup === true || (canPrompt() && await confirm(\"Run caddy:setup now?\", true));\n if (!shouldSetup) {\n throw new Error(\n [\n \"Localghost setup is missing or stale.\",\n ...readiness.reasons.map((reason) => `- ${reason}`),\n `Run: ${readiness.setupCommand}`\n ].join(\"\\n\")\n );\n }\n\n await runSetupFromReadiness(options.cwd, https, readiness);\n console.log(`All set. Setup state: ${getLocalghostStatePath(options.cwd)}`);\n }\n\n if (context.dynamicPort && context.port !== context.requestedPort) {\n console.log(`Port ${context.requestedPort} is busy; using ${context.port}.`);\n }\n\n warnAboutLocalMdns(context.entries);\n logDomainRoutes(context.entries, { https });\n\n const caddyfile = await writeCaddyfile(context.entries, options.cwd, { https });\n await validateCaddyfile(caddyfile);\n const caddy = startCaddy(caddyfile);\n const caddyExit = caddy.catch((error: unknown) => {\n if (!caddy.killed) throw error;\n });\n try {\n await maybeTrustCaddy({\n cwd: options.cwd,\n https,\n caddyfilePath: caddyfile,\n ...(typeof options.trust === \"boolean\" ? { trust: options.trust } : {})\n });\n } catch (error) {\n if (!caddy.killed) caddy.kill(\"SIGINT\");\n throw error;\n }\n const [binary, ...args] = command;\n if (!binary) {\n throw new Error(\"Missing command. Use: localghost run -- vite\");\n }\n\n const child = execa(binary, args, {\n cwd: options.cwd,\n stdio: \"inherit\",\n env: {\n ...process.env,\n LOCALGHOST_PORT: String(context.port),\n LOCALGHOST_DYNAMIC_PORT: context.dynamicPort ? \"1\" : \"0\",\n VITE_PORT: String(context.port)\n }\n });\n const caddyPid = maybePid(caddy.pid);\n const childPid = maybePid(child.pid);\n const runRecord = registerLocalghostRun({\n mode: \"run\",\n cwd: context.cwd,\n projectName: context.projectName,\n configPath: context.configPath,\n caddyfilePath: caddyfile,\n ...(caddyPid ? { caddyPid } : {}),\n ...(childPid ? { childPid } : {}),\n childCommand: command,\n https,\n requestedPort: context.requestedPort,\n port: context.port,\n dynamicPort: context.dynamicPort,\n entries: context.entries\n });\n const cleanupRun = registerCleanup(runRecord.id);\n\n const stopCaddy = () => {\n if (!caddy.killed) caddy.kill(\"SIGINT\");\n };\n const stopChild = () => {\n if (!child.killed) child.kill(\"SIGINT\");\n };\n\n try {\n await Promise.race([child, caddyExit]);\n } finally {\n stopChild();\n stopCaddy();\n await Promise.allSettled([child, caddyExit]);\n cleanupRun();\n }\n });\n\nprogram\n .command(\"ps\")\n .description(\"Show Localghost dev sessions that are currently running\")\n .option(\"--json\", \"Print raw JSON\")\n .action(async (options: { json?: boolean }) => {\n const runs = await Promise.all(listLocalghostRuns().map((run) => getRunView(run)));\n\n if (options.json) {\n console.log(JSON.stringify({ activityPath: getLocalghostActivityPath(), runs }, null, 2));\n return;\n }\n\n console.log(formatRunViews(runs));\n });\n\nprogram\n .command(\"print\")\n .description(\"Print parsed host config\")\n .option(\"--cwd <path>\", \"Project directory\", process.cwd())\n .option(\"--config <file>\", \"Config file to look for. Can be repeated.\", collect, [])\n .option(\"--config-pattern <regex>\", \"Regex for config filenames in the project root\")\n .action((options: ConfigCliOptions) => {\n const entries = readDevHosts(readOptionsFromCli(options));\n warnAboutLocalMdns(entries);\n console.log(JSON.stringify(entries, null, 2));\n });\n\nprogram.parseAsync().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n});\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type { DevHostEntry } from \"./parse.js\";\n\nexport const LOCALGHOST_ACTIVITY_VERSION = 1;\n\nexport type LocalghostRunMode = \"dev\" | \"run\";\n\nexport type LocalghostRunRecord = {\n id: string;\n mode: LocalghostRunMode;\n pid: number;\n cwd: string;\n projectName: string;\n startedAt: string;\n updatedAt: string;\n configPath?: string;\n caddyfilePath?: string;\n caddyPid?: number;\n childPid?: number;\n childCommand?: string[];\n https?: boolean;\n requestedPort?: number;\n port?: number;\n dynamicPort?: boolean;\n entries: DevHostEntry[];\n};\n\nexport type LocalghostActivity = {\n version: typeof LOCALGHOST_ACTIVITY_VERSION;\n runs: LocalghostRunRecord[];\n};\n\nexport type RegisterLocalghostRunInput = Omit<LocalghostRunRecord, \"id\" | \"pid\" | \"startedAt\" | \"updatedAt\"> & {\n id?: string;\n pid?: number;\n startedAt?: string;\n};\n\nexport function getLocalghostActivityPath(env: NodeJS.ProcessEnv = process.env) {\n if (env.LOCALGHOST_ACTIVITY_PATH) return env.LOCALGHOST_ACTIVITY_PATH;\n\n const stateRoot = env.XDG_STATE_HOME || join(homedir(), \".local/state\");\n return join(stateRoot, \"localghost\", \"activity.json\");\n}\n\nexport function isProcessRunning(pid: number) {\n if (!Number.isInteger(pid) || pid < 1) return false;\n\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n const code = typeof error === \"object\" && error !== null && \"code\" in error ? error.code : undefined;\n return code === \"EPERM\";\n }\n}\n\nfunction emptyActivity(): LocalghostActivity {\n return { version: LOCALGHOST_ACTIVITY_VERSION, runs: [] };\n}\n\nexport function readLocalghostActivity(path = getLocalghostActivityPath()): LocalghostActivity {\n if (!existsSync(path)) return emptyActivity();\n\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf8\")) as Partial<LocalghostActivity>;\n return {\n version: LOCALGHOST_ACTIVITY_VERSION,\n runs: Array.isArray(parsed.runs) ? parsed.runs : []\n };\n } catch {\n return emptyActivity();\n }\n}\n\nexport function writeLocalghostActivity(activity: LocalghostActivity, path = getLocalghostActivityPath()) {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(activity, null, 2)}\\n`, \"utf8\");\n return path;\n}\n\nfunction createRunId(input: Pick<RegisterLocalghostRunInput, \"mode\" | \"cwd\" | \"projectName\">, pid: number) {\n return `${input.projectName}:${input.mode}:${pid}:${Date.now()}`;\n}\n\nexport function pruneLocalghostActivity(path = getLocalghostActivityPath()) {\n const activity = readLocalghostActivity(path);\n const activeRuns = activity.runs.filter((run) => isProcessRunning(run.pid));\n const pruned = activeRuns.length !== activity.runs.length;\n\n if (pruned) {\n writeLocalghostActivity({ version: LOCALGHOST_ACTIVITY_VERSION, runs: activeRuns }, path);\n }\n\n return {\n path,\n pruned,\n runs: activeRuns\n };\n}\n\nexport function listLocalghostRuns(path = getLocalghostActivityPath()) {\n return pruneLocalghostActivity(path).runs;\n}\n\nexport function registerLocalghostRun(input: RegisterLocalghostRunInput, path = getLocalghostActivityPath()) {\n const now = new Date().toISOString();\n const pid = input.pid ?? process.pid;\n const record: LocalghostRunRecord = {\n id: input.id ?? createRunId(input, pid),\n mode: input.mode,\n pid,\n cwd: input.cwd,\n projectName: input.projectName,\n startedAt: input.startedAt ?? now,\n updatedAt: now,\n ...(input.configPath ? { configPath: input.configPath } : {}),\n ...(input.caddyfilePath ? { caddyfilePath: input.caddyfilePath } : {}),\n ...(input.caddyPid ? { caddyPid: input.caddyPid } : {}),\n ...(input.childPid ? { childPid: input.childPid } : {}),\n ...(input.childCommand ? { childCommand: input.childCommand } : {}),\n ...(typeof input.https === \"boolean\" ? { https: input.https } : {}),\n ...(input.requestedPort ? { requestedPort: input.requestedPort } : {}),\n ...(input.port ? { port: input.port } : {}),\n ...(typeof input.dynamicPort === \"boolean\" ? { dynamicPort: input.dynamicPort } : {}),\n entries: input.entries\n };\n const current = pruneLocalghostActivity(path).runs.filter((run) => run.id !== record.id);\n writeLocalghostActivity({ version: LOCALGHOST_ACTIVITY_VERSION, runs: [...current, record] }, path);\n return record;\n}\n\nexport function unregisterLocalghostRun(id: string, path = getLocalghostActivityPath()) {\n const activity = readLocalghostActivity(path);\n const runs = activity.runs.filter((run) => run.id !== id);\n\n if (runs.length !== activity.runs.length) {\n writeLocalghostActivity({ version: LOCALGHOST_ACTIVITY_VERSION, runs }, path);\n }\n}\n","import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { basename, join, resolve } from \"node:path\";\nimport { parseDevHosts } from \"./parse.js\";\n\nexport const LOCALGHOST_CONFIG_FILE = \".localghost\";\n\nexport type ConfigPattern = string | RegExp;\n\nexport type ReadDevHostsOptions = {\n cwd?: string;\n fileName?: string;\n configFiles?: string[];\n configPattern?: ConfigPattern;\n};\n\nexport type ResolvedDevHostsPath = {\n path: string;\n fileName: string;\n exists: boolean;\n searchedFiles: string[];\n configPattern?: ConfigPattern;\n};\n\nfunction unique(values: string[]) {\n return [...new Set(values.filter(Boolean))];\n}\n\nfunction toRegExp(pattern: ConfigPattern) {\n return typeof pattern === \"string\" ? new RegExp(pattern) : pattern;\n}\n\nfunction findPatternMatches(cwd: string, pattern: ConfigPattern) {\n const matcher = toRegExp(pattern);\n\n return readdirSync(cwd, { withFileTypes: true })\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((name) => {\n matcher.lastIndex = 0;\n return matcher.test(name);\n })\n .sort();\n}\n\nexport function getConfigFileCandidates(options: ReadDevHostsOptions = {}) {\n const cwd = options.cwd ?? process.cwd();\n const exactFiles = unique([\n ...(options.fileName ? [options.fileName] : []),\n ...(options.configFiles ?? [])\n ]);\n const patternFiles = options.configPattern ? findPatternMatches(cwd, options.configPattern) : [];\n const candidates = unique([...exactFiles, ...patternFiles]);\n\n if (candidates.length > 0) return candidates;\n if (exactFiles.length > 0 || options.configPattern) return [];\n return [LOCALGHOST_CONFIG_FILE];\n}\n\nexport function resolveDevHostsPath(options: ReadDevHostsOptions = {}): ResolvedDevHostsPath {\n const cwd = options.cwd ?? process.cwd();\n const searchedFiles = getConfigFileCandidates(options);\n\n for (const fileName of searchedFiles) {\n const path = resolve(cwd, fileName);\n if (existsSync(path)) {\n return {\n path,\n fileName: basename(fileName),\n exists: true,\n searchedFiles,\n ...(options.configPattern ? { configPattern: options.configPattern } : {})\n };\n }\n }\n\n const fileName = searchedFiles[0] ?? LOCALGHOST_CONFIG_FILE;\n\n return {\n path: resolve(cwd, fileName),\n fileName: basename(fileName),\n exists: false,\n searchedFiles,\n ...(options.configPattern ? { configPattern: options.configPattern } : {})\n };\n}\n\nexport function getDevHostsPath(options: ReadDevHostsOptions = {}) {\n return resolveDevHostsPath(options).path;\n}\n\nfunction formatSearchedFiles(files: string[], pattern?: ConfigPattern) {\n if (files.length > 0) return files.map((file) => `\\`${file}\\``).join(\", \");\n if (pattern) return `files matching ${pattern.toString()}`;\n return `\\`${LOCALGHOST_CONFIG_FILE}\\``;\n}\n\nexport function readDevHosts(options: ReadDevHostsOptions | string = {}) {\n const resolvedOptions = typeof options === \"string\" ? { cwd: options } : options;\n const resolvedPath = resolveDevHostsPath(resolvedOptions);\n\n if (!resolvedPath.exists) {\n const cwd = resolvedOptions.cwd ?? process.cwd();\n throw new Error(\n `Missing Localghost config in ${cwd}. Looked for ${formatSearchedFiles(resolvedPath.searchedFiles, resolvedPath.configPattern)}. Run \\`localghost init\\` or pass --config/--config-pattern.`\n );\n }\n\n return parseDevHosts(readFileSync(resolvedPath.path, \"utf8\"), resolvedPath.fileName);\n}\n\nexport function getProjectName(cwd = process.cwd()) {\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as { name?: unknown };\n const name = typeof pkg.name === \"string\" && pkg.name ? pkg.name : \"app\";\n return sanitizeProjectName(name.replace(/^@/, \"\"));\n } catch {\n return \"app\";\n }\n}\n\nexport function sanitizeProjectName(value: string) {\n const projectName = value.replace(/[^\\w.-]+/g, \"-\").replace(/^-+|-+$/g, \"\");\n return projectName || \"app\";\n}\n","export type DevHostEntry = {\n host: string;\n port: number;\n target: string;\n};\n\nconst HOST_PATTERN = /^(?=.{1,253}$)(?!-)[a-z0-9-]+(\\.[a-z0-9-]+)*\\.?$/i;\n\nexport function parseDevHosts(input: string, fileName = \".localghost\"): DevHostEntry[] {\n const entries: DevHostEntry[] = [];\n\n input.split(/\\r?\\n/).forEach((rawLine, index) => {\n const line = rawLine.replace(/#.*/, \"\").trim();\n\n if (!line) {\n return;\n }\n\n const parts = line.split(/\\s+/);\n const host = parts[0];\n const portRaw = parts[1];\n\n if (!host || !portRaw || parts.length > 2) {\n throw new Error(`Invalid ${fileName} line ${index + 1}: \"${rawLine}\"`);\n }\n\n if (!HOST_PATTERN.test(host)) {\n throw new Error(`Invalid host on line ${index + 1}: \"${host}\"`);\n }\n\n const port = Number(portRaw);\n\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(`Invalid port on line ${index + 1}: \"${portRaw}\"`);\n }\n\n entries.push({\n host: host.toLowerCase().replace(/\\.$/, \"\"),\n port,\n target: `127.0.0.1:${port}`\n });\n });\n\n return entries;\n}\n\nexport function findLocalMdnsHosts(entries: DevHostEntry[]): string[] {\n return [...new Set(entries.map((entry) => entry.host).filter((host) => host.endsWith(\".local\")))];\n}\n","import { dirname, join } from \"node:path\";\nimport { execa } from \"execa\";\nimport { writeTextFile } from \"./fs.js\";\nimport type { DevHostEntry } from \"./parse.js\";\n\nexport type CaddyModeOptions = {\n https?: boolean;\n};\n\nfunction groupByPort(entries: DevHostEntry[]) {\n const groups = new Map<number, DevHostEntry[]>();\n\n for (const entry of entries) {\n const group = groups.get(entry.port) ?? [];\n group.push(entry);\n groups.set(entry.port, group);\n }\n\n return groups;\n}\n\nexport function getCaddyfilePath(cwd = process.cwd()) {\n return join(cwd, \"ops/local/Caddyfile\");\n}\n\nexport function renderCaddyfile(entries: DevHostEntry[], options: CaddyModeOptions = {}) {\n const groups = groupByPort(entries);\n const https = options.https === true;\n const blocks = [...groups.entries()]\n .sort(([leftPort], [rightPort]) => leftPort - rightPort)\n .map(([port, group]) => {\n const hosts = group\n .map((entry) => (https ? entry.host : `http://${entry.host}`))\n .sort()\n .join(\", \");\n\n return `${hosts} {\n reverse_proxy 127.0.0.1:${port}\n}`;\n });\n\n const globalOptions = https\n ? `{\n local_certs\n}\n\n`\n : \"\";\n\n return `${globalOptions}${blocks.join(\"\\n\\n\")}\n`;\n}\n\nexport async function writeCaddyfile(entries: DevHostEntry[], cwd = process.cwd(), options: CaddyModeOptions = {}) {\n const path = getCaddyfilePath(cwd);\n writeTextFile(path, renderCaddyfile(entries, options));\n return path;\n}\n\nexport async function validateCaddyfile(path: string) {\n await execa(\"caddy\", [\"validate\", \"--config\", path], {\n cwd: dirname(path),\n stdio: \"inherit\"\n });\n}\n\nexport async function runCaddy(path: string) {\n await execa(\"caddy\", [\"run\", \"--config\", path], {\n cwd: dirname(path),\n stdio: \"inherit\"\n });\n}\n\nexport function startCaddy(path: string) {\n return execa(\"caddy\", [\"run\", \"--config\", path], {\n cwd: dirname(path),\n stdio: \"inherit\"\n });\n}\n\nexport async function trustCaddy(path: string) {\n await execa(\"caddy\", [\"trust\", \"--config\", path], {\n cwd: dirname(path),\n stdio: \"inherit\"\n });\n}\n","import { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nexport function readTextFile(path: string) {\n return readFileSync(path, \"utf8\");\n}\n\nexport function writeTextFile(path: string, value: string) {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, value, \"utf8\");\n return path;\n}\n","import { existsSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport {\n getProjectName,\n readDevHosts,\n resolveDevHostsPath,\n sanitizeProjectName,\n type ConfigPattern,\n type ReadDevHostsOptions\n} from \"./config.js\";\nimport { findAvailablePort } from \"./port.js\";\nimport type { DevHostEntry } from \"./parse.js\";\n\nexport type LocalghostContextOptions = {\n cwd?: string;\n project?: string;\n localghostConfig?: string | false;\n fileName?: string;\n configFiles?: string[];\n configPattern?: ConfigPattern;\n port?: number;\n https?: boolean;\n bindHost?: string | boolean;\n primaryHost?: string;\n dynamicPort?: boolean;\n wwwAlias?: boolean;\n};\n\nexport type LocalghostContext = {\n cwd: string;\n projectName: string;\n readOptions: ReadDevHostsOptions;\n configPath: string;\n configFileName: string;\n configEntries: DevHostEntry[];\n entries: DevHostEntry[];\n hosts: string[];\n requestedPort: number;\n port: number;\n dynamicPort: boolean;\n bindHost: string | boolean;\n primaryHost: string;\n https: boolean;\n wwwAlias: boolean;\n projectConfigPath?: string;\n};\n\nexport type LocalghostProjectConfig = Omit<LocalghostContextOptions, \"cwd\" | \"localghostConfig\">;\n\nconst LOCALGHOST_PROJECT_CONFIG_FILES = [\n \"localghost.config.mjs\",\n \"localghost.config.js\",\n \"localghost.config.cjs\"\n];\n\nfunction parsePort(value: string | undefined) {\n if (!value) return undefined;\n const port = Number.parseInt(value, 10);\n return Number.isInteger(port) && port > 0 && port <= 65535 ? port : undefined;\n}\n\nfunction envPort() {\n return parsePort(process.env.LOCALGHOST_PORT) ?? parsePort(process.env.VITE_PORT);\n}\n\nfunction envDynamicPort() {\n const value = process.env.LOCALGHOST_DYNAMIC_PORT;\n if (!value) return undefined;\n return [\"1\", \"true\", \"yes\", \"on\"].includes(value.toLowerCase());\n}\n\nfunction envHttps() {\n const value = process.env.LOCALGHOST_HTTPS;\n if (!value) return undefined;\n return [\"1\", \"true\", \"yes\", \"on\"].includes(value.toLowerCase());\n}\n\nfunction readOptionsFromContext(options: LocalghostContextOptions): ReadDevHostsOptions {\n return {\n cwd: options.cwd ?? process.cwd(),\n ...(options.fileName ? { fileName: options.fileName } : {}),\n ...(options.configFiles ? { configFiles: options.configFiles } : {}),\n ...(options.configPattern ? { configPattern: options.configPattern } : {})\n };\n}\n\nfunction withRuntimePort(entries: DevHostEntry[], requestedPort: number, port: number) {\n if (requestedPort === port) return entries;\n\n const hasRequestedPort = entries.some((entry) => entry.port === requestedPort);\n if (!hasRequestedPort) return entries;\n\n return entries.map((entry) => (entry.port === requestedPort ? { ...entry, port } : entry));\n}\n\nfunction uniqueHosts(entries: DevHostEntry[]) {\n return [...new Set(entries.map((entry) => entry.host))];\n}\n\nfunction isAliasableHost(host: string) {\n return host.includes(\".\") && !host.startsWith(\"www.\") && !host.includes(\":\");\n}\n\nexport function getDefaultWwwAlias(host: string) {\n return isAliasableHost(host) ? `www.${host}` : null;\n}\n\nexport function addDefaultWwwAliases(entries: DevHostEntry[]) {\n const seen = new Set(entries.map((entry) => entry.host));\n const aliases: DevHostEntry[] = [];\n\n for (const entry of entries) {\n const alias = getDefaultWwwAlias(entry.host);\n if (alias && !seen.has(alias)) {\n aliases.push({ host: alias, port: entry.port, target: `127.0.0.1:${entry.port}` });\n seen.add(alias);\n }\n }\n\n return [...entries, ...aliases];\n}\n\nfunction defined<T extends Record<string, unknown>>(input: T) {\n return Object.fromEntries(Object.entries(input).filter(([, value]) => typeof value !== \"undefined\")) as Partial<T>;\n}\n\nasync function readProjectConfig(cwd: string, configFile: string | false | undefined) {\n if (configFile === false) return {};\n\n const candidates = configFile ? [configFile] : LOCALGHOST_PROJECT_CONFIG_FILES;\n const path = candidates.map((candidate) => resolveDevHostsPath({ cwd, fileName: candidate }).path).find((candidate) => existsSync(candidate));\n if (!path) return {};\n\n const imported = await import(`${pathToFileURL(path).href}?localghost=${Date.now()}`);\n const config = (imported.default ?? imported) as LocalghostProjectConfig;\n\n return { config, path };\n}\n\nexport function defineLocalghostConfig<T extends LocalghostContextOptions>(config: T) {\n return config;\n}\n\nexport async function resolveLocalghostContext(options: LocalghostContextOptions = {}): Promise<LocalghostContext> {\n const cwd = options.cwd ?? process.cwd();\n const projectConfig = await readProjectConfig(cwd, options.localghostConfig);\n const merged = {\n ...projectConfig.config,\n ...defined(options)\n } as LocalghostContextOptions;\n const readOptions = readOptionsFromContext({ ...merged, cwd });\n const resolvedPath = resolveDevHostsPath(readOptions);\n const configEntries = readDevHosts(readOptions);\n const requestedPort = merged.port ?? envPort() ?? configEntries[0]?.port ?? 5173;\n const dynamicPort = merged.dynamicPort ?? envDynamicPort() ?? false;\n const bindHost = merged.bindHost ?? \"127.0.0.1\";\n const probeHost = typeof bindHost === \"string\" ? bindHost : \"127.0.0.1\";\n const port = dynamicPort ? await findAvailablePort(requestedPort, { host: probeHost }) : requestedPort;\n const wwwAlias = merged.wwwAlias ?? true;\n const entries = wwwAlias\n ? addDefaultWwwAliases(withRuntimePort(configEntries, requestedPort, port))\n : withRuntimePort(configEntries, requestedPort, port);\n const hosts = uniqueHosts(entries);\n const primaryHost =\n merged.primaryHost ??\n entries.find((entry) => entry.port === port)?.host ??\n hosts[0] ??\n `${sanitizeProjectName(getProjectName(cwd))}.localhost`;\n\n return {\n cwd,\n projectName: sanitizeProjectName(merged.project ?? getProjectName(cwd)),\n readOptions,\n configPath: resolvedPath.path,\n configFileName: resolvedPath.fileName,\n configEntries,\n entries,\n hosts,\n requestedPort,\n port,\n dynamicPort,\n bindHost,\n primaryHost,\n https: merged.https ?? envHttps() ?? false,\n wwwAlias,\n ...(projectConfig.path ? { projectConfigPath: projectConfig.path } : {})\n };\n}\n","import { createServer } from \"node:net\";\n\nexport type FindAvailablePortOptions = {\n host?: string;\n maxAttempts?: number;\n};\n\nexport async function isPortAvailable(port: number, host = \"127.0.0.1\") {\n return new Promise<boolean>((resolve) => {\n const server = createServer();\n\n server.once(\"error\", () => {\n resolve(false);\n });\n\n server.once(\"listening\", () => {\n server.close(() => resolve(true));\n });\n\n server.listen(port, host);\n });\n}\n\nexport async function findAvailablePort(startPort: number, options: FindAvailablePortOptions = {}) {\n const host = options.host ?? \"127.0.0.1\";\n const maxAttempts = options.maxAttempts ?? 50;\n\n for (let offset = 0; offset < maxAttempts; offset += 1) {\n const port = startPort + offset;\n if (await isPortAvailable(port, host)) {\n return port;\n }\n }\n\n throw new Error(`No available port found from ${startPort} to ${startPort + maxAttempts - 1}.`);\n}\n","import { execa } from \"execa\";\n\nexport type DoctorResult = {\n ok: boolean;\n caddy: {\n found: boolean;\n version?: string;\n installHint: string;\n };\n};\n\nexport async function checkCaddy(): Promise<DoctorResult[\"caddy\"]> {\n try {\n const result = await execa(\"caddy\", [\"version\"], { reject: false });\n const version = [result.stdout, result.stderr].filter(Boolean).join(\"\\n\").trim();\n\n return {\n found: result.exitCode === 0,\n ...(version ? { version } : {}),\n installHint: \"brew install caddy\"\n };\n } catch {\n return {\n found: false,\n installHint: \"brew install caddy\"\n };\n }\n}\n\nexport async function runDoctor(): Promise<DoctorResult> {\n const caddy = await checkCaddy();\n return {\n ok: caddy.found,\n caddy\n };\n}\n","export type LocalghostEnvironment = NodeJS.ProcessEnv;\n\nconst PRODUCTION_ENV_KEYS = [\"NODE_ENV\", \"VERCEL_ENV\", \"NETLIFY\", \"CF_PAGES_BRANCH\", \"LOCALGHOST_ENV\"] as const;\n\nexport function getProductionReason(env: LocalghostEnvironment = process.env) {\n if (env.LOCALGHOST_ENV === \"production\") return \"LOCALGHOST_ENV=production\";\n if (env.NODE_ENV === \"production\") return \"NODE_ENV=production\";\n if (env.VERCEL_ENV === \"production\") return \"VERCEL_ENV=production\";\n if (env.NETLIFY === \"true\" && env.CONTEXT === \"production\") return \"NETLIFY=true and CONTEXT=production\";\n if (env.CF_PAGES_BRANCH && env.CF_PAGES_BRANCH === env.CF_PAGES_PRODUCTION_BRANCH) {\n return \"CF_PAGES_BRANCH matches CF_PAGES_PRODUCTION_BRANCH\";\n }\n\n return null;\n}\n\nexport function isProductionLike(env: LocalghostEnvironment = process.env) {\n return getProductionReason(env) !== null;\n}\n\nexport function assertLocalDevelopment(command: string, env: LocalghostEnvironment = process.env) {\n const reason = getProductionReason(env);\n if (!reason) return;\n\n throw new Error(`Localghost only runs in local development. Refusing \\`${command}\\` because ${reason}.`);\n}\n\nexport function getProductionEnvKeys() {\n return PRODUCTION_ENV_KEYS;\n}\n","import { writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { execa } from \"execa\";\nimport { sanitizeProjectName } from \"./config.js\";\nimport { readTextFile } from \"./fs.js\";\nimport type { DevHostEntry } from \"./parse.js\";\n\nexport type UpdateSystemHostsResult = {\n changed: boolean;\n hostsPath: string;\n tempPath?: string;\n};\n\nexport type RemoveSystemHostsResult = UpdateSystemHostsResult & {\n removed: boolean;\n};\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction getManagedBlockPattern(projectName: string) {\n const sanitizedProjectName = sanitizeProjectName(projectName);\n const start = `# localghost:start ${sanitizedProjectName}`;\n const end = `# localghost:end ${sanitizedProjectName}`;\n return new RegExp(`${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}\\\\n?`, \"m\");\n}\n\nexport function getSystemHostsPath() {\n return process.platform === \"win32\" ? \"C:\\\\Windows\\\\System32\\\\drivers\\\\etc\\\\hosts\" : \"/etc/hosts\";\n}\n\nexport function renderHostsBlock(projectName: string, entries: DevHostEntry[]) {\n const sanitizedProjectName = sanitizeProjectName(projectName);\n const hosts = [...new Set(entries.map((entry) => entry.host))].sort();\n\n return [\n `# localghost:start ${sanitizedProjectName}`,\n ...hosts.map((host) => `127.0.0.1 ${host}`),\n `# localghost:end ${sanitizedProjectName}`,\n \"\"\n ].join(\"\\n\");\n}\n\nexport function upsertManagedBlock(existing: string, projectName: string, block: string) {\n const pattern = getManagedBlockPattern(projectName);\n\n if (pattern.test(existing)) {\n return existing.replace(pattern, block);\n }\n\n return `${existing.trimEnd()}\\n\\n${block}`;\n}\n\nexport function removeManagedBlock(existing: string, projectName: string) {\n const pattern = getManagedBlockPattern(projectName);\n\n if (!pattern.test(existing)) {\n return existing;\n }\n\n return existing.replace(pattern, \"\").replace(/\\n{3,}/g, \"\\n\\n\").trimEnd() + \"\\n\";\n}\n\nasync function writeSystemHostsFile(hostsPath: string, next: string, projectName: string) {\n const sanitizedProjectName = sanitizeProjectName(projectName);\n const tempPath = join(tmpdir(), `localghost-${sanitizedProjectName}-hosts`);\n writeFileSync(tempPath, next, \"utf8\");\n\n if (process.platform === \"win32\") {\n throw new Error(`Windows support: run as administrator and copy ${tempPath} to ${hostsPath}.`);\n }\n\n await execa(\"sudo\", [\"cp\", tempPath, hostsPath], { stdio: \"inherit\" });\n\n return tempPath;\n}\n\nexport async function updateSystemHosts(projectName: string, entries: DevHostEntry[]): Promise<UpdateSystemHostsResult> {\n const sanitizedProjectName = sanitizeProjectName(projectName);\n const hostsPath = getSystemHostsPath();\n const existing = readTextFile(hostsPath);\n const block = renderHostsBlock(sanitizedProjectName, entries);\n const next = upsertManagedBlock(existing, sanitizedProjectName, block);\n\n if (next === existing) {\n return { changed: false, hostsPath };\n }\n\n const tempPath = await writeSystemHostsFile(hostsPath, next, sanitizedProjectName);\n\n return { changed: true, hostsPath, tempPath };\n}\n\nexport async function removeSystemHosts(projectName: string): Promise<RemoveSystemHostsResult> {\n const sanitizedProjectName = sanitizeProjectName(projectName);\n const hostsPath = getSystemHostsPath();\n const existing = readTextFile(hostsPath);\n const next = removeManagedBlock(existing, sanitizedProjectName);\n\n if (next === existing) {\n return { changed: false, removed: false, hostsPath };\n }\n\n const tempPath = await writeSystemHostsFile(hostsPath, next, sanitizedProjectName);\n\n return { changed: true, removed: true, hostsPath, tempPath };\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getProjectName, LOCALGHOST_CONFIG_FILE, sanitizeProjectName } from \"./config.js\";\nimport { writeTextFile } from \"./fs.js\";\n\nexport type PackageManager = \"npm\" | \"yarn\" | \"pnpm\";\n\nexport type InitOptions = {\n cwd?: string;\n host?: string;\n port?: number;\n apiHost?: string;\n apiPort?: number;\n force?: boolean;\n packageManager?: PackageManager;\n writeScripts?: boolean;\n configFile?: string;\n};\n\nexport type InitResult = {\n configPath: string;\n configCreated: boolean;\n packageJsonPath?: string;\n packageJsonChanged: boolean;\n packageManager: PackageManager;\n nextSteps: string[];\n};\n\nexport function detectPackageManager(cwd = process.cwd()): PackageManager {\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\nexport function packageRunCommand(packageManager: PackageManager, script: string): string {\n if (packageManager === \"yarn\") return `yarn ${script}`;\n if (packageManager === \"pnpm\") return `pnpm ${script}`;\n return `npm run ${script}`;\n}\n\nexport function packageAddCommand(packageManager: PackageManager, packageName = \"@hamedb89/localghost\"): string {\n if (packageManager === \"yarn\") return `yarn add -D ${packageName}`;\n if (packageManager === \"pnpm\") return `pnpm add -D ${packageName}`;\n return `npm install -D ${packageName}`;\n}\n\nfunction renderConfig(options: Required<Pick<InitOptions, \"host\" | \"port\" | \"apiHost\" | \"apiPort\">>) {\n return [\n \"# Buh. Friendly names for local services.\",\n \"# Format: <host> <port>\",\n `${options.host} ${options.port}`,\n `www.${options.host} ${options.port}`,\n `${options.apiHost} ${options.apiPort}`,\n \"\"\n ].join(\"\\n\");\n}\n\nfunction readPackageJson(path: string): Record<string, unknown> | null {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction shellQuote(value: string) {\n if (/^[A-Za-z0-9_./:-]+$/.test(value)) return value;\n return `'${value.replace(/'/g, `'\"'\"'`)}'`;\n}\n\nfunction getConfigFlag(configFile: string) {\n return configFile === LOCALGHOST_CONFIG_FILE ? \"\" : ` --config ${shellQuote(configFile)}`;\n}\n\nfunction updatePackageScripts(packageJsonPath: string, configFile: string): boolean {\n const pkg = readPackageJson(packageJsonPath);\n if (!pkg) return false;\n\n const scripts = typeof pkg.scripts === \"object\" && pkg.scripts ? (pkg.scripts as Record<string, unknown>) : {};\n const configFlag = getConfigFlag(configFile);\n const nextScripts = {\n ...scripts,\n \"localghost:setup\": scripts[\"localghost:setup\"] ?? `localghost setup${configFlag}`,\n \"localghost:proxy\": scripts[\"localghost:proxy\"] ?? `localghost dev${configFlag}`,\n \"localghost:proxy:https\": scripts[\"localghost:proxy:https\"] ?? `localghost dev${configFlag} --https`,\n \"localghost:run\": scripts[\"localghost:run\"] ?? `localghost run${configFlag} --`,\n \"localghost:ready\": scripts[\"localghost:ready\"] ?? `localghost status${configFlag} --ready`,\n \"localghost:trust\": scripts[\"localghost:trust\"] ?? `localghost trust${configFlag}`,\n \"localghost:ps\": scripts[\"localghost:ps\"] ?? \"localghost ps\",\n \"localghost:print\": scripts[\"localghost:print\"] ?? `localghost print${configFlag}`,\n \"localghost:routes\": scripts[\"localghost:routes\"] ?? `localghost routes${configFlag}`,\n \"localghost:status\": scripts[\"localghost:status\"] ?? \"localghost status\",\n \"localghost:reset\": scripts[\"localghost:reset\"] ?? \"localghost reset\",\n \"localghost:teardown\": scripts[\"localghost:teardown\"] ?? \"localghost teardown\",\n \"localghost:doctor\": scripts[\"localghost:doctor\"] ?? \"localghost doctor\",\n \"localghost:update\": scripts[\"localghost:update\"] ?? \"localghost update\",\n \"caddy:setup\": scripts[\"caddy:setup\"] ?? `localghost setup${configFlag}`,\n \"caddy:dev\": scripts[\"caddy:dev\"] ?? `localghost dev${configFlag}`\n };\n\n const changed = JSON.stringify(scripts) !== JSON.stringify(nextScripts);\n if (!changed) return false;\n\n pkg.scripts = nextScripts;\n writeFileSync(packageJsonPath, `${JSON.stringify(pkg, null, 2)}\\n`, \"utf8\");\n return true;\n}\n\nexport function initLocalghost(options: InitOptions = {}): InitResult {\n const cwd = options.cwd ?? process.cwd();\n const projectName = sanitizeProjectName(getProjectName(cwd).split(\"/\").pop() ?? \"app\");\n const host = options.host ?? `${projectName}.localhost`;\n const port = options.port ?? 5173;\n const apiHost = options.apiHost ?? `api.${host}`;\n const apiPort = options.apiPort ?? 8787;\n const packageManager = options.packageManager ?? detectPackageManager(cwd);\n const configFile = options.configFile ?? LOCALGHOST_CONFIG_FILE;\n const configPath = join(cwd, configFile);\n const configExists = existsSync(configPath);\n\n if (configExists && !options.force) {\n return {\n configPath,\n configCreated: false,\n packageJsonChanged: false,\n packageManager,\n nextSteps: [\n packageRunCommand(packageManager, \"localghost:doctor\"),\n packageRunCommand(packageManager, \"localghost:setup\"),\n packageRunCommand(packageManager, \"localghost:ready\"),\n packageRunCommand(packageManager, \"localghost:proxy\")\n ]\n };\n }\n\n writeTextFile(configPath, renderConfig({ host, port, apiHost, apiPort }));\n\n const packageJsonPath = join(cwd, \"package.json\");\n const packageJsonChanged = options.writeScripts ? updatePackageScripts(packageJsonPath, configFile) : false;\n\n return {\n configPath,\n configCreated: true,\n ...(existsSync(packageJsonPath) ? { packageJsonPath } : {}),\n packageJsonChanged,\n packageManager,\n nextSteps: [\n packageRunCommand(packageManager, \"localghost:doctor\"),\n packageRunCommand(packageManager, \"localghost:setup\"),\n packageRunCommand(packageManager, \"localghost:ready\"),\n packageRunCommand(packageManager, \"localghost:proxy\")\n ]\n };\n}\n","import { stdin as input, stdout as output } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\n\nexport function canPrompt() {\n return Boolean(input.isTTY && output.isTTY);\n}\n\nexport async function withPrompt<T>(run: (prompt: (question: string) => Promise<string>) => Promise<T>) {\n const rl = createInterface({ input, output });\n try {\n return await run((question) => rl.question(question));\n } finally {\n rl.close();\n }\n}\n\nexport async function confirm(question: string, defaultValue = true) {\n return withPrompt(async (prompt) => {\n const suffix = defaultValue ? \" [Y/n] \" : \" [y/N] \";\n const answer = (await prompt(`${question}${suffix}`)).trim().toLowerCase();\n if (!answer) return defaultValue;\n return answer === \"y\" || answer === \"yes\";\n });\n}\n\nexport async function ask(question: string, defaultValue?: string) {\n return withPrompt(async (prompt) => {\n const suffix = defaultValue ? ` (${defaultValue}) ` : \" \";\n const answer = (await prompt(`${question}${suffix}`)).trim();\n return answer || defaultValue || \"\";\n });\n}\n","import type { DevHostEntry } from \"./parse.js\";\n\nexport type DomainRoute = {\n host: string;\n port: number;\n url: string;\n upstream: string;\n};\n\nexport type DomainRouteOptions = {\n https?: boolean;\n};\n\nexport function getDomainRoutes(entries: DevHostEntry[], options: DomainRouteOptions = {}): DomainRoute[] {\n const protocol = options.https === true ? \"https\" : \"http\";\n\n return [...entries]\n .sort((left, right) => left.host.localeCompare(right.host) || left.port - right.port)\n .map((entry) => ({\n host: entry.host,\n port: entry.port,\n url: `${protocol}://${entry.host}/`,\n upstream: `http://${entry.target}`\n }));\n}\n\nexport function formatDomainRoutes(entries: DevHostEntry[], options: DomainRouteOptions = {}) {\n const routes = getDomainRoutes(entries, options);\n\n if (routes.length === 0) {\n return \"localghost routes\\n no routes\";\n }\n\n return [\n \"localghost routes\",\n ...routes.map((route) => ` ${route.url} -> ${route.upstream}`)\n ].join(\"\\n\");\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { readTextFile, writeTextFile } from \"./fs.js\";\nimport type { DevHostEntry } from \"./parse.js\";\n\nexport const LOCALGHOST_STATE_FILE = \"ops/local/localghost-state.json\";\n\nexport type LocalghostStateAction = \"setup\" | \"teardown\";\n\nexport type LocalghostState = {\n version: 1;\n action: LocalghostStateAction;\n updatedAt: string;\n projectName: string;\n cwd: string;\n configPath?: string;\n hostsPath?: string;\n hostsChanged?: boolean;\n hostsTempPath?: string;\n caddyfilePath?: string;\n caddyfileRemoved?: boolean;\n caddyHttps?: boolean;\n caddyTrustedAt?: string;\n caddyTrustPromptedAt?: string;\n entries?: DevHostEntry[];\n};\n\nexport type WriteLocalghostStateInput = Omit<LocalghostState, \"version\" | \"updatedAt\">;\n\nexport function getLocalghostStatePath(cwd = process.cwd()) {\n return join(cwd, LOCALGHOST_STATE_FILE);\n}\n\nexport function readLocalghostState(cwd = process.cwd()): LocalghostState | null {\n const path = getLocalghostStatePath(cwd);\n if (!existsSync(path)) return null;\n return JSON.parse(readTextFile(path)) as LocalghostState;\n}\n\nexport function writeLocalghostState(cwd: string, state: WriteLocalghostStateInput) {\n const path = getLocalghostStatePath(cwd);\n writeTextFile(path, `${JSON.stringify({ ...state, version: 1, updatedAt: new Date().toISOString() }, null, 2)}\\n`);\n return path;\n}\n\nexport function patchLocalghostState(cwd: string, patch: Partial<WriteLocalghostStateInput>) {\n const current = readLocalghostState(cwd);\n if (!current) return null;\n return writeLocalghostState(cwd, { ...(current as unknown as WriteLocalghostStateInput), ...patch });\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport const LOCALGHOST_PACKAGE_NAME = \"@hamedb89/localghost\";\nexport const LOCALGHOST_VERSION = \"0.1.8\";\nexport const UPDATE_CHECK_CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nexport const UPDATE_CHECK_NOTIFY_TTL_MS = 24 * 60 * 60 * 1000;\nexport const UPDATE_CHECK_TIMEOUT_MS = 900;\n\nexport type UpdateCheckCache = {\n checkedAt: string;\n latestVersion?: string;\n notifiedVersion?: string;\n notifiedAt?: string;\n};\n\nexport type UpdateCheckResult = {\n currentVersion: string;\n packageName: string;\n latestVersion?: string;\n updateAvailable: boolean;\n source: \"cache\" | \"registry\" | \"disabled\" | \"error\";\n error?: string;\n};\n\ntype RegistryPackageResponse = {\n \"dist-tags\"?: {\n latest?: unknown;\n };\n};\n\nfunction truthyEnv(value: string | undefined) {\n return value === \"1\" || value === \"true\" || value === \"yes\";\n}\n\nexport function isUpdateCheckDisabled(env: NodeJS.ProcessEnv = process.env) {\n return truthyEnv(env.LOCALGHOST_NO_UPDATE_CHECK);\n}\n\nexport function getUpdateCheckCachePath(env: NodeJS.ProcessEnv = process.env) {\n if (env.LOCALGHOST_UPDATE_CHECK_CACHE) return env.LOCALGHOST_UPDATE_CHECK_CACHE;\n\n const cacheRoot = env.XDG_CACHE_HOME || join(homedir(), \".cache\");\n return join(cacheRoot, \"localghost\", \"update-check.json\");\n}\n\nfunction readCache(path = getUpdateCheckCachePath()): UpdateCheckCache | null {\n if (!existsSync(path)) return null;\n\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as UpdateCheckCache;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(cache: UpdateCheckCache, path = getUpdateCheckCachePath()) {\n try {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(cache, null, 2)}\\n`, \"utf8\");\n } catch {\n // Update checks should never make the real command fail.\n }\n}\n\nfunction ageMs(date: string | undefined, now = Date.now()) {\n if (!date) return Number.POSITIVE_INFINITY;\n const time = Date.parse(date);\n return Number.isFinite(time) ? now - time : Number.POSITIVE_INFINITY;\n}\n\nfunction isCacheFresh(cache: UpdateCheckCache | null, ttlMs: number, now = Date.now()) {\n return Boolean(cache?.latestVersion && ageMs(cache.checkedAt, now) >= 0 && ageMs(cache.checkedAt, now) < ttlMs);\n}\n\ntype ParsedVersion = {\n major: number;\n minor: number;\n patch: number;\n prerelease?: string;\n};\n\nfunction parseVersion(version: string): ParsedVersion | null {\n const match = version.trim().replace(/^v/, \"\").match(/^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?$/);\n if (!match) return null;\n\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n ...(match[4] ? { prerelease: match[4] } : {})\n };\n}\n\nexport function compareVersions(a: string, b: string) {\n const left = parseVersion(a);\n const right = parseVersion(b);\n\n if (!left || !right) return a.localeCompare(b);\n\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (left[key] !== right[key]) return left[key] > right[key] ? 1 : -1;\n }\n\n if (left.prerelease === right.prerelease) return 0;\n if (!left.prerelease) return 1;\n if (!right.prerelease) return -1;\n return left.prerelease.localeCompare(right.prerelease);\n}\n\nexport function isNewerVersion(candidate: string | undefined, current = LOCALGHOST_VERSION) {\n return Boolean(candidate && compareVersions(candidate, current) > 0);\n}\n\nasync function fetchLatestVersion(packageName: string, timeoutMs: number) {\n const encodedName = packageName.startsWith(\"@\") ? `@${packageName.slice(1).replace(\"/\", \"%2f\")}` : packageName;\n const response = await fetch(`https://registry.npmjs.org/${encodedName}`, {\n signal: AbortSignal.timeout(timeoutMs),\n headers: {\n accept: \"application/vnd.npm.install-v1+json\"\n }\n });\n\n if (!response.ok) throw new Error(`npm registry returned ${response.status}`);\n\n const data = (await response.json()) as RegistryPackageResponse;\n const latest = data[\"dist-tags\"]?.latest;\n if (typeof latest !== \"string\" || latest.length === 0) throw new Error(\"npm registry response did not include latest dist-tag\");\n\n return latest;\n}\n\nexport async function checkForUpdate(options: {\n force?: boolean;\n packageName?: string;\n currentVersion?: string;\n timeoutMs?: number;\n cachePath?: string;\n env?: NodeJS.ProcessEnv;\n} = {}): Promise<UpdateCheckResult> {\n const env = options.env ?? process.env;\n const packageName = options.packageName ?? LOCALGHOST_PACKAGE_NAME;\n const currentVersion = options.currentVersion ?? LOCALGHOST_VERSION;\n const cachePath = options.cachePath ?? getUpdateCheckCachePath(env);\n\n if (!options.force && isUpdateCheckDisabled(env)) {\n return {\n currentVersion,\n packageName,\n updateAvailable: false,\n source: \"disabled\"\n };\n }\n\n const cache = readCache(cachePath);\n if (!options.force && isCacheFresh(cache, UPDATE_CHECK_CACHE_TTL_MS)) {\n const latestVersion = cache?.latestVersion;\n return {\n currentVersion,\n packageName,\n ...(latestVersion ? { latestVersion } : {}),\n updateAvailable: isNewerVersion(latestVersion, currentVersion),\n source: \"cache\"\n };\n }\n\n try {\n const latestVersion = await fetchLatestVersion(packageName, options.timeoutMs ?? UPDATE_CHECK_TIMEOUT_MS);\n writeCache({ checkedAt: new Date().toISOString(), latestVersion }, cachePath);\n\n return {\n currentVersion,\n packageName,\n latestVersion,\n updateAvailable: isNewerVersion(latestVersion, currentVersion),\n source: \"registry\"\n };\n } catch (error) {\n const latestVersion = cache?.latestVersion;\n return {\n currentVersion,\n packageName,\n ...(latestVersion ? { latestVersion } : {}),\n updateAvailable: isNewerVersion(latestVersion, currentVersion),\n source: \"error\",\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nexport function formatUpdateMessage(result: UpdateCheckResult) {\n if (!result.updateAvailable || !result.latestVersion) return null;\n\n return [\n `localghost ${result.latestVersion} is available. Current: ${result.currentVersion}`,\n `Update with: npm i -g ${result.packageName}@latest`\n ].join(\"\\n\");\n}\n\nexport function shouldNotifyAboutUpdate(result: UpdateCheckResult, cachePath = getUpdateCheckCachePath(), now = Date.now()) {\n if (!result.updateAvailable || !result.latestVersion) return false;\n\n const cache = readCache(cachePath);\n if (cache?.notifiedVersion !== result.latestVersion) return true;\n\n return ageMs(cache.notifiedAt, now) >= UPDATE_CHECK_NOTIFY_TTL_MS;\n}\n\nexport function markUpdateNotified(result: UpdateCheckResult, cachePath = getUpdateCheckCachePath()) {\n if (!result.latestVersion) return;\n\n const cache = readCache(cachePath) ?? { checkedAt: new Date().toISOString() };\n writeCache(\n {\n ...cache,\n latestVersion: result.latestVersion,\n notifiedVersion: result.latestVersion,\n notifiedAt: new Date().toISOString()\n },\n cachePath\n );\n}\n\nexport async function maybeNotifyAboutUpdate(options: { disabled?: boolean } = {}) {\n if (options.disabled) return;\n\n const cachePath = getUpdateCheckCachePath();\n const result = await checkForUpdate({ cachePath });\n if (!shouldNotifyAboutUpdate(result, cachePath)) return;\n\n const message = formatUpdateMessage(result);\n if (!message) return;\n\n console.warn(`\\n${message}`);\n markUpdateNotified(result, cachePath);\n}\n"],"mappings":"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","names":["existsSync","readFileSync","input","existsSync","readFileSync","join","input","fileName","existsSync","readFileSync","join","dirname","join","mkdirSync","readFileSync","writeFileSync","dirname","join","dirname","dirname","existsSync","resolve","input","existsSync","execa","writeFileSync","join","execa","join","writeFileSync","execa","existsSync","readFileSync","writeFileSync","join","existsSync","join","readFileSync","writeFileSync","join","existsSync","existsSync","join","join","existsSync","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","execa","parsePort","readFileSync","existsSync","resolve"]}
|