vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
147 lines (146 loc) • 5.11 kB
JavaScript
import '../assertEnvVite.js';
export { isViteCli };
export { getViteConfigForBuildFromCli };
export { getViteCommandFromCli };
import { toPosixPath } from '../../../utils/path.js';
import { assert } from '../../../utils/assert.js';
import { isObject } from '../../../utils/isObject.js';
import { cac } from 'cac';
const desc = 'vike:vite-cli-simulation';
function isViteCli() {
let execPath = process.argv[1];
assert(execPath);
execPath = toPosixPath(execPath);
return (
// pnpm
execPath.endsWith('/bin/vite.js') ||
// npm & yarn
execPath.endsWith('/.bin/vite') ||
// Global install
execPath.endsWith('/bin/vite'));
}
function getViteCommandFromCli() {
if (!isViteCli())
return null;
let command;
const setCommand = (cmd) => {
assert(command === undefined);
command = cmd;
};
// Copied & adapted from Vite
// https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L186-L188
const cli = cac(desc);
// dev
cli
.command('[root]', desc)
.alias('serve')
.alias('dev')
.action(() => {
setCommand('dev');
});
// build
cli.command('build [root]', desc).action(() => {
setCommand('build');
});
// optimize
cli.command('optimize [root]', desc).action(() => {
setCommand('optimize');
});
// preview
cli.command('preview [root]', desc).action(() => {
setCommand('preview');
});
cli.parse();
assert(command);
return command;
}
function getViteConfigForBuildFromCli() {
if (!isViteCli())
return null;
// Copied & adapted from Vite
const cli = cac(desc);
// Common configs
// https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L169-L182
cli
.option('-c, --config <file>', desc)
.option('--base <path>', desc)
.option('-l, --logLevel <level>', desc)
.option('--clearScreen', desc)
.option('--configLoader <loader>', desc)
.option('-d, --debug [feat]', desc)
.option('-f, --filter <filter>', desc)
.option('-m, --mode <mode>', desc);
// Build configs
// https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L286-L322
cli
.command('build [root]', desc)
.option('--target <target>', desc)
.option('--outDir <dir>', desc)
.option('--assetsDir <dir>', desc)
.option('--assetsInlineLimit <number>', desc)
.option('--ssr [entry]', desc)
.option('--sourcemap', desc)
.option('--minify [minifier]', desc)
.option('--manifest [name]', desc)
.option('--ssrManifest [name]', desc)
.option('--emptyOutDir', desc)
.option('-w, --watch', desc)
.option('--app', desc)
.action((root, options) => {
assert(isObject(options));
assert(root === undefined || typeof root === 'string');
assert(options.config === undefined || typeof options.config === 'string');
// https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L331-L346
const buildOptions = cleanGlobalCLIOptions(cleanBuilderCLIOptions(options));
configFromCli = {
root,
base: options.base,
mode: options.mode,
configFile: options.config,
configLoader: options.configLoader,
logLevel: options.logLevel,
clearScreen: options.clearScreen,
build: buildOptions,
...(options.app ? { builder: {} } : {}),
};
});
let configFromCli = null;
cli.parse();
return configFromCli;
// https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L99
function cleanGlobalCLIOptions(options) {
const ret = { ...options };
delete ret['--'];
delete ret.c;
delete ret.config;
delete ret.base;
delete ret.l;
delete ret.logLevel;
delete ret.clearScreen;
delete ret.configLoader;
delete ret.d;
delete ret.debug;
delete ret.f;
delete ret.filter;
delete ret.m;
delete ret.mode;
delete ret.force;
delete ret.w;
// convert the sourcemap option to a boolean if necessary
if ('sourcemap' in ret) {
const sourcemap = ret.sourcemap;
ret.sourcemap = sourcemap === 'true' ? true : sourcemap === 'false' ? false : ret.sourcemap;
}
if ('watch' in ret) {
const watch = ret.watch;
ret.watch = watch ? {} : undefined;
}
return ret;
}
// https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L141
function cleanBuilderCLIOptions(options) {
const ret = { ...options };
delete ret.app;
return ret;
}
}