@ -1,6 +1,6 @@
import minimist from 'minimist'
import minimist from 'minimist'
import c from 'picocolors'
import c from 'picocolors'
import { createLogger } from 'vite'
import { createLogger , type ViteDevServer } from 'vite'
import {
import {
build ,
build ,
@ -16,6 +16,7 @@ import { logVersion } from './utils/logVersion'
const argv : any = minimist ( process . argv . slice ( 2 ) )
const argv : any = minimist ( process . argv . slice ( 2 ) )
// minimist keeps `--flag=true` as the string 'true'
Object . keys ( argv ) . forEach ( ( key ) = > {
Object . keys ( argv ) . forEach ( ( key ) = > {
if ( argv [ key ] === 'true' ) {
if ( argv [ key ] === 'true' ) {
argv [ key ] = true
argv [ key ] = true
@ -24,16 +25,33 @@ Object.keys(argv).forEach((key) => {
}
}
} )
} )
// vitepress [command] [root]
const command = argv . _ [ 0 ]
const command = argv . _ [ 0 ]
const root = argv . _ [ command ? 1 : 0 ]
const root = argv . _ [ command ? 1 : 0 ]
if ( root ) {
if ( root ) {
argv . root = root
argv . root = root
}
}
let restartPromise : Promise < void > | undefined
if ( ! command || command === 'dev' ) {
if ( ! command || command === 'dev' ) {
runDev ( root , argv ) . catch (
logErrorAndExit . bind ( null , ` failed to start server. error: ` )
)
} else if ( command === 'init' ) {
createLogger ( ) . info ( '' , { clear : true } )
init ( argv . root )
} else if ( command === 'build' ) {
build ( root , argv ) . 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 } ". ` )
}
async function runDev ( root : string , argv : any ) {
if ( argv . force ) {
if ( argv . force ) {
// vite moved --force under optimizeDeps
delete argv . force
delete argv . force
argv . optimizeDeps = { force : true }
argv . optimizeDeps = { force : true }
}
}
@ -41,48 +59,41 @@ if (!command || command === 'dev') {
let config = await resolveConfig ( root , argv ) . catch (
let config = await resolveConfig ( root , argv ) . catch (
logErrorAndExit . bind ( null , ` failed to resolve config. error: ` )
logErrorAndExit . bind ( null , ` failed to resolve config. error: ` )
)
)
const createDevServer = async ( isRestart = true ) = > {
let server : ViteDevServer
const server = await createServer ( root , argv , restartServer , config )
let restartPromise : Promise < void > | undefined
async function startServer ( isRestart = true ) {
server = await createServer ( root , argv , restartServer , config )
// isRestart keeps vite from reopening the browser
await server . listen ( undefined , isRestart )
logVersion ( server . config . logger )
server . printUrls ( )
bindShortcuts ( server , restartServer )
}
// the config watcher and the r shortcut can both ask at once
function restartServer() {
function restartServer() {
if ( ! restartPromise ) {
restartPromise ? ? = restart ( ) . finally ( ( ) = > {
restartPromise = ( async ( ) = > {
restartPromise = undefined
} )
return restartPromise
}
async function restart() {
try {
try {
config = await resolveConfig ( root , argv )
config = await resolveConfig ( root , argv )
} catch ( err : any ) {
} catch ( err : any ) {
logError ( ` failed to resolve config. error: ` , err )
logError ( ` failed to resolve config. error: ` , err )
return
return
}
}
disposeMdItInstance ( )
disposeMdItInstance ( )
clearCache ( )
clearCache ( )
await server . close ( )
await server . close ( )
await createDevServer ( )
await startServer ( )
} ) ( ) . 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' ) {
build ( root , argv ) . 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 } ". ` )
}
}
await startServer ( false )
}
}
function logErrorAndExit ( message : string , err? : any ) : never {
function logErrorAndExit ( message : string , err? : any ) : never {