sequelize-ts-boilerplate
Version:
A REST API scaffolding tool designed to scale and easily generate CRUD endpoints based on database schema design
156 lines • 11.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const appRootDir = path.resolve(process.cwd());
const fse = require("fs-extra");
const constants_1 = require("../../utils/constants");
const general_utils_1 = require("../../utils/general-utils");
exports.generate = (tables, config) => {
let fileContent = "";
fse.removeSync(path.join(config.ORM_GENERATE.path.daos));
tables.forEach((x) => {
let refs = [];
fileContent = "import { Table, Column, Model, HasOne, HasMany, BelongsTo, BelongsToMany, ForeignKey, PrimaryKey, AutoIncrement, AllowNull, Default } from 'sequelize-typescript';\n" +
`\n\n${constants_1.CONSTANT.IMPORT_REF_STATEMENT}\n\n` +
`@Table({tableName: "${x.tableName}"})\n` +
`export class ${x.tableNameUpperCase} extends Model<${x.tableNameUpperCase}>` +
`{\n`;
x.properties.forEach((y) => {
if (y.isRef) {
fileContent += `\t@ForeignKey(() => ${general_utils_1.default.capitalizeFirstLetter(y.reference.model)})\n`;
refs.push(general_utils_1.default.capitalizeFirstLetter(y.reference.model));
}
if (y.isAllowNull) {
fileContent += "\t@AllowNull\n";
}
if (y.isPrimaryKey) {
fileContent += "\t@PrimaryKey\n"
+ "\t@AutoIncrement\n";
}
if (y.isUnique) {
fileContent += "\t@Unique\n";
}
if (y.defaultValue) {
fileContent += `\t@Default({value: '${y.defaultValue}'})\n`;
}
fileContent += `\t@Column({field: '${y.propName}'})\n`;
const optional = y.isAllowNull || y.isPrimaryKey ? "?" : "";
// handles lookups
if (y.isLookup) {
fileContent += `\tpublic ${y.lowerCasePropName}${optional}: ${y.type};\n\n`;
fileContent += `\t@BelongsTo(() => ${general_utils_1.default.capitalizeFirstLetter(y.lookup.tableName)}, "${y.propName}") // extra, non-column prop for Lookup\n`
+ `\tpublic ${y.lookup.propName}${optional}: ${general_utils_1.default.capitalizeFirstLetter(y.lookup.tableName)};\n\n`;
const lookupImportStatement = `import { ${config.ORM_GENERATE.lookup.tableName} } from './${config.ORM_GENERATE.lookup.tableName}';`;
if (!fileContent.includes(lookupImportStatement)) {
fileContent = fileContent.replace(constants_1.CONSTANT.IMPORT_REF_STATEMENT, constants_1.CONSTANT.IMPORT_REF_STATEMENT + "\n" + lookupImportStatement);
}
}
else {
const isCaseSensitiveMatch = config.ORM_GENERATE.caseSensitiveProps.find((x) => x === y.propName);
if (isCaseSensitiveMatch) {
fileContent += `\tpublic ${y.propName}: ${y.type};\n\n`;
}
else {
fileContent += `\tpublic ${y.lowerCasePropName}${optional}: ${y.type};\n\n`;
}
}
});
fileContent += `\n\t${constants_1.CONSTANT.PROPERTY_REF_STATEMENT}\n\n`;
fileContent += "}\n";
fse.outputFileSync(path.join(config.ORM_GENERATE.path.daos, general_utils_1.default.capitalizeFirstLetter(x.tableName) + ".ts"), fileContent);
// write refs for that file
let filename = path.join(config.ORM_GENERATE.path.daos, general_utils_1.default.capitalizeFirstLetter(x.tableName) + ".ts");
refs.forEach((ref) => {
let myImportRefStatement = `import { ${general_utils_1.default.capitalizeFirstLetter(ref)} } from './${general_utils_1.default.capitalizeFirstLetter(ref)}';\n`;
let myPropertyRefStatement = null;
write({ myPropertyRefStatement, myImportRefStatement, filename });
});
});
//config.shouldWriteRelations
if (true) {
// SECOND LOOP
tables.forEach((x) => {
x.properties.forEach((y) => {
let filename = path.join(config.ORM_GENERATE.path.daos, general_utils_1.default.capitalizeFirstLetter(x.tableName) + ".ts");
let myImportRefStatement = null;
let myPropertyRefStatement = null;
if (y.isRef && !y.reference.isToSelf) {
// remove 1
// refs that are in different files
// if (y.reference.isThroughTable && !y.reference.istoSelf) {
// let currentPropertyName = y.propName;
// // get through table imports
// myImportRefStatement = `import ${utils.createModelName(utils.capitalizeFirstLetter(y.reference.model))} from './${utils.createModelName(utils.capitalizeFirstLetter(y.reference.model))}';\n`;
// write({myPropertyRefStatement, myImportRefStatement, filename});
// if (y.isRef && y.reference.isThroughTable) {
// sFilename = path.join(opts.ORM_GENERATE.path.daos, utils.createModelName(utils.capitalizeFirstLetter(y.reference.model)) + ".ts");
// //@BelongsToMany() on other file
// for (let throughTableProp of x.properties) {
// if (throughTableProp.propName !== y.propName && throughTableProp.isRef && throughTableProp.reference.isThroughTable) {
// myImportRefStatement = `import ${utils.createModelName(utils.capitalizeFirstLetter(y.reference.model))} from './${utils.createModelName(utils.capitalizeFirstLetter(y.reference.model)}';`;
// myPropertyRefStatement = `\n\t// through table ref\n`
// + `\t@BelongsToMany(() => ${utils.createModelName(utils.capitalizeFirstLetter(y.reference.model))}, () => ${utils.createModelName(utils.capitalizeFirstLetter(x.tableName))})\n`
// + `\tpublic ${utils.pluralize(utils.createModelName(utils.capitalizeFirstLetter(y.reference.model)))}?: Array<${utils.createModelName(utils.capitalizeFirstLetter(y.reference.model))}>;\n`;
// sFilename = path.join(opts.ORM_GENERATE.path.daos, throughTableProp.reference.model + ".ts");
// break;
// }
// }
// write({myPropertyRefStatement, myImportRefStatement, filename: sFilename});
// //@BelongsTo() on other file
// myImportRefStatement = `import ${utils.createModelName(utils.capitalizeFirstLetter(x.tableName))} from './${utils.createModelName(utils.capitalizeFirstLetter(x.tableName))}';`;
// myPropertyRefStatement = `\n\t// through table ref\n`
// + `\t@BelongsTo(() => ${utils.createModelName(utils.capitalizeFirstLetter(x.tableName))}, '${opts.primaryKeyIdentifier}')`
// + `\n\tpublic ${utils.createModelName(utils.capitalizeFirstLetter(x.tableName))}: ${utils.createModelName(utils.capitalizeFirstLetter(x.tableName))};\n`;
// write({myPropertyRefStatement, myImportRefStatement, filename: sFilename});
// }
// // `one to many` import to other file; is not ref to self, is not through table
// // @BelongsTo && @HasMany
// } else
if (!y.reference.isMapTable && !y.reference.isToSelf) {
// // @BelongsTo on this file
myImportRefStatement = `import { ${general_utils_1.default.capitalizeFirstLetter(y.reference.model)} } from './${general_utils_1.default.capitalizeFirstLetter(y.reference.model)}';`;
myPropertyRefStatement = `\t// insert bc of one:many- so can query ${general_utils_1.default.capitalizeFirstLetter(x.tableName)}.find({include: [${general_utils_1.default.capitalizeFirstLetter(y.reference.model)}]})\n`
+ `\t@BelongsTo(() => ${general_utils_1.default.capitalizeFirstLetter(y.reference.model)}) \n`
+ `\tpublic ${y.reference.lowerCaseModel}: ${general_utils_1.default.capitalizeFirstLetter(y.reference.model)};\n`;
write({ myImportRefStatement, myPropertyRefStatement, filename });
// // @HasMany on other file
filename = path.join(config.ORM_GENERATE.path.daos, general_utils_1.default.capitalizeFirstLetter(y.reference.model)) + ".ts";
myImportRefStatement = `import { ${general_utils_1.default.capitalizeFirstLetter(x.tableName)} } from './${general_utils_1.default.capitalizeFirstLetter(x.tableName)}';`;
myPropertyRefStatement = `\t//inserted b/c of \`One:Many\` ${general_utils_1.default.capitalizeFirstLetter(y.reference.model)}:${general_utils_1.default.capitalizeFirstLetter(x.tableName)}\n`
+ `\t@HasMany(() => ${general_utils_1.default.capitalizeFirstLetter(x.tableName)})\n`
+ `\tpublic ${general_utils_1.default.pluralize(x.tableName)}: Array<${general_utils_1.default.capitalizeFirstLetter(x.tableName)}> \n`;
write({ myPropertyRefStatement, myImportRefStatement, filename });
}
}
});
});
}
// clean up any self-ref imports
const files = fse.readdirSync(path.join(config.ORM_GENERATE.path.daos));
files.forEach((x) => {
let strFile = fse.readFileSync(path.join(config.ORM_GENERATE.path.daos, x), "utf8");
let filename = x.slice(0, x.length - 3);
let importStatement = `import { ${general_utils_1.default.capitalizeFirstLetter(filename)} } from './${general_utils_1.default.capitalizeFirstLetter(filename)}';`;
if (strFile.indexOf(importStatement) > -1) {
strFile = strFile.replace(importStatement, "");
fse.outputFileSync(path.join(config.ORM_GENERATE.path.daos, x), strFile, "utf8");
}
});
};
const write = ({ myPropertyRefStatement, myImportRefStatement, filename }) => {
let strFile = "";
let sFullImportRef = constants_1.CONSTANT.IMPORT_REF_STATEMENT + "\n" + myImportRefStatement;
let sFullPropertyRef = constants_1.CONSTANT.PROPERTY_REF_STATEMENT + "\n" + myPropertyRefStatement;
fse.ensureFileSync(filename);
strFile = fse.readFileSync(filename, "utf8");
//generate property reference
if (myPropertyRefStatement && strFile.indexOf(myPropertyRefStatement) < 0) {
strFile = strFile.replace(constants_1.CONSTANT.PROPERTY_REF_STATEMENT, sFullPropertyRef);
}
//generate import reference
if (myImportRefStatement && strFile.indexOf(myImportRefStatement) < 0) {
strFile = strFile.replace(constants_1.CONSTANT.IMPORT_REF_STATEMENT, sFullImportRef);
}
fse.outputFileSync(filename, strFile, "utf8");
};
//# sourceMappingURL=write-dao.js.map