powerful-cli
Version:
封装了webpack功能的命令行接口, 提供serve、build、lib等命令, 支持vue3、js、ts等...
309 lines (308 loc) • 6.09 kB
text/typescript
import {
exec,
} from 'node:child_process';
import {defineConfig} from '../index.js';
export default defineConfig(async (
{
returnCheck,
baseDir,
packageJson,
args,
command,
utils:{
extend,
copyReplace,
copyCover,
copyCustom,
dateFormat,
},
}
) => {
const branch = await new Promise<string>((resolve) => {
exec('git rev-parse --abbrev-ref HEAD', (error, stdout) => {
resolve(error ? '' : stdout.trim());
});
});
const gitUserName = await new Promise<string>((resolve) => {
exec('git config user.name', (error, stdout) => {
resolve(error ? '' : stdout.trim());
});
});
const lastCommit= await new Promise<string>((resolve) => {
exec('git log -1 --pretty=format:"[%ad] %an [%h] %s" --date=format:"%Y-%m-%d %H:%M"', (error, stdout) => {
resolve(error ? '' : stdout.trim());
});
});
return returnCheck({
extendConfigs:[
],
envPath:'env',
extraEnv:{
buildTime:dateFormat(new Date(),'yyyy-MM-dd HH:mm:ss.SSS ZZ'),
command,
packageName:packageJson.name,
name:packageJson.description,
version:packageJson.version,
branch,
gitUserName,
lastCommit,
vueVersion:require('vue/package.json').version,
webpackVersion:require('webpack/package.json').version,
},
});
},async (
{
extendConfigs,
envPath,
extraEnv,
returnCheck,
baseDir,
packageJson,
args,
command,
utils:{
extend,
copyReplace,
copyCover,
copyCustom,
dateFormat,
},
}
) => {
return returnCheck({
unique:packageJson.name,
debug:false,
devServer:{
hot:command==='serve',
client:{
logging:'warn',
overlay:{
errors:true,
warnings:false,
runtimeErrors:false,
},
},
},
emitEntryInjectJs:{
},
pages:{
index:'src/main.ts',
},
htmlTemplate:{
favicon:'template/favicon.ico',
minify:undefined,
templateParameters:{
},
inject:false,
},
publicPath:'auto',
outputDir:'dist',
assetsDir:'assets',
alias:{
},
buildFile:{
emit:command!=='serve',
name:'build-info.txt',
content:[
`构建时间: ${extraEnv.buildTime}`,
`构建命令: ${extraEnv.command}`,
`项目名称: ${extraEnv.packageName}`,
`项目描述: ${extraEnv.name}`,
`构建版本: ${extraEnv.version}`,
`构建分支: ${extraEnv.branch}`,
`构建用户: ${extraEnv.gitUserName}`,
`最新提交: ${extraEnv.lastCommit}`,
`vue版本: ${extraEnv.vueVersion}`,
`webpack版本: ${extraEnv.webpackVersion}`,
],
},
emitFiles:{
},
definePlugin:{
__VUE_OPTIONS_API__:'true',
__VUE_PROD_DEVTOOLS__:'false',
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__:'false',
},
vConsole:{
active:false,
vue:true,
},
buildConfig:{
buildConsole:'normal',
minimize:'swc',
sourceMap:true,
cssSourceMap:false,
sourceLog:true,
},
libConfig:{
html:{
template:'template/index.html',
templateContent:false,
filename:'index.html',
title:'',
favicon:undefined,
minify:true,
templateParameters:undefined,
inject:undefined,
publicPath:undefined,
base:undefined,
meta:undefined,
scriptLoading:'blocking',
},
buildConsole:'normal',
name:packageJson.name,
entry:'src/lib.ts',
minimize:'swc',
sourceMap:true,
cssSourceMap:false,
sourceLog:true,
externals:{
vue:{
commonjs:'vue',
commonjs2:'vue',
amd:'vue',
root:'Vue',
},
'vue-router':{
commonjs:'vue-router',
commonjs2:'vue-router',
amd:'vue-router',
root:'VueRouter',
},
},
export:'default',
polyfillAll:true,
asyncChunks:false,
},
//region 压缩配置(一般不配置)
terserOptions:{
default:{
ecma:5,
safari10:true,
compress:{
ecma:5,
keep_infinity:true,
passes:2,
reduce_funcs:false,
},
mangle:{
safari10:true,
},
format:{
ecma:5,
comments:false,
safari10:true,
},
},
swc:{
compress:{
ecma:5,
keep_infinity:true,
passes:0,
reduce_funcs:false,
},
mangle:{
safari10:true,
},
format:{
ecma:5,
comments:false,
safari10:true,
},
},
},
//endregion
copy:{
dir:'static',
to:undefined,
toType:undefined,
minimize:true,
filter:undefined,
transformer:undefined,
},
babel:{
presetOption:{
browserslistEnv:undefined,
debug:false,
useBuiltIns:'usage',
},
plugins:[
],
polyfills:[
'stable/object',
'stable/array',
'stable/set',
'stable/map',
'stable/promise',
'stable/url',
],
extraPolyfills:[
'intersection-observer',
],
transpileDependencies:[
'@vue/devtools-api',
'vue-demi',
],
extraEntry:[
],
},
typescript:{
active:true,
configFile:undefined,
},
eslint:{
active:true,
failOnError:command!=='serve',
configType:'flat',
eslintPath:'eslint/use-at-your-own-risk',
extensions:[
'js',
'ts',
'vue',
],
},
markdown:{
components:{
},
elementClassName:{
table:'apiTable',
},
cssModules:[
'powerful-cli/styles/markdown.module.scss',
],
},
css:{
},
cacheGroups:{
base:{
priority:20,
test:/[\\/]node_modules[\\/](?:core-js|@babel[\\/]runtime|@vue|vue(?:x|-router|-loader)?|pinia)[\\/]/,
name:'base',
reuseExistingChunk:true,
enforce:true
},
lib:{
priority:10,
test:/[\\/]node_modules[\\/]/,
name:'lib',
reuseExistingChunk:true,
enforce:true
},
},
splitChunks:{
minSize:500 * 1024,
enforceSizeThreshold:5 * 1024 * 1024,
maxInitialRequests:1,
maxAsyncRequests:1,
},
report:{
emit:true,
type:'html',
filename:'report',
statsOptions:null,
},
fileManager:undefined,
webpackConfig:{
},
});
});