2025-09-05 14:59:21 +08:00

67 lines
1.9 KiB
JavaScript

import nodeCrypto from 'node:crypto';
import { defineCommand } from 'citty';
import { consola } from 'consola';
import { getArgs, parseArgs } from 'listhen/cli';
import { createNitro, createDevServer, prepare, build } from 'nitropack/core';
import { resolve } from 'pathe';
import { c as commonArgs } from './common.mjs';
const hmrKeyRe = /^runtimeConfig\.|routeRules\./;
if (!globalThis.crypto) {
globalThis.crypto = nodeCrypto;
}
const dev = defineCommand({
meta: {
name: "dev",
description: "Start the development server"
},
args: {
...commonArgs,
...getArgs()
},
async run({ args }) {
const rootDir = resolve(args.dir || args._dir || ".");
let nitro;
const reload = async () => {
if (nitro) {
consola.info("Restarting dev server...");
if ("unwatch" in nitro.options._c12) {
await nitro.options._c12.unwatch();
}
await nitro.close();
}
nitro = await createNitro(
{
rootDir,
dev: true,
_cli: { command: "dev" }
},
{
watch: true,
c12: {
async onUpdate({ getDiff, newConfig }) {
const diff = getDiff();
if (diff.length === 0) {
return;
}
consola.info(
"Nitro config updated:\n" + diff.map((entry) => ` ${entry.toString()}`).join("\n")
);
await (diff.every((e) => hmrKeyRe.test(e.key)) ? nitro.updateConfig(newConfig.config || {}) : reload());
}
}
}
);
nitro.hooks.hookOnce("restart", reload);
const server = createDevServer(nitro);
const listhenOptions = parseArgs(args);
await server.listen(listhenOptions.port || 3e3, listhenOptions);
await prepare(nitro);
await build(nitro);
};
await reload();
}
});
export { dev as default };