Skip to content

Commit 0eb80ca

Browse files
feat: inital grimoire cli
1 parent a586cfa commit 0eb80ca

3 files changed

Lines changed: 98 additions & 0 deletions

File tree

grimoire/src/cli/commands/dev.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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+
})

grimoire/src/cli/common.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import type { ArgsDef } from 'citty'
2+
3+
export const commonArgs = <ArgsDef>{
4+
dir: {
5+
type: 'string',
6+
description: 'project root directory',
7+
},
8+
_dir: {
9+
type: 'positional',
10+
default: '.',
11+
description: 'project root directory (prefer using `--dir`)',
12+
},
13+
}

grimoire/src/cli/index.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/usr/bin/env node
2+
import { defineCommand, runMain } from 'citty'
3+
import { version as nitroVersion } from 'nitro/meta'
4+
5+
const main = defineCommand({
6+
meta: {
7+
name: 'nitro',
8+
description: 'Nitro CLI',
9+
version: nitroVersion,
10+
},
11+
subCommands: {
12+
dev: () => import('./commands/dev').then(r => r.default),
13+
},
14+
})
15+
16+
runMain(main)

0 commit comments

Comments
 (0)