@eggjs/dal-runtime
Version:
tegg dal decorator
145 lines • 13.4 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CodeGenerator = void 0;
const promises_1 = __importDefault(require("node:fs/promises"));
const node_path_1 = __importDefault(require("node:path"));
const js_beautify_1 = require("js-beautify");
const lodash_1 = __importDefault(require("lodash"));
const nunjucks_1 = __importDefault(require("nunjucks"));
const tegg_types_1 = require("@eggjs/tegg-types");
const tegg_1 = require("@eggjs/tegg");
const SqlGenerator_1 = require("./SqlGenerator");
const TemplateUtil_1 = require("./TemplateUtil");
class CodeGenerator {
constructor(options) {
this.moduleDir = options.moduleDir;
this.moduleName = options.moduleName;
this.teggPkg = options.teggPkg ?? '@eggjs/tegg';
this.dalPkg = options.dalPkg ?? '@eggjs/tegg/dal';
this.createNunjucksEnv();
}
createNunjucksEnv() {
this.njkEnv = nunjucks_1.default.configure(node_path_1.default.join(__dirname, './templates'), {
autoescape: false,
});
this.njkEnv.addFilter('pascalCase', name => lodash_1.default.upperFirst(lodash_1.default.camelCase(name)));
this.njkEnv.addFilter('camelCase', name => lodash_1.default.camelCase(name));
this.njkEnv.addFilter('dbTypeToTSType', TemplateUtil_1.TemplateUtil.dbTypeToTsType);
}
genCode(tplName, filePath, tableModel) {
let tableModelAbsolutePath = tegg_1.PrototypeUtil.getFilePath(tableModel.clazz);
tableModelAbsolutePath = tableModelAbsolutePath.substring(0, tableModelAbsolutePath.length - 3);
const data = {
table: tableModel,
file: filePath,
fileName: node_path_1.default.basename(filePath),
clazzName: tableModel.clazz.name,
moduleName: this.moduleName,
teggPkg: this.teggPkg,
dalPkg: this.dalPkg,
id: tableModel.columns.find(t => t.propertyName === 'id'),
primaryIndex: tableModel.getPrimary(),
tableModelPath: TemplateUtil_1.TemplateUtil.importPath(tableModelAbsolutePath, node_path_1.default.dirname(filePath)),
extensionPath: `../../extension/${tableModel.clazz.name}Extension`,
structurePath: `../../structure/${tableModel.clazz.name}.json`,
sqlPath: `../../structure/${tableModel.clazz.name}.sql`,
columnMap: tableModel.columns.reduce((p, c) => {
p[c.propertyName] = c;
return p;
}, {}),
};
return this.njkEnv.render(`${tplName}.njk`, data);
}
async generate(tableModel) {
let dalDir;
try {
await promises_1.default.access(node_path_1.default.join(this.moduleDir, 'src'));
dalDir = node_path_1.default.join(this.moduleDir, 'src/dal');
}
catch {
dalDir = node_path_1.default.join(this.moduleDir, 'dal');
}
// const tableName = tableModel.name;
// const clazzName = tableModel.clazz.name;
const clazzFileName = node_path_1.default.basename(tegg_1.PrototypeUtil.getFilePath(tableModel.clazz));
const baseFileName = node_path_1.default.basename(clazzFileName, '.ts');
// 要动的一些文件
const paths = {
// e.g. app/dal/dao/base/example.ts
baseBizDAO: node_path_1.default.join(dalDir, `dao/base/Base${baseFileName}DAO.ts`),
// e.g. app/dal/dao/example.ts
bizDAO: node_path_1.default.join(dalDir, `dao/${baseFileName}DAO.ts`),
// e.g. app/dal/extension/example.ts
extension: node_path_1.default.join(dalDir, `extension/${baseFileName}Extension.ts`),
// e.g. app/dal/structure/example.json
structure: node_path_1.default.join(dalDir, `structure/${baseFileName}.json`),
// e.g. app/dal/structure/example.sql
structureSql: node_path_1.default.join(dalDir, `structure/${baseFileName}.sql`),
};
// 建立 structure 文件
await promises_1.default.mkdir(node_path_1.default.dirname(paths.structure), {
recursive: true,
});
await promises_1.default.writeFile(paths.structure, JSON.stringify(tableModel, null, 2), 'utf8');
const sqlGenerator = new SqlGenerator_1.SqlGenerator();
const structureSql = sqlGenerator.generate(tableModel);
await promises_1.default.writeFile(paths.structureSql, structureSql, 'utf8');
const codes = [{
templates: tegg_types_1.Templates.BASE_DAO,
filePath: paths.baseBizDAO,
beautify: true,
overwrite: true,
}, {
templates: tegg_types_1.Templates.DAO,
filePath: paths.bizDAO,
beautify: true,
overwrite: false,
}, {
templates: tegg_types_1.Templates.EXTENSION,
filePath: paths.extension,
beautify: false,
overwrite: false,
}];
for (const { templates, filePath, beautify, overwrite } of codes) {
await promises_1.default.mkdir(node_path_1.default.dirname(filePath), {
recursive: true,
});
const code = this.genCode(templates, filePath, tableModel);
let beautified;
if (beautify) {
beautified = (0, js_beautify_1.js_beautify)(code, {
brace_style: 'preserve-inline',
indent_size: 2,
jslint_happy: true,
preserve_newlines: false,
});
}
else {
beautified = code;
}
beautified = beautified
.replace(/( )*\/\/ empty-line( )*/g, '')
.replace(/Promise( )*<( )*(.+?)( )*>/g, 'Promise<$3>')
.replace(/Optional( )*<( )*(.+?)( )*>/g, 'Optional<$3>')
.replace(/Record( )*<( )*(.+?)( )*>/g, 'Record<$3>')
.replace(/Partial( )*<( )*(.+?)( )*>/g, 'Partial<$3>')
.replace(/DataSource( )*<( )*(.+?)( )*>/g, 'DataSource<$3>')
.replace(/ \? :/g, '?:');
if (overwrite !== true) {
try {
await promises_1.default.access(filePath);
continue;
}
catch {
// file not exists
}
}
await promises_1.default.writeFile(filePath, beautified, 'utf8');
}
}
}
exports.CodeGenerator = CodeGenerator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29kZUdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db2RlR2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFrQztBQUNsQywwREFBNkI7QUFDN0IsNkNBQTBDO0FBQzFDLG9EQUF1QjtBQUN2Qix3REFBc0Q7QUFDdEQsa0RBQThDO0FBRzlDLHNDQUE0QztBQUM1QyxpREFBOEM7QUFDOUMsaURBQThDO0FBRTlDLE1BQWEsYUFBYTtJQU14QixZQUFZLE9BQTZCO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksaUJBQWlCLENBQUM7UUFDbEQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUlELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQVEsQ0FBQyxTQUFTLENBQUMsbUJBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxFQUFFO1lBQ3BFLFVBQVUsRUFBRSxLQUFLO1NBQ2xCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFDLENBQUMsVUFBVSxDQUFDLGdCQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxD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