omelop-iplocation
Version:
ip2location parse ip location info
435 lines • 38.6 kB
JavaScript
"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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