UNPKG

omelop-iplocation

Version:

ip2location parse ip location info

435 lines 38.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ExportBase = void 0; const XLSX = require("xlsx"); const path = require("path"); const fs = require("fs"); const consts = require("./constants"); const constants_1 = require("./constants"); const mkdirp = require("mkdirp"); const FIELD_TYPE = consts.FIELD_TYPE; const CONFIG_TYPE = consts.CONFIG_TYPE; /** * Mkdir -p. * * @param {String} path * @param {Function} fn */ function mkdir(path) { let err = mkdirp.sync(path, 0o755); console.log(' create : '.green + path); } /** * Copy template files to project. * * @param {String} origin * @param {String} target */ function copy(origin, target) { if (!fs.existsSync(origin)) { console.log(origin + 'does not exist.'); } if (!fs.existsSync(target)) { mkdir(target); console.log(' create : '.green + target); } let datalist = fs.readdirSync(origin); for (let i = 0; i < datalist.length; i++) { let oCurrent = path.resolve(origin, datalist[i]); let tCurrent = path.resolve(target, datalist[i]); if (fs.statSync(oCurrent).isFile()) { console.log(' create : '.green + tCurrent + ' from : ' + oCurrent); fs.writeFileSync(tCurrent, fs.readFileSync(oCurrent)); } else if (fs.statSync(oCurrent).isDirectory()) { copy(oCurrent, tCurrent); } } } class ExportBase { constructor(opts) { /** 支持字段类型 */ this.supportTypes = Object.values(FIELD_TYPE); /** 数据文件名集合 */ this.dataFileName = {}; /** 发布类型(服务器1、客户端2) */ this.publishType = 1; this.excelFiles = []; this.excelDir = opts.inputdir; this.outTsRootDir = opts.tsoutdir; this.outJsonRootDir = opts.jsonoutdir; let chans = opts.channel.split(','); this.publishChannel = chans; this.publishType = opts.type; this.docConfigKey = new Map(); this.modelDefines = new Map(); this.modelParent = new Map(); } /** 配置资源Bundle子目录 */ get subdir() { return null; } genConfig() { this.dataFileName = {}; this.genBaseModel(); this.genModelMap(); // 拷贝getter copy(`${__dirname}/../../template/getter/`, `${this.outTsRootDir}/getter`); /** 遍历所有excel文件 */ this.walkExcels(this.excelDir); this.excelFiles.forEach((filePath) => { this.handleModelExcel(filePath); }); this.excelFiles.forEach((filePath) => { this.handleDataExcel(filePath); }); this.genDataFileName(); } /** 多语言json数据输出目录 */ getLanOutDir(lang) { return `${this.outJsonRootDir}/i18n`; } /** json数据输出目录 */ getDataOutDir(pub, isPublic) { let dir = `${this.outJsonRootDir}/${pub}`; if (isPublic) { dir = `${this.outJsonRootDir}/common`; } return dir; } paresFieldValue(value, type) { let result = null; if (null == value) { return result; } switch (type) { case FIELD_TYPE.FLOAT: case FIELD_TYPE.FLOAT_OPTION: if (typeof value === 'number' || typeof Number(value) === 'number') { result = Number(value); result = Number(result.toFixed(8)); } break; case FIELD_TYPE.INT: case FIELD_TYPE.INT_OPTION: if (typeof value === 'number' || typeof Number(value) === 'number') { result = Number(value); result = Number(result.toFixed(0)); } break; case FIELD_TYPE.STRING: case FIELD_TYPE.STRING_OPTION: if (typeof value === 'string' || typeof value.toString() === 'string') { result = value.toString(); } break; case FIELD_TYPE.TABLE_OPTION: if (typeof value === 'object') { result = value; } else if (typeof value === 'string') { try { result = JSON.parse(value); } catch (error) { } } break; case FIELD_TYPE.ANY: result = value; break; default: console.log('未知类型', value, type); break; } return result; } mkdirsSync(dirName) { if (fs.existsSync(dirName)) { return true; } else { if (this.mkdirsSync(path.dirname(dirName))) { fs.mkdirSync(dirName); return true; } } } /** 遍历所有excel文件 */ walkExcels(dir) { fs.readdirSync(dir).forEach((filename) => { const subDir = dir + '/' + filename; const stat = fs.statSync(subDir); if (stat && stat.isDirectory()) { this.walkExcels(subDir); } else { const info = path.parse(subDir); if (consts.SUPPORT_EXCEL_TYPE.length > 0 && consts.SUPPORT_EXCEL_TYPE.indexOf(info.ext) === -1) { return; } this.excelFiles.push(subDir); } }); } handleModelExcel(filePath) { let oriFilename = path.parse(filePath).name; if (oriFilename.startsWith('~$')) { return; } this.docConfigKey.clear(); let workBook = XLSX.readFile(filePath, { type: 'binary' }); let descriptionData = workBook.Sheets['description']; if (!descriptionData) { console.log(`${filePath} 无description描述表单`); return; } let descriptionSheetJson = XLSX.utils.sheet_to_json(descriptionData, { header: 1, raw: true, blankrows: false }); for (let i = 3;; i++) { if (!descriptionSheetJson[i]) { break; } let key = descriptionSheetJson[i][0]; if (!key) { break; } this.docConfigKey.set(key, descriptionSheetJson[i][1]); } if (!this.docConfigKey.has(constants_1.DocConfigKey.use_range) || !this.docConfigKey.has(constants_1.DocConfigKey.config_type)) { console.log(`${filePath} description描述表单配置缺少use_range、config_type定义`); return; } let use_range = this.docConfigKey.get(constants_1.DocConfigKey.use_range); if (this.publishType != use_range && use_range != 3) { return; } let config_type = this.docConfigKey.get(constants_1.DocConfigKey.config_type); if (Object.values(CONFIG_TYPE).indexOf(config_type) === -1) { console.log(`${filePath} description描述表单config_type不支持,只支持${Object.values(CONFIG_TYPE)} `); return; } // 是否公共配置 let isPublic = this.docConfigKey.get(constants_1.DocConfigKey.public) || 0; // 配置表描述 let content = this.docConfigKey.get(constants_1.DocConfigKey.content); if (config_type === CONFIG_TYPE.MODEL) { let category = this.docConfigKey.get(constants_1.DocConfigKey.category); let filename = `${this.outTsRootDir}/${category}`; let parent_class = this.docConfigKey.get(constants_1.DocConfigKey.parent_class); if (parent_class && parent_class !== '') { try { parent_class = JSON.parse(parent_class); } catch (error) { console.log('继承模型配置异常, 请检查', filename, parent_class); return; } } else { parent_class = null; } // 根据模型文件生成数据配置模型 let modelData = workBook.Sheets['model']; if (!modelData && !parent_class) { console.log(`${filePath} 无template表单`); return; } let sheetJson = XLSX.utils.sheet_to_json(modelData, { header: 1, raw: true, blankrows: false }); // 字段名 let fields = sheetJson[0] || []; // 数据类型:unexport(不导出)、float(小数)、int(整数)、string(字符串)、table(对象)、key,cst第一列类型可以取key(map)、cst(常量) // 字段类型约束:index->创建字段映射索引(id,index),indexs->创建多字段映射索引(类型,indexs,level|scene_id), // unique->检测字段唯一性(name_key,unique),oc->客戶端专用(res_name,oc),os->服务端专用(baseRate,os) let types = sheetJson[1] || []; // 字段描述 let descs = sheetJson[2] || []; const pathInfo = path.parse(filename); this.mkdirsSync(pathInfo.dir); // 是否携带配置数据 let isAppendData = false; for (let pub of this.publishChannel) { let sheetData = workBook.Sheets[pub] || workBook.Sheets['default']; if (sheetData) { isAppendData = true; break; } } this.genDataModel(filename, content, fields, types, descs, isPublic, isAppendData, parent_class); } else if (config_type === CONFIG_TYPE.DATA_CONST) { let category = this.docConfigKey.get(constants_1.DocConfigKey.category); let filename = `${this.outTsRootDir}/${category}`; // 根据模型文件生成数据配置模型 let modelData = workBook.Sheets['default']; if (!modelData) { console.log(`${filePath} 无default表单`); return; } let sheetJson = XLSX.utils.sheet_to_json(modelData, { header: 1, raw: true, blankrows: false }); // 字段名 let fields = sheetJson[0] || []; // 数据类型:unexport(不导出)、float(小数)、int(整数)、string(字符串)、table(对象)、key,cst第一列类型可以取key(map)、cst(常量) // 字段类型约束:index->创建字段映射索引(id,index),indexs->创建多字段映射索引(类型,indexs,level|scene_id), // unique->检测字段唯一性(name_key,unique),oc->客戶端专用(res_name,oc),os->服务端专用(baseRate,os) let types = sheetJson[1] || []; // 字段描述 let descs = sheetJson[2] || []; const pathInfo = path.parse(filename); this.mkdirsSync(pathInfo.dir); this.genDataConstModel(filename, content, fields, types, descs, isPublic, sheetJson.slice(consts.CONFIG_SKIP_ROW)); } } handleDataExcel(filePath) { let oriFilename = path.parse(filePath).name; if (oriFilename.startsWith('~$')) { return; } this.docConfigKey.clear(); let workBook = XLSX.readFile(filePath, { type: 'binary' }); let descriptionData = workBook.Sheets['description']; if (!descriptionData) { console.log(`${filePath} 无description描述表单`); return; } let descriptionSheetJson = XLSX.utils.sheet_to_json(descriptionData, { header: 1, raw: true, blankrows: false }); for (let i = 3;; i++) { if (!descriptionSheetJson[i]) { break; } let key = descriptionSheetJson[i][0]; if (!key) { break; } this.docConfigKey.set(key, descriptionSheetJson[i][1]); } if (!this.docConfigKey.has(constants_1.DocConfigKey.use_range) || !this.docConfigKey.has(constants_1.DocConfigKey.config_type)) { console.log(`${filePath} description描述表单配置缺少use_range、config_type定义`); return; } let use_range = this.docConfigKey.get(constants_1.DocConfigKey.use_range); if (this.publishType != use_range && use_range != 3) { return; } let config_type = this.docConfigKey.get(constants_1.DocConfigKey.config_type); if (Object.values(CONFIG_TYPE).indexOf(config_type) === -1) { console.log(`${filePath} description描述表单config_type不支持,只支持${Object.values(CONFIG_TYPE)} `); return; } // 是否公共配置 let isPublic = this.docConfigKey.get(constants_1.DocConfigKey.public) || 0; // 配置表描述 let content = this.docConfigKey.get(constants_1.DocConfigKey.content); if (config_type === CONFIG_TYPE.CONST) { // 生成CONST模型 let modelData = workBook.Sheets['default']; if (!modelData) { console.log(`${filePath} 无template表单`); return; } let sheetJson = XLSX.utils.sheet_to_json(modelData, { header: 1, raw: true, blankrows: false }); let filename = `${this.outTsRootDir}/${oriFilename}`; const pathInfo = path.parse(filename); this.mkdirsSync(pathInfo.dir); this.genConstModel(filename, content, sheetJson.slice(consts.CONFIG_SKIP_ROW)); } else if (config_type === CONFIG_TYPE.LANG) { // 生成LANG模型 let modelData = workBook.Sheets['default']; if (!modelData) { console.log(`${filePath} 无default表单`); return; } let fields = this.docConfigKey.get(constants_1.DocConfigKey.fields); let fieldsDef = this.docConfigKey.get(constants_1.DocConfigKey.fieldsDef); let sheetJson = XLSX.utils.sheet_to_json(modelData, { header: 1, raw: true, blankrows: false }); let filename = `${this.outTsRootDir}/${oriFilename}`; const pathInfo = path.parse(filename); this.mkdirsSync(pathInfo.dir); this.genLangModel(filename, content, fields, fieldsDef, sheetJson.slice(consts.CONFIG_SKIP_ROW)); } else if (config_type === CONFIG_TYPE.ERROR) { // 生成ERROR模型 let modelData = workBook.Sheets['default']; if (!modelData) { console.log(`${filePath} 无default表单`); return; } let baseCodeConfig = this.docConfigKey.get(constants_1.DocConfigKey.base_code_config); let sheetJson = XLSX.utils.sheet_to_json(modelData, { header: 1, raw: true, blankrows: false }); let filename = `${this.outTsRootDir}/${oriFilename}`; if (baseCodeConfig && baseCodeConfig !== '') { try { baseCodeConfig = JSON.parse(baseCodeConfig); } catch (error) { console.log('继承错误码配置异常, 请检查', filename, baseCodeConfig); return; } } else { baseCodeConfig = null; } const pathInfo = path.parse(filename); this.mkdirsSync(pathInfo.dir); this.genErrorModel(filename, content, sheetJson.slice(consts.CONFIG_SKIP_ROW), baseCodeConfig); } let categoryModel = this.docConfigKey.get(constants_1.DocConfigKey.category); for (let pub of this.publishChannel) { let sheetData = workBook.Sheets[pub] || workBook.Sheets['default']; if (!sheetData) { continue; } let sheetJson = XLSX.utils.sheet_to_json(sheetData, { header: 1, raw: true, blankrows: false }); // 字段名 let fields = sheetJson[0]; // 数据类型:unexport(不导出)、float(小数)、int(整数)、string(字符串)、table(对象)、key,cst第一列类型可以取key(map)、cst(常量) let types = sheetJson[1]; // 字段描述 let descs = sheetJson[2]; let filename = `${this.getDataOutDir(pub, isPublic)}/${oriFilename}`; let fmtType = null; // 数组 if (config_type === CONFIG_TYPE.CONST) { // 生成常量对象 fmtType = CONFIG_TYPE.CONST; } else if (config_type === CONFIG_TYPE.LANG) { // 语言配置类型 fmtType = CONFIG_TYPE.LANG; } else if (config_type === CONFIG_TYPE.ERROR) { fmtType = CONFIG_TYPE.ERROR; } else if (config_type === CONFIG_TYPE.DATA_CONST) { fmtType = CONFIG_TYPE.DATA_CONST; } else { // 常规数据类型 fmtType = CONFIG_TYPE.DATA; } const pathInfo = path.parse(filename); this.mkdirsSync(pathInfo.dir); let parent_class = this.docConfigKey.get(constants_1.DocConfigKey.parent_class); if (parent_class && parent_class !== '') { try { parent_class = JSON.parse(parent_class); } catch (error) { console.log('继承模型配置异常, 请检查', filename, parent_class); return; } } else { parent_class = null; } if (parent_class) { this.modelParent.set(`${categoryModel}_model`, parent_class.classname); } this.genDataBuffer(filename, fmtType, fields, types, sheetJson.slice(consts.CONFIG_SKIP_ROW), descs, `${categoryModel}_model`); if (CONFIG_TYPE.LANG === fmtType || CONFIG_TYPE.ERROR === fmtType || CONFIG_TYPE.DATA_CONST === fmtType) { break; } } } } exports.ExportBase = ExportBase; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0QmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9leHBvcnRCYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLHNDQUFzQztBQUN0QywyQ0FBMkM7QUFDM0MsaUNBQWlDO0FBRWpDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7QUFDckMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztBQUV2Qzs7Ozs7R0FLRztBQUNILFNBQVMsS0FBSyxDQUFDLElBQVk7SUFDdkIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFbkMsT0FBTyxDQUFDLEdBQUcsQ0FBRSxjQUFzQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztBQUV0RCxDQUFDO0FBQ0Q7Ozs7O0dBS0c7QUFDSCxTQUFTLElBQUksQ0FBQyxNQUFjLEVBQUUsTUFBYztJQUN4QyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO0tBQzNDO0lBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDeEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBRSxjQUFzQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQztLQUN2RDtJQUNELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFD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