{"version":3,"sources":["jsdelivr-header.js","/npm/just-spa@1.2.4/index.js"],"names":[],"mappings":"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","file":"/npm/just-spa@1.2.4/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/just-spa@1.2.4/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","﻿\r\nconst fs = require('fs');\r\nconst path = require('path');\r\nconst fse = require('fs-extra');\r\nconst axon = require('axon');\r\nconst socketPub = axon.socket('push');\r\n// const downloadGitRepo = require('download-git-repo');\r\nconst childProcess = require('child_process');\r\nconst logger = require('./src/lib/logger');\r\nconst fileAsync = require('./src/fileAsync');\r\n\r\nconst configs = require('./src/configs');\r\nconst { isWinPlatform, getPortFromParams } = require('./src/utils');\r\n\r\nconst { createComponent, createWebapp, createTemplate, removeTemplate, listTemplates } = require('./src/componentLine');\r\n\r\nconst args = process.argv.splice(1);\r\nconst currentPath = process.cwd();\r\nconst serverPath = __dirname;   //path.dirname(path.resolve(args[0], '../'));\r\n\r\nconst command = args[1] || '';\r\nconst commandParams = args.slice(2) || [];\r\n\r\nconst devRootHost = 'http://localhost';\r\n\r\nconst buildPath = configs.BUILD_PATH; // build输出目录\r\nconst npm = configs.NPM;              // npm的安装命令\r\n\r\nlet cdDisk = '';\r\n\r\n// 如果匹配到windows环境的盘符，则需要转盘符\r\nif (/(\\w:)/ig.test(serverPath)) {\r\n    cdDisk = serverPath.match(/(\\w:)/gi)[0] + ' && ';\r\n}\r\n\r\n\r\n/**\r\n * 初始化命令集合\r\n * \r\n */\r\nfunction _initCommandSet(serverPath, command, commandParams) {\r\n\r\n    logger(`当前包管理工具为 ${npm}.`, 'cyan');\r\n\r\n    let scriptCommand = `${npm} info just-spa version --json`;\r\n\r\n    // 如果不是init则不需要拉取版本号对比\r\n    if (command !== 'version' && command !== 'v') {\r\n        commandExcute();\r\n        return;\r\n    }\r\n\r\n    // 对于其它的命令需要拉取远程版本号，实时提示更新升级\r\n    childProcess.exec(scriptCommand, (error, stdout, stderr) => {\r\n        // 根据结果判断运行是否成功\r\n        if (stdout.indexOf('Error') > -1) {\r\n            logger(`获取远程版本号失败,正在使用本地版本.`, 'magenta');\r\n            commandExcute();\r\n        } else {\r\n            if (error) {\r\n                logger(`获取远程版本号失败,正在使用本地版本.`, 'magenta');\r\n                commandExcute();\r\n                return;\r\n            }\r\n\r\n            const latestVersion = stdout.replace(/\\t|\\n|\\r|\\\"/ig, '');\r\n\r\n            fse.readJson(`${serverPath}/package.json`).then((packageObj) => {\r\n                if (packageObj.version != latestVersion) {\r\n                    logger(`远程最新稳定just-spa版本为${latestVersion}，本地为${packageObj.version}，请尽快升级使用系统新的特性.`, 'magenta');\r\n                    logger(`运行 \"${npm} update just-spa -g\" 升级.`, 'red');\r\n                    logger('', 'red');\r\n                } else {\r\n                    logger(`本地just-spa已是最新版本.`, 'cyan');\r\n                }\r\n                commandExcute();\r\n            }, () => {\r\n                logger(`获取远程版本号失败,正在使用本地版本.`, 'magenta');\r\n                commandExcute();\r\n            });\r\n        }\r\n    });\r\n\r\n    function commandExcute() {\r\n        // 命令行处理\r\n        switch (command) {\r\n            case 'test':\r\n                // downloadGitRepo('gitlab@git.code.oa.com:ouvenzhang/webapp-compoments-template.git', 'tmp',{ clone: true }, function (err, data) {\r\n                //     console.log(err, data);\r\n                //     console.log(err ? 'Error' : 'Success')\r\n                // });\r\n                break;\r\n            case 'i':\r\n            case 'install':\r\n                _installOrUpdateAllDependencies(commandParams, 'install');\r\n                break;\r\n            case 'update':\r\n                _installOrUpdateAllDependencies(commandParams, 'update');\r\n                break;\r\n            case 'init':\r\n                createComponent((componentDir) => {\r\n                    logger('auto install dependencies', 'cyan');\r\n                    _installOrUpdateAllDependencies('', 'install', path.resolve(currentPath, './' + componentDir));\r\n                });         // 根据物料创建组件\r\n                break;\r\n            case 'template':\r\n                createTemplate(serverPath); // 创建物料模板\r\n                break;\r\n            case 'webapp':\r\n                createWebapp((webappName) => {\r\n                    logger(`项目初始化完成，执行：cd ${webappName} & ${npm} i 安装项目依赖`, 'cyan');\r\n                    // _installDependencies(commandParams, componentName, 'install');\r\n                }); // 根据项目组件物料库创建项目\r\n                break;\r\n            case 'rmtemplate':\r\n                removeTemplate(serverPath); // 删除物料模板\r\n                break;\r\n            case 'list':\r\n                listTemplates();            // 删除物料模板\r\n                break;\r\n            case 'clear':\r\n            case 'clean':\r\n                _clearCacheBuildDir([       // 如果命令为空，则输出help\r\n                    serverPath + buildPath\r\n                ]);\r\n                break;\r\n            case 'run':\r\n            case 'start':\r\n                _initStart(commandParams);\r\n                break;\r\n            case '':\r\n            case 'help':\r\n                // 如果命令为help，则输出help\r\n                _consoleHelp();\r\n                break;\r\n            case 'watch':\r\n            case 'dev':\r\n                // watch、dev均可开启调试模式\r\n                _initFileWatch(serverPath);\r\n                break;\r\n            case 'build':\r\n                // 编译打包组件为单个可输出文件\r\n                _buildEs5Component(commandParams);\r\n                break;\r\n            case 'set':\r\n                // 设置npm运行命令，选择npm还是tnpm\r\n                _setNpmCommand(commandParams);\r\n                break;\r\n            case '-v':\r\n            case 'version':\r\n                _showVersion();\r\n                break;\r\n            default:\r\n                // 如果命令为空，且没有该命令，则提示没有该命令\r\n                logger(`抱歉，没有找到\"${command}\"命令。您可以尝试just help来查看所有命令.`, 'red');\r\n                _consoleHelp();\r\n                break;\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * 设置npm运行命令，选择npm、cnpm还是tnpm\r\n * \r\n * @param {any} commandParams \r\n */\r\nfunction _setNpmCommand(commandParams) {\r\n    // 使用一个子进程进入服务器目录并启动组件服务\r\n    if (!commandParams[0]) {\r\n        logger('请输入要设置的npm工具，输入例如：just set npm/tnpm/cnpm', 'red');\r\n        return;\r\n    }\r\n\r\n    configs['NPM'] = commandParams[0];\r\n\r\n    fse.outputJson(path.join(serverPath, './src', 'configs.json'), configs, {\r\n        encoding: 'utf8',\r\n        spaces: 4\r\n    }, function(err, data) {\r\n        if (err) throw err;\r\n        logger(`${commandParams[0]} has been setted successfully.`, 'cyan');\r\n    });\r\n}\r\n\r\n/**\r\n * 编译打包组件为单个可输出文件\r\n * \r\n * @param {any} commandParams \r\n */\r\nfunction _buildEs5Component(commandParams) {\r\n    // 使用一个子进程进入服务器目录并启动组件服务\r\n    if (!commandParams[0]) {\r\n        logger('请输入要打包的组件名称，输入例如：just build ComponentName', 'red');\r\n        return;\r\n    }\r\n\r\n    let componentDir = path.join(currentPath, commandParams[0]);\r\n\r\n    if (!componentDir) {\r\n        logger('输入的组件名称不正确，任务即将跳过', 'magenta');\r\n        return;\r\n    }\r\n\r\n    logger(`running: 开始build组件...`, 'cyan');\r\n    childProcess.exec(`cd \"${serverPath}\" && ${cdDisk} node \"./command/build-es5\" --src \"${serverPath}\" --dist \"${componentDir}\" --name \"${commandParams[0]}\"`, (error, stdout, stderr) => {\r\n        if (error) {\r\n            logger(`childProcess.exec error: ${error}`, 'magenta');\r\n            return;\r\n        }\r\n        if (stderr) {\r\n            logger(`warning: ${stderr}`, 'magenta');\r\n        }\r\n        logger(`stdout: ${stdout}`, 'cyan');\r\n        logger(`Es5组件构建任务完成.`, 'green');\r\n    });\r\n}\r\n\r\n/**\r\n * 显示版本\r\n * \r\n */\r\nfunction _showVersion() {\r\n    fse.readJson(`${serverPath}/package.json`).then(packageObj => {\r\n        logger(`version: ${packageObj.version}`, 'cyan');\r\n    });\r\n}\r\n\r\n/**\r\n * 清楚build缓存目录，强制直接删除\r\n * \r\n */\r\nfunction _clearCacheBuildDir(dirs) {\r\n    for (let dir of dirs) {\r\n        fse.removeSync(dir);\r\n    }\r\n}\r\n\r\n/**\r\n * 安装或更新当前组件依赖\r\n * \r\n * @param {any} commandParams \r\n * @param {any} command \r\n */\r\nfunction _installDependencies(commandParams, componentName, command) {\r\n\r\n    let params = _readDependencies(componentName).join(' ');\r\n\r\n    // 如果当前组件没有第三方依赖则返回\r\n    if(!(/\\w/ig.test(params))) {\r\n        return ;\r\n    }\r\n    // 使用一个子进程进入服务器目录并启动组件服务\r\n    logger(`running: cd \"${serverPath}\" && ${cdDisk} ${npm} ${command} ${params}`, 'cyan')\r\n    childProcess.exec(`cd \"${serverPath}\" && ${cdDisk} ${npm} ${command} ${params}`, (error, stdout, stderr) => {\r\n        if (error) {\r\n            logger(`childProcess.exec error: ${error}`, 'magenta');\r\n            return;\r\n        }\r\n        if (stderr) {\r\n            logger(`warning: ${stderr}`, 'magenta');\r\n        }\r\n        logger(`stdout: ${stdout}`, 'cyan');\r\n        logger(`组件依赖安装成功.`, 'cyan');\r\n    });\r\n}\r\n\r\n/**\r\n * 安装或更新所有依赖\r\n * \r\n * @param {any} commandParams \r\n * @param {any} command \r\n */\r\nfunction _installOrUpdateAllDependencies(commandParams, command, componentDir) {\r\n\r\n    let params = commandParams.length ? (commandParams || []).join(' ') : _readDirDependencies(componentDir || currentPath).join(' ');\r\n\r\n    if (componentDir) {\r\n        params = _readDirDependencies(componentDir).join(' ');\r\n\r\n        if (!(params.replace(/\\s/ig, ''))) {\r\n            return;\r\n        }\r\n    }\r\n    // 使用一个子进程进入服务器目录并启动组件服务\r\n    logger(`running: cd \"${serverPath}\" && ${cdDisk} ${npm} ${command} ${params}`, 'cyan')\r\n    childProcess.exec(`cd \"${serverPath}\" && ${cdDisk} ${npm} ${command} ${params}`, (error, stdout, stderr) => {\r\n        if (error) {\r\n            logger(`childProcess.exec error: ${error}`, 'magenta');\r\n            return;\r\n        }\r\n        if (stderr) {\r\n            logger(`warning: ${stderr}`, 'magenta');\r\n        }\r\n        logger(`stdout: ${stdout}`, 'cyan');\r\n        logger(`组件依赖安装成功.`, 'cyan');\r\n    });\r\n}\r\n\r\n/**\r\n * 启动服务器命\r\n * \r\n */\r\nfunction _initStart(commandParams = []) {\r\n\r\n    const port = getPortFromParams(commandParams);\r\n    const devRootUrl = `${devRootHost}:${port}`;\r\n\r\n    logger(`starting dev server...`, 'magenta');\r\n\r\n    // 使用一个子进程进入服务器目录并启动组件服务\r\n    logger(`Serverd in ${serverPath}${buildPath}`, 'cyan');\r\n\r\n    fse.pathExists(serverPath + buildPath, (err, exists) => {\r\n        if (!exists) {\r\n            logger('未运行调试服务，请先选择组件调试目录运行\"just watch\"再尝试.', 'red');\r\n            return;\r\n        }\r\n\r\n        // 输出运行命令信息\r\n        logger(`cd \"${serverPath}\" && ${cdDisk} node \"server.js\" --devpath \"${currentPath}\" ${commandParams.join(' ')}`, 'cyan');\r\n        childProcess.exec(`cd \"${serverPath}\" && ${cdDisk} node \"server.js\" --devpath \"${currentPath}\" ${commandParams.join(' ')}`, (error, stdout, stderr) => {\r\n            logger(`${stdout}`, 'cyan');\r\n            logger(`${error}`, 'red');\r\n            logger(`${stderr}`, 'red');\r\n        }).on('exit', function (code) {\r\n            logger(`restarting dev server...`, 'magenta');\r\n            logger(`dev server stoped...code:${code} success.`, 'cyan');\r\n\r\n            _initStart(commandParams);\r\n        });\r\n\r\n        logger(`dev server started.`, 'magenta');\r\n        setTimeout(() => {\r\n            logger(`Listening at ${devRootUrl}/ 请尝试访问 ${devRootUrl}`, 'green');\r\n            // childProcess.exec(`start ${devRootUrl}`);  // 自动打开浏览器操作可以使用opn的npm包优化\r\n        }, 400);\r\n\r\n    })\r\n}\r\n\r\n/**\r\n * 停止服务器命令\r\n * \r\n */\r\nfunction _stopServer() {\r\n    // 使用一个子进程进入服务器目录并启动组件服务\r\n    process.exit(-1);\r\n    logger(`Server stoped.`, 'cyan');\r\n}\r\n\r\n/**\r\n * 输出帮助信息\r\n * \r\n */\r\nfunction _consoleHelp() {\r\n    logger(`\r\n您可以使用下面命令:\r\n    just init: 创建一个组件。根据组件物料库模速生成一个组件。\r\n    just webapp: 创建一个项目。根据项目物料库快速生成一个项目工程(支持PWA项目)。\r\n    just template: 根据自定义组件物料库目录创建一个新的组件物料库。\r\n    just rmtemplate: 删除一个自定义组件物料库。\r\n    just list: 查看存在的所有组件物料库列表。\r\n    just i/install: 安装组件的第三方依赖，同 npm/tnpm install。\r\n    just update: 更新组件的第三方依赖，同 npm/tnpm update。\r\n    just clear/clean: 清除缓存。清除build构建的缓存目录。\r\n    just start/run -port: 启动调试服务器。一般只需要运行一次。-p或-port表示指定端口开启服务。\r\n    just dev/watch: 在当前目录下创建组件调试环境。\r\n    just build: 编译打包组件为单个输出的ES5文件并编译CSS文件。例如：just build ComponentName\r\n    just help: 查看帮助。查看just所有命令。\r\n    just -v/version: 显示当前安装的just版本。\r\n    just set: 设置npm、tnpm或cnpm，例如：just set tnpm。`, 'magenta');\r\n}\r\n\r\n/**\r\n * 初始化文件目录读取和文件编辑变化监听\r\n * \r\n */\r\nfunction _initFileWatch(serverPath) {\r\n\r\n    const currentPath = process.cwd();\r\n    const componentDirs = _readDirSync(currentPath);\r\n\r\n    for (let componentDir of componentDirs) {\r\n        fileAsync(serverPath, componentDir, currentPath);\r\n    }\r\n\r\n    // 如果组件不为空，则需要写入组件信息\r\n    if (componentDirs.length) {\r\n        _writeComponentInfo(componentDirs, serverPath, currentPath);\r\n    }\r\n\r\n    // 通知dev server进行重启等操作\r\n    socketPub.connect(configs.SOCKET_URL);\r\n    socketPub.send('watch');\r\n}\r\n\r\n/**\r\n * 自动读取单个组件中的dependencies\r\n * \r\n */\r\nfunction _readDependencies(componentName) {\r\n\r\n    const componentDir = path.join(process.cwd(), componentName);\r\n    const dependencies = [];\r\n\r\n    // 如果组件不为空，则需要进入读取组件的dependencies\r\n    let packageJson = {};\r\n\r\n    if(fse.pathExistsSync(componentDir + '/package.json')) {\r\n        packageJson = fse.readJsonSync(componentDir + '/package.json') || {};\r\n    }\r\n\r\n    for (let key in (packageJson && packageJson.dependencies || {})) {\r\n        if(dependencies.indexOf(key) < 0) {\r\n            dependencies.push(key);\r\n        }\r\n    }\r\n\r\n    return dependencies;\r\n}\r\n\r\n/**\r\n * 自动读取组件目录中的所有dependencies\r\n * \r\n */\r\nfunction _readDirDependencies(currentPath) {\r\n    let packageJson = {};\r\n    const componentDirs = _readDirSync(currentPath, true);\r\n    let dependencies = [];\r\n    let packageNames = [];  // 本地已存在被引用的包\r\n    if (componentDirs.length) {\r\n        for (let componentDir of componentDirs) {\r\n            if(fse.pathExistsSync(componentDir + '/package.json')) {\r\n                packageJson = fse.readJsonSync(componentDir + '/package.json') || {};\r\n                packageNames.push(packageJson.name);\r\n            }\r\n        }\r\n    }\r\n\r\n    if(fse.pathExistsSync(currentPath + '/package.json')) {\r\n        packageJson = fse.readJsonSync(currentPath + '/package.json');\r\n    }\r\n\r\n    for (let key in (packageJson && packageJson.dependencies || {})) {\r\n        if(dependencies.indexOf(key) < 0 && packageNames.indexOf(key) < 0) {\r\n            dependencies.push(key);\r\n        }\r\n    }\r\n\r\n    // 如果组件不为空，则需要进入读取组件的dependencies\r\n    if (componentDirs.length) {\r\n        for (let componentDir of componentDirs) {\r\n            let packageJson = {};\r\n\r\n            if(fse.pathExistsSync(componentDir + '/package.json')) {\r\n                packageJson = fse.readJsonSync(componentDir + '/package.json');\r\n            }\r\n\r\n            for (let key in (packageJson && packageJson.dependencies || {})) {\r\n                if(dependencies.indexOf(key) < 0 && packageNames.indexOf(key) < 0) {\r\n                    dependencies.push(key);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return dependencies;\r\n}\r\n\r\n/**\r\n * 读取一个目录，返回这个目录下的子目录\r\n * \r\n * @param {any} rootDir \r\n * @param {bool} includeFile 是否包含配置文件\r\n * @returns \r\n */\r\nfunction _readDirSync(rootDir, includeFile) {\r\n    const paths = fs.readdirSync(rootDir);\r\n\r\n    // 如果组件根目录还有下面这些文件，则允许创建组件调试\r\n    const excludeFiles = ['package.json', 'Gulpfile.js', 'webpack.config.js', 'Gruntfile.js'];\r\n\r\n    let componentDirs = [];\r\n    let canCreate = true;\r\n\r\n    paths.forEach(function (item, index) {\r\n        var info = fs.statSync(rootDir + '/' + item);\r\n        if (info.isDirectory()) {\r\n            // 如果是目录\r\n            let existPackageJSON = fse.pathExistsSync(path.join(rootDir + '/' + item, 'package.json'));\r\n            if (existPackageJSON) {\r\n                componentDirs.push(path.resolve(rootDir, item));\r\n            } else {\r\n                componentDirs.push(path.resolve(rootDir, item));\r\n                componentDirs = componentDirs.concat(_readDirSync(path.resolve(rootDir, item)));\r\n            }\r\n        } else {\r\n            // 如果是文件，且文件有package.json，则不使用该目录，组件目录中不能含有package.json\r\n            if (excludeFiles.indexOf(item) > -1 && !includeFile) {\r\n                logger(`初始化组件目录失败，组件根目录不能包含${item}文件，组件需以文件夹方式存在于组件目录下.`, 'red');\r\n                canCreate = false;\r\n            }\r\n        }\r\n    });\r\n    componentDirs = canCreate ? componentDirs : [];\r\n\r\n    return componentDirs;\r\n}\r\n\r\n/**\r\n * 读取一个目录，返回这个目录下的json数据列表\r\n * \r\n * @param {any} rootDir\r\n * @returns \r\n */\r\nfunction _readDirFileSync(rootDir) {\r\n    let paths = [];\r\n    let mockDataList = [];\r\n\r\n    if (fse.pathExistsSync(rootDir)) {\r\n        paths = fs.readdirSync(rootDir);\r\n    }\r\n\r\n    paths.forEach(function (item, index) {\r\n        var info = fs.statSync(rootDir + '/' + item);\r\n        if (info.isDirectory()) {\r\n            // 如果是目录, 则跳过\r\n        } else {\r\n            // 如果是文件，且文件有.json，则返回\r\n            if (item.indexOf('.json') >= 0) {\r\n                mockDataList.push(item)\r\n            }\r\n        }\r\n    });\r\n\r\n    return mockDataList;\r\n}\r\n\r\n/**\r\n * 根据目录下的组件生成一份组件信息的配置\r\n * \r\n * @param {any} workDirs 工作目录列表\r\n * @param {any} serverPath 服务器根目录\r\n */\r\nfunction _writeComponentInfo(workDirs, serverPath, currentPath) {\r\n\r\n    let componentInfos = { components: [], templates: {} };\r\n    let webappInfos = { webapps: [], templates: {} };\r\n    let alias = {};\r\n    let webpackConfigs = {};\r\n    // 物料模板选项映射表\r\n    const templatesJson = fse.readJsonSync(__dirname + '/src/lib/template-source/template.json') || {};\r\n    \r\n    for (let componentDir of workDirs) {\r\n        \r\n        let packageName,\r\n        packageInfo; // 读取组件的package.json，获取组件信息，如果没有则放入组件名称\r\n        \r\n        // 处理mac和windows系统差异性\r\n        // if (isWinPlatform()) {\r\n        //     packageName = componentDir.split(\"\\\\\");\r\n        // } else {\r\n        //     packageName = componentDir.split('/');\r\n        // }\r\n\r\n        packageName = componentDir.replace(currentPath, '').slice(1).replace(/\\\\/ig, '/').toLowerCase();\r\n        \r\n        // 如果存在package.json则获取组件名\r\n        let existPackageJSON = fse.pathExistsSync(path.join(componentDir, 'package.json'));\r\n        if (existPackageJSON) {\r\n            let templateJson = fse.readJsonSync(path.resolve(componentDir, 'package.json'));\r\n            packageInfo = fse.readJsonSync(path.join(componentDir, 'package.json'));\r\n\r\n            // 默认读取data目录下的mock数据列表\r\n            let mockDataList = _readDirFileSync(path.resolve(componentDir, 'data'));\r\n\r\n            // 如果是应用，则添加应用信息，否则添加组件信息\r\n            if (packageInfo.template === 'webapp') {\r\n                webappInfos.webapps.push(Object.assign(packageInfo, {\r\n                    name: packageName\r\n                }));\r\n            } else if (packageInfo.template){\r\n                componentInfos.components.push(Object.assign({}, packageInfo, {\r\n                    mockDataList: mockDataList\r\n                }, {\r\n                    name: packageName\r\n                }));\r\n                alias[packageName] = packageName + '.js';\r\n            }\r\n        }\r\n\r\n        // 如果存在readme则读取webpackConfigs配置\r\n        let existReadme = fse.pathExistsSync(path.join(componentDir, 'readme.md'));\r\n        if (existReadme && existPackageJSON) {\r\n\r\n            let webpackConfigText = fs.readFileSync(path.resolve(componentDir, 'readme.md'), 'utf-8');\r\n\r\n            const webpackConfigReg = /```webpack-config((\\t|\\n|\\s|.)+?)```/;\r\n\r\n            let webpackConfigInfo = {};\r\n            \r\n            let webpackConfigArr = webpackConfigText.match(webpackConfigReg) || [];\r\n\r\n            try {\r\n                if (webpackConfigArr && webpackConfigArr.length) {\r\n                    webpackConfigInfo = JSON.parse(webpackConfigArr && webpackConfigArr[1] ||'{}');\r\n                }\r\n            } catch(e) {\r\n\r\n            }\r\n\r\n            for ( let packageName in webpackConfigInfo) {\r\n                if (packageInfo.template === 'webapp') {\r\n                    // 如果是项目则跳过\r\n                } else if (packageInfo.template){\r\n                    webpackConfigs[packageName] = webpackConfigInfo[packageName];\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    componentInfos.templates = templatesJson;\r\n    componentInfos = JSON.stringify(componentInfos);\r\n\r\n    webappInfos = JSON.stringify(webappInfos);\r\n\r\n    // 根据当前调试根目录生成所有组件的列表\r\n    fse.outputFile(path.join(serverPath + buildPath, 'component-info') + '.js', `var componentInfo = JSON.parse(\\`${componentInfos}\\`)`, (err) => {\r\n        if (err) throw err;\r\n        logger(`component list info has been created successfully.`, 'cyan');\r\n    });\r\n\r\n    // 根据当前调试根目录生成所有组件的列表\r\n    fse.outputFile(path.join(serverPath + buildPath, 'webapp-info') + '.js', `var webappInfo = JSON.parse(\\`${webappInfos}\\`)`, (err) => {\r\n        if (err) throw err;\r\n        logger(`webapp list info has been created successfully.`, 'cyan');\r\n    });\r\n\r\n    fse.outputJson(path.join(serverPath + buildPath, 'alias.json'), alias, {\r\n        encoding: 'utf8',\r\n        spaces: 4\r\n    }, function(err, data) {\r\n        if (err) throw err;\r\n        logger(`alias info has been created successfully.`, 'cyan');\r\n    });\r\n\r\n    fse.outputJson(path.join(serverPath + buildPath, 'webpack-config.json'), webpackConfigs, {\r\n        encoding: 'utf8',\r\n        spaces: 4\r\n    }, function(err, data) {\r\n        if (err) throw err;\r\n        logger(`webpackConfig info has been created successfully.`, 'cyan');\r\n    });\r\n}\r\n\r\nmodule.exports = function () {\r\n    _initCommandSet(serverPath, command, commandParams);\r\n};"]}