fix(cli): let cordis.yml own the web host/port default (single source)

The merge's "always pass adapter-resolved host/port to AppCLIEntry" made the
adapter's 127.0.0.1/3080 shadow apps/cli/cordis.yml's webserver row — editing
the yml port would have had no effect, a duplicated default.

The adapter now assigns no host/port default: an absent --host/--port leaves the
field undefined (WebInvocation.host?/port?), runWeb forwards each to AppCLIEntry
only when present, and AppCLIEntry patches the webserver row only for an
explicit flag. cordis.yml is the single source of the host/port default; the
adapter still validates a flag when given. Removes the now-unused
DEFAULT_WEB_PORT; LOOPBACK_HOST/ALL_INTERFACES_HOST stay as the allowed-value
vocabulary (validation + the printed URL/LAN line).
This commit is contained in:
Turtle
2026-07-25 15:03:17 +08:00
parent 2dfd8635e8
commit 91d86f9b21
6 changed files with 48 additions and 27 deletions
+12 -6
View File
@@ -13,13 +13,19 @@ import { ALL_INTERFACES_HOST, LOOPBACK_HOST } from './args.ts'
const CONFIG_PATH = fileURLToPath(new URL('../cordis.yml', import.meta.url))
/**
* Serve the browser UI from the shipped config tree.
* @param hostAddress - the bind host: {@link LOOPBACK_HOST} or {@link ALL_INTERFACES_HOST}.
* @param port - the listen port; `0` lets the OS choose a free port.
* Serve the browser UI from the shipped config tree. `host`/`port` are passed
* through only when the flag was given; absent, the `cordis.yml` value stands.
* @param host - the bind host ({@link LOOPBACK_HOST}/{@link ALL_INTERFACES_HOST}), or `undefined` to keep the config default.
* @param port - the listen port (`0` requests an OS-assigned port), or `undefined` to keep the config default.
* @param dev - mount the client HMR driver and watch plugin bundles for rebuilds.
*/
export async function runWeb(hostAddress: string, port: number, dev: boolean): Promise<void> {
const entry = new AppCLIEntry({ configPath: CONFIG_PATH, dev, host: hostAddress, port })
export async function runWeb(host: string | undefined, port: number | undefined, dev: boolean): Promise<void> {
const entry = new AppCLIEntry({
configPath: CONFIG_PATH,
dev,
...host !== undefined && { host },
...port !== undefined && { port },
})
const { ctx, port: boundPort } = await entry.run()
let exiting = false
@@ -29,7 +35,7 @@ export async function runWeb(hostAddress: string, port: number, dev: boolean): P
void Promise.resolve(ctx.fiber.dispose()).finally(() => { process.exit(code) })
}
const lanCandidate = hostAddress === ALL_INTERFACES_HOST
const lanCandidate = host === ALL_INTERFACES_HOST
? Object.values(networkInterfaces()).flat()
.find(iface => iface !== undefined && iface.family === 'IPv4' && !iface.internal)
: undefined