@notadd/cli
Version:
notadd core none dependence
89 lines (85 loc) • 2.39 kB
text/typescript
import { join } from 'path';
import { readFileSync, readdirSync } from 'fs-extra';
import { compact } from 'lodash';
import { Injectable } from "@notadd/core";
()
export class ReadEntitiesService {
/**
* 搜索 .entity 文件表名
*/
private readonly _entityNameReg = /class ([^\s]*Entity)/;
/**
* 拿到 .entity 中所有的字段
*/
private readonly _filedsReg = /[^\s]*\??\:\s*(number|string|any|Date|boolean|Array|Object).*/g;
/**
* 用于拆分一个字段
*/
private readonly _filedDetailReg = /([^\s]*)\??\:\s*(number|string|any|Date|boolean|Array|Object).*/;
readEntities(): ReadEntitiesResult[] {
const fileNames = readdirSync(process.cwd()).filter((it) => it.includes('.entity.ts'));
const dirName = process.cwd().split('/').pop();
if (!dirName) throw new Error('文件夹名或位置不正确');
if (fileNames.length == 0) {
throw new Error('未找到.entity.ts文件');
}
const entities: ReadEntitiesResult[] = fileNames.map((it) => {
const content = readFileSync(join(process.cwd(), it)).toString();
const entityName = content.match(this._entityNameReg);
if (!entityName || !entityName[1]) throw new Error(`${it}文件没有Entity结尾的class`);
const fileds = content.match(this._filedsReg);
if (!fileds || fileds.length == 0) throw new Error(`${it}文件没有字段`);
const filedNames = compact(
fileds.map((it) => {
const filedsMatch = it.match(this._filedDetailReg);
if (filedsMatch) {
const filedName = filedsMatch[1].replace('?', '').trim();
const type = filedsMatch[2].trim();
return filedName;
}
return null;
})
);
return {
fileName: it,
content,
entityName: entityName[1].trim(),
fileds,
dirName,
filedNames,
};
});
return entities;
}
}
export interface ReadEntitiesResult {
/**
* 文件名
* @example "test.entity.ts"
*/
fileName: string;
/**
* entity文件内容
*/
content: string;
/**
* 表(class)名
* @example "TestEntity"
*/
entityName: string;
/**
* 所有字段列表
* @example ['id?: number;','type: string;']
*/
fileds: string[];
/**
* 文件夹名
* @example "test"
*/
dirName: string;
/**
* 所有字段民
* @example [ 'id', 'createDate' ]
*/
filedNames: string[];
}