// 手动添加完插件后执行此脚本进行初始化动作 const fs = require('fs-extra') // eslint-disable-next-line import/no-extraneous-dependencies const path = require('path') const chalk = require('chalk') const shell = require('shelljs') const inquirer = require('inquirer') const getAllPlugin = require('./lib/plugin-get-all') const semverValidate = require('./lib/semver-validate') const installDep = require('./lib/install-dep') const projectPackage = require('../package.json') const pluginsPath = path.resolve(__dirname, '../src/plugin') // 检测是否有插件文件夹 if (!fs.existsSync(pluginsPath)) { console.log(chalk.red('未找到插件文件夹目录, 请确认 src 文件夹中是否有 plugins 目录')) process.exit(1) } const pluginList = getAllPlugin(pluginsPath) // 将数组 forEach 异步化 async function asyncForEach(array, callback) { for (let index = 0; index < array.length; index++) { // eslint-disable-next-line await callback(array[index], index, array) } } // 监测 npm 是否已安装 if (!shell.which('npm')) { console.log(chalk.red('检测到未安装 npm, 请先安装 npm 再重新执行, 查看: https://www.npmjs.com/get-npm')) process.exit(1) } async function handler() { const questions = [ { type: 'checkbox', name: 'plugin', choices: pluginList.map(item => ({ name: item.name, value: item })), message: '请选择需要初始化的插件\n', }, ] const { plugins } = await inquirer.prompt(questions) if (plugins.length === 0) { console.log('未选择需要初始化的插件') return } console.log(chalk.green(`开始初始化插件 ${plugins.map(item => item.name).join(', ')}`)) await asyncForEach(plugins, async ({ name, packageCtx }) => { console.log(`* 插件 ${name}`) const keys = ['dependencies', 'devDependencies'] let hasError = false await asyncForEach(keys, async key => { await asyncForEach(Object.keys(packageCtx[key]), async pkg => { const v1 = packageCtx[key][pkg] const v2 = projectPackage[key][pkg] if (v1 && v2) { if (!semverValidate(v1, v2)) { return } } try { await installDep(pkg, v1, projectPackage, key === 'devDependencies') } catch (e) { hasError = true console.log(chalk.red(e.message)) } // const result = await installDep(pkg, v1, projectPackage, (key === 'devDependencies')) // if (result instanceof Error) { // hasError = true // console.log(chalk.red(result.message)) // } }) }) if (hasError) { console.log(chalk.yellow('插件初始化结束, 但存在问题, 请手动解决')) } }) } handler().then(() => { // eslint-disable-next-line require('./plugin-get-config') })