Files
docudjeex/cli/cli.ts
2025-07-19 13:59:44 +00:00

96 lines
2.3 KiB
TypeScript

import { resolve } from 'node:path'
import { defineCommand, runMain } from 'citty'
import type { ArgsDef } from 'citty'
import { getNuxtConfig } from './setup'
import type { CLIOptions } from './types'
export function createCLI(opts: CLIOptions) {
const sharedArgs: ArgsDef = {
dir: {
type: 'positional',
description: 'Docs directory',
required: true,
default: '.',
},
}
const init = defineCommand({
meta: {
name: 'init',
description: 'Initialize a fresh Docus project',
},
args: { ...sharedArgs },
async setup({ args }) {
const dir = resolve(args.dir as string)
const { runCommand } = await import('nuxi')
await runCommand('init', [dir, '-t', 'gh:nuxtlabs/docus/.starter', dir])
},
})
const dev = defineCommand({
meta: {
name: 'dev',
description: 'Start docs in development mode',
},
args: { ...sharedArgs },
async setup({ args }) {
const dir = resolve(args.dir as string)
const nuxtConfig = await getNuxtConfig(dir, {
...opts.setup,
dev: true,
})
const { runCommand } = await import('nuxi')
await runCommand('dev', [dir, '--no-fork', '--port', process.env.PORT || '4000'], { overrides: nuxtConfig })
},
})
const prepare = defineCommand({
meta: {
name: 'prepare',
description: 'Prepare docs for development or production',
},
args: { ...sharedArgs },
async setup({ args }) {
const dir = resolve(args.dir as string)
const nuxtConfig = await getNuxtConfig(dir, opts.setup)
const { runCommand } = await import('nuxi')
await runCommand('prepare', [dir], { overrides: nuxtConfig })
},
})
const build = defineCommand({
meta: {
name: 'build',
description: 'Build docs for production',
},
args: { ...sharedArgs },
async setup({ args }) {
const dir = resolve(args.dir as string)
const nuxtConfig = await getNuxtConfig(dir, opts.setup)
const { runCommand } = await import('nuxi')
await runCommand('build', [dir], { overrides: nuxtConfig })
},
})
const main = defineCommand({
meta: {
name: opts.name,
description: opts.description,
},
subCommands: {
init,
dev,
prepare,
build,
},
})
return {
runMain: () => runMain(main),
}
}