UNPKG

@tsclean/scaffold

Version:

This CLI creates an initial structure of a project based on clean architecture.

82 lines 4.12 kB
"use strict"; 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