{"version":3,"sources":["jsdelivr-header.js","/npm/nei@3.8.0/main.js"],"names":[],"mappings":"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","file":"/npm/nei@3.8.0/main.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/nei@3.8.0/main.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\n * exports toolkit\n * @author  genify(caijf@corp.netease.com)\n * @author  huntbao\n */\n'use strict';\n\nlet fs = require('fs');\nlet util = require('util');\nlet path = require('path');\nlet _fs = require('./lib/util/file');\nlet _path = require('./lib/util/path');\nlet _util = require('./lib/util/util');\nlet _io = require('./lib/util/io');\nlet _log = require('./lib/util/logger');\nlet Builder = require('./lib/nei/builder');\nlet server = require('./lib/server/server');\nlet neiDbConst = require('./lib/fb-modules/config/db.json');\nlet _logger = _log.logger;\nlet Template = require('./lib/nei/template');\n\nclass Main {\n  /**\n   * 构建 nei 工程\n   * @param  {object}  arg - 参数类的实例\n   * @param  {string}  action - 操作命令\n   * @param  {object}  args - 命令行参数对象\n   */\n  build(arg, action, args) {\n    this.args = args;\n    this.config = {\n      action: action\n    };\n    let cwd = process.cwd() + '/';\n    this.checkConfig();\n    let loadedHandler = (ds) => {\n      this.config.pid = ds.project && ds.project.id || ds.specs && ds.specs[0] && ds.specs[0][\"spec\"][\"id\"];\n      this.ds = ds;\n      this.fillArgs();\n      // 合并完参数后, 需要重新 format 一下, 并且此时需要取默认值\n      this.args = arg.format(this.config.action, this.args, true);\n      // output 的参数有可能写在项目或者规范中, 这里重新计算, 然后还需要重新检查\n      this.config.outputRoot = _path.normalize(_path.absolute((this.args.output || './') + '/', cwd));\n      this.config.neiConfigRoot = `${this.config.outputRoot}nei.${this.config.pid}.${this.args.key || this.args.specKey}/`;\n      this.checkConfig();\n      new Builder({\n        config: this.config,\n        args: this.args,\n        ds: this.ds\n      });\n    }\n    this.loadData(loadedHandler);\n  }\n\n  /**\n   *\n   */\n  template(arg, data) {\n    if (!arg.path) {\n      _logger.error(`未指定本地模板路径，请通过nei template -h 查看帮助`);\n      return;\n    }\n    new Template(arg, data).build();\n  }\n\n  /**\n   * 更新 nei 工程规范\n   * @param  {object}  arg - 参数类的实例\n   * @param  {string}  action - 操作命令\n   * @param  {object}  args - 命令行参数对象\n   */\n  update(arg, action, args) {\n    let dir = path.join(process.cwd(), args.output || './');\n    let projects = this.findProjects(args);\n    let buildProject = (neiProjectDir, exitIfNotExist) => {\n      let config = _util.file2json(`${neiProjectDir}/nei.json`, exitIfNotExist, \"未找到nei.json文件，请检查，建议使用nei build重新构建\");\n      let mergedArgs = Object.assign({}, config.args, args);\n      if(mergedArgs.add){// 只有update支持add,这里可能会有重复，由builder里去重\n        mergedArgs.ids = mergedArgs.ids.concat(mergedArgs.add);\n      }\n      new Main().build(arg, action, mergedArgs);\n    }\n    if (args.key) {\n      if (projects.length == 0) {\n        _logger.error(`在 ${dir} 中找不到 key 为 ${args.key} 的项目, 请检查`);\n        return process.exit(1);\n      } else if (projects.length > 1) {\n        _logger.error(`存在多个 key 为 ${args.key} 的项目, 请检查`);\n        return process.exit(1);\n      } else {\n        buildProject(projects[0], true);\n      }\n    } else {\n      if (projects.length > 1) {\n        if (!args.all) {\n          _logger.error(`存在多个 nei 项目, 请通过 key 参数指定需要更新的项目, 或者使用 --all 参数更新所有项目`);\n          return process.exit(1);\n        } else {\n          projects.forEach(buildProject);\n        }\n      } else {\n        buildProject(projects[0], true);\n      }\n    }\n  }\n\n  /**\n   * start mock server\n   * @param  {object}  args - args object\n   */\n  server(args) {\n    let dir = path.join(process.cwd(), args.output || './');\n    let tryStartServer = (configFilePath) => {\n      if (_fs.exist(configFilePath)) {\n        let options = {\n          configFilePath: configFilePath,\n          fromNei: true,\n          targetDir: dir\n        };\n        server(options);\n      } else {\n        _logger.warn(`文件不存在: ${configFilePath}`);\n      }\n    }\n    let projects = this.findProjects(args);\n    if (projects.length === 0) {\n      if (args.key) {\n        _logger.error(`在 ${dir} 中找不到 key 为 ${args.key} 的项目, 请检查`);\n      } else {\n        _logger.error(`在 ${dir} 中找不到 nei 项目, 请检查`);\n      }\n      return process.exit(1);\n    } else if (projects.length > 1) {\n      if (args.key) {\n        _logger.error(`在 ${dir} 中找到多个 key 为 ${args.key} 的项目, 请检查`);\n      } else if (args.all) {\n        // 合并启动服务器\n        let routes = {};\n        let temp = {};\n        projects.forEach(it => {\n          try {\n            temp = require(`${it}/server.config.js`);\n            Object.assign(routes, temp.routes);\n          } catch (e) {\n            _logger.error(`找不到文件${it}/server.config.js`);\n          }\n        });\n        temp.routes = routes;\n        let options = {\n          configFilePath: temp,\n          fromNei: true,\n          watchConfigPaths: projects.map(it => `${it}/server.config.js`),\n          targetDir: dir\n        };\n        server(options);\n      } else {\n        _logger.error(`在 ${dir} 中找到多个 nei 项目, 请使用 key 参数指定要启动的项目, 或使用--all选项合并路由`);\n        return process.exit(1);\n      }\n    } else {\n      tryStartServer(`${projects[0]}/server.config.js`);\n    }\n  }\n\n  /**\n   * 从 NEI 服务器加载项目数据\n   * @param {function} callback - 加载成功回调\n   */\n  loadData(callback) {\n    let neiHost = this.args.server || 'https://nei.netease.com';\n    let url;\n    if (this.args.hasOwnProperty('specKey')) {\n      let specKey = this.args.specKey;\n      url = `${neiHost}/api/specificationres/?key=${encodeURIComponent(specKey)}`;\n    } else {\n      let key = this.args.key;\n      let specType = {\n        web: neiDbConst.CMN_TYP_WEB,\n        aos: neiDbConst.CMN_TYP_AOS,\n        ios: neiDbConst.CMN_TYP_IOS,\n        test: neiDbConst.CMN_TYP_TEST\n      }[this.args.specType] || neiDbConst.CMN_TYP_WEB;\n\n      url = `${neiHost}/api/projectres/?key=${encodeURIComponent(key)}&spectype=${specType}`;\n    }\n    url = _path.normalize(url);\n    _logger.info('从 NEI 服务器加载数据, 地址: %s', url);\n    _io.download(url, (data) => {\n      _logger.info(`数据加载完成, 开始解析数据`);\n      let json;\n      try {\n        json = JSON.parse(data);\n        if (json.code !== 200) {\n          _logger.error('NEI 服务器异常', json);\n          process.exit(1);\n        }\n      } catch (ex) {\n        _logger.debug('NEI 数据 \\n%s', data);\n        _logger.error('NEI 数据解析错误: \\n%s', ex.stack);\n        process.exit(1);\n      }\n      callback(json.result);\n    });\n  }\n\n  /**\n   * 检测指定的目录中是否存在 nei 配置文件\n   */\n  checkConfig() {\n    let action = this.config.action;\n    let outputDir = this.config.outputRoot;\n    if (!_fs.exist(outputDir)) {\n      // 目录不存在, update 命令不会走到这里\n      return;\n    }\n    let result = {};\n    _fs.walk(outputDir,\n      filename => {\n        if (path.basename(filename) === 'nei.json')\n          result['file'] = true;\n        return filename;\n      },\n      (dirname, r, level) => {\n        if (level > 1) {\n          return false;\n        }\n        let basename = path.basename(dirname);\n        if (basename.startsWith('nei') && basename.endsWith(this.args.key || this.args.specKey)) {\n          result['dir'] = basename;\n        }\n        return dirname;\n      }, result, 0);\n    let foundConfigFile = null;\n    if (result['file'] && result['dir']) {\n      foundConfigFile = result['dir'];\n    }\n    let errorMsg = null;\n    if (foundConfigFile) {\n      if (action === 'build') {\n        errorMsg = '项目 %s 已存在, 请使用 nei update 命令更新项目';\n      } else if (action === 'update') {\n        _logger.debug('更新项目 %s', foundConfigFile);\n      }\n    } else {\n      if (action === 'update') {\n        errorMsg = '没找到通过 nei 构建的项目, 请先使用 nei build 命令构建项目';\n      }\n    }\n    if (errorMsg) {\n      _logger.error(errorMsg, foundConfigFile);\n      return process.exit(1);\n    }\n  }\n\n  /**\n   * 填充参数, 合并项目中的命令行参数设置、规范中的命令行参数\n   */\n  fillArgs() {\n    let spec = this.ds.specs[0];\n    if (!spec) {\n      _logger.error(`项目没找到工程规范, 请检查是否已经给项目指定了规范, 或者 specType 参数值是否正确`);\n      return process.exit(1);\n    }\n    let specArgsConfig = spec.spec.argsConfig;\n    let proArgs = {};\n    this.ds.cliargs && this.ds.cliargs.forEach(function (cliarg) {\n      proArgs[cliarg.key] = cliarg.value;\n    });\n    let specCliArgDoc = null;\n    let findSpecCliArg = (docs) => {\n      specCliArgDoc = docs.find((doc) => {\n        return doc.id === specArgsConfig;\n      });\n      if (!specCliArgDoc) {\n        docs.forEach((doc) => {\n          findSpecCliArg(doc.children);\n        });\n      }\n    }\n    let specArgs = {};\n    // 如果规范设置了命令行参数文件\n    if (specArgsConfig) {\n      findSpecCliArg(spec.docs);\n      if (specCliArgDoc) {\n        try {\n          specArgs = JSON.parse(specCliArgDoc.content);\n        } catch (e) {\n          _logger.error(`规范设置的命令行参数文件, 它的内容不是有效的 json, 请检查是否有多余的逗号或者缺少逗号, 键及字符串类型的值是否都使用了英文双引号等: ${e}`);\n        }\n      }\n    }\n    this.args = Object.assign({}, specArgs, proArgs, this.args);\n  }\n\n  /**\n   * 查找指定输出目录下的 nei 项目\n   */\n  findProjects(args) {\n    let dir = path.join(process.cwd(), args.output || './');\n    if (!_fs.exist(dir)) {\n      // 目录不存在, 退出程序\n      _logger.error(`项目目录 ${dir} 不存在, 请检查`);\n      return process.exit(1);\n    }\n    let files = fs.readdirSync(dir);\n    let projects = [];\n    files.forEach((file) => {\n      if (args.key) {\n        if (file.startsWith('nei') && file.endsWith(args.key)) {\n          projects.push(`${dir}/${file}`);\n        }\n      } else if (file.startsWith('nei') && file.length >= 42) {\n        // 疑是 nei 项目, 42 是 nei 配置文件的长度, 考虑到项目有可能会超过 5 位, 这里使用 >=\n        projects.push(`${dir}/${file}`);\n      }\n    });\n    return projects;\n  }\n}\n\nmodule.exports = new Main();\n\n\n"]}