|
| 1 | +import { defineCommand } from 'citty' |
| 2 | +import { consola } from 'consola' |
| 3 | +import { getArgs, parseArgs } from 'listhen/cli' |
| 4 | +import { build, createDevServer, createNitro, prepare } from 'nitro/core' |
| 5 | +import type { Nitro } from 'nitro/types' |
| 6 | +import { resolve } from 'pathe' |
| 7 | +import { commonArgs } from '../common' |
| 8 | + |
| 9 | +const hmrKeyRe = /^runtimeConfig\.|routeRules\./ |
| 10 | + |
| 11 | +export default defineCommand({ |
| 12 | + meta: { |
| 13 | + name: 'dev', |
| 14 | + description: 'Start the development server', |
| 15 | + }, |
| 16 | + args: { |
| 17 | + ...commonArgs, |
| 18 | + ...getArgs(), |
| 19 | + }, |
| 20 | + async run({ args }) { |
| 21 | + const rootDir = resolve((args['dir'] || args['dir'] || '.') as string) |
| 22 | + let nitro: Nitro |
| 23 | + const reload = async () => { |
| 24 | + if (nitro) { |
| 25 | + consola.info('Restarting dev server...') |
| 26 | + if ('unwatch' in nitro.options._c12) { |
| 27 | + await nitro.options._c12.unwatch() |
| 28 | + } |
| 29 | + await nitro.close() |
| 30 | + } |
| 31 | + nitro = await createNitro( |
| 32 | + { |
| 33 | + rootDir, |
| 34 | + dev: true, |
| 35 | + preset: 'nitro-dev', |
| 36 | + _cli: { command: 'dev' }, |
| 37 | + }, |
| 38 | + { |
| 39 | + watch: true, |
| 40 | + c12: { |
| 41 | + async onUpdate({ getDiff, newConfig }) { |
| 42 | + const diff = getDiff() |
| 43 | + |
| 44 | + if (diff.length === 0) { |
| 45 | + return // No changes |
| 46 | + } |
| 47 | + |
| 48 | + consola.info( |
| 49 | + 'Nitro config updated:\n' + |
| 50 | + diff.map(entry => ` ${entry.toString()}`).join('\n') |
| 51 | + ) |
| 52 | + |
| 53 | + await (diff.every(e => hmrKeyRe.test(e.key)) |
| 54 | + ? nitro.updateConfig(newConfig.config || {}) // Hot reload |
| 55 | + : reload()) // Full reload |
| 56 | + }, |
| 57 | + }, |
| 58 | + } |
| 59 | + ) |
| 60 | + nitro.hooks.hookOnce('restart', reload) |
| 61 | + const server = createDevServer(nitro) |
| 62 | + const listhenOptions = parseArgs(args) |
| 63 | + await server.listen(listhenOptions.port || 3000, listhenOptions) |
| 64 | + await prepare(nitro) |
| 65 | + await build(nitro) |
| 66 | + } |
| 67 | + await reload() |
| 68 | + }, |
| 69 | +}) |
0 commit comments