mirror of https://github.com/vuejs/vitepress
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.0 KiB
111 lines
3.0 KiB
import minimist from 'minimist'
|
|
import c from 'picocolors'
|
|
import { createLogger, version as viteVersion, type Logger } from 'vite'
|
|
import { createServer, disposeMdItInstance, resolveConfig, serve } from '.'
|
|
import { version } from '../../package.json'
|
|
import { buildFromCli } from './build/build'
|
|
import { init } from './init/init'
|
|
import { clearCache } from './markdownToVue'
|
|
import { bindShortcuts } from './shortcuts'
|
|
|
|
const argv: any = minimist(process.argv.slice(2))
|
|
|
|
Object.keys(argv).forEach((key) => {
|
|
if (argv[key] === 'true') {
|
|
argv[key] = true
|
|
} else if (argv[key] === 'false') {
|
|
argv[key] = false
|
|
}
|
|
})
|
|
|
|
const logVersion = (logger: Logger) => {
|
|
logger.info(
|
|
`\n ${c.green(`${c.bold('vitepress')} ${version}`)} ${c.gray(`(using vite ${viteVersion})`)}\n`,
|
|
{ clear: !logger.hasWarned }
|
|
)
|
|
}
|
|
|
|
const command = argv._[0]
|
|
const root = argv._[command ? 1 : 0]
|
|
if (root) {
|
|
argv.root = root
|
|
}
|
|
|
|
let restartPromise: Promise<void> | undefined
|
|
|
|
if (!command || command === 'dev') {
|
|
if (argv.force) {
|
|
delete argv.force
|
|
argv.optimizeDeps = { force: true }
|
|
}
|
|
|
|
let config = await resolveConfig(root, argv).catch(
|
|
logErrorAndExit.bind(null, `failed to resolve config. error:`)
|
|
)
|
|
const createDevServer = async (isRestart = true) => {
|
|
const server = await createServer(root, argv, restartServer, config)
|
|
function restartServer() {
|
|
if (!restartPromise) {
|
|
restartPromise = (async () => {
|
|
try {
|
|
config = await resolveConfig(root, argv)
|
|
} catch (err: any) {
|
|
logError(`failed to resolve config. error:`, err)
|
|
return
|
|
}
|
|
disposeMdItInstance()
|
|
clearCache()
|
|
await server.close()
|
|
await createDevServer()
|
|
})().finally(() => {
|
|
restartPromise = undefined
|
|
})
|
|
}
|
|
return restartPromise
|
|
}
|
|
await server.listen(undefined, isRestart)
|
|
logVersion(server.config.logger)
|
|
server.printUrls()
|
|
bindShortcuts(server, restartServer)
|
|
}
|
|
createDevServer(false).catch(
|
|
logErrorAndExit.bind(null, `failed to start server. error:`)
|
|
)
|
|
} else if (command === 'init') {
|
|
createLogger().info('', { clear: true })
|
|
init(argv.root)
|
|
} else {
|
|
if (command === 'build') {
|
|
buildFromCli(root, {
|
|
...argv,
|
|
onAfterConfigResolve(siteConfig) {
|
|
logVersion(siteConfig.logger)
|
|
}
|
|
}).catch(logErrorAndExit.bind(null, `build error:`))
|
|
} else if (command === 'serve' || command === 'preview') {
|
|
serve(argv).catch(
|
|
logErrorAndExit.bind(null, `failed to start server. error:`)
|
|
)
|
|
} else {
|
|
logErrorAndExit(`unknown command "${command}".`)
|
|
}
|
|
}
|
|
|
|
function logErrorAndExit(message: string, err?: any): never {
|
|
logError(message, err)
|
|
process.exit(1)
|
|
}
|
|
|
|
function logError(message: string, err?: any) {
|
|
const logger = createLogger()
|
|
logger.error(
|
|
[
|
|
c.red(message),
|
|
err && 'message' in err && err.message,
|
|
err && 'stack' in err && err.stack
|
|
]
|
|
.filter(Boolean)
|
|
.join('\n')
|
|
)
|
|
}
|