@tsclean/scaffold
Version:
This CLI creates an initial structure of a project based on clean architecture.
82 lines • 4.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SingletonGenerateTemplate = void 0;
const fs_1 = require("fs");
const ts_morph_1 = require("ts-morph");
const CommandUtils_1 = require("../commands/CommandUtils");
class SingletonGenerateTemplate {
static generate(params) {
const { filepath, manager, instance } = params;
let sourceFile;
let variableStatement;
let variableDeclaration;
let arrayLiteralExpression;
if ((0, fs_1.existsSync)(filepath)) {
sourceFile = SingletonGenerateTemplate.project.addSourceFileAtPathIfExists(filepath);
}
else {
sourceFile = SingletonGenerateTemplate.project.createSourceFile(filepath, "", { overwrite: true });
}
if (sourceFile.getVariableStatement("singletonInitializers")) {
variableStatement = sourceFile.getVariableStatement("singletonInitializers");
variableDeclaration = variableStatement.getDeclarations()[0];
arrayLiteralExpression = variableDeclaration.getInitializerIfKindOrThrow(ts_morph_1.ts.SyntaxKind.ArrayLiteralExpression);
}
else {
variableStatement = sourceFile.addVariableStatement({
declarationKind: ts_morph_1.VariableDeclarationKind.Const,
declarations: [
{
name: "singletonInitializers",
type: "Array<() => Promise<void>>",
initializer: "[]"
}
],
isExported: true
});
variableDeclaration = variableStatement.getDeclarations()[0];
arrayLiteralExpression = variableDeclaration.getInitializerIfKindOrThrow(ts_morph_1.ts.SyntaxKind.ArrayLiteralExpression);
}
SingletonGenerateTemplate.getCodeBlockSingleton(arrayLiteralExpression, manager, instance);
SingletonGenerateTemplate.getCodeBlockImports(sourceFile, manager, instance);
sourceFile.formatText({ placeOpenBraceOnNewLineForFunctions: true });
sourceFile.saveSync();
}
static getCodeBlockSingleton(arrayLiteralExpression, manager, orm) {
const nameCapitalize = CommandUtils_1.CommandUtils.capitalizeString(manager);
const ormCapitalize = CommandUtils_1.CommandUtils.capitalizeString(orm);
const instance = manager === "mongoose" ? ormCapitalize : nameCapitalize;
const varName = `${manager}Config`;
const expectedSnippet = `const ${varName} = ${instance}Configuration.getInstance();`;
const alreadyExists = arrayLiteralExpression.getElements().some((el) => {
const arrowFn = el.asKind(ts_morph_1.SyntaxKind.ArrowFunction);
if (!arrowFn)
return false;
const bodyText = arrowFn.getBody().getText();
return bodyText.includes(expectedSnippet);
});
if (!alreadyExists) {
arrayLiteralExpression.addElement(`async () => {
const ${varName} = ${instance}Configuration.getInstance();
await ${varName}.managerConnection${instance}();
}`);
}
}
static getCodeBlockImports(sourceFile, manager, orm) {
const nameCapitalize = CommandUtils_1.CommandUtils.capitalizeString(manager);
const ormCapitalize = CommandUtils_1.CommandUtils.capitalizeString(orm);
const instance = manager === "mongoose" ? ormCapitalize : nameCapitalize;
const alreadyImported = sourceFile.getImportDeclarations().some((decl) => {
return decl.getNamedImports().some((imp) => imp.getName() === `${instance}Configuration`);
});
if (!alreadyImported) {
sourceFile.addImportDeclaration({
moduleSpecifier: `@/application/config/${manager}-instance`,
namedImports: [`${instance}Configuration`]
});
}
}
}
exports.SingletonGenerateTemplate = SingletonGenerateTemplate;
SingletonGenerateTemplate.project = new ts_morph_1.Project();
//# sourceMappingURL=SingletonGenerateTemplate.js.map