@rxap/ts-morph
Version:
Provides utilities for manipulating TypeScript code using the ts-morph library. It offers a fluent API to add, modify, and remove code elements such as classes, decorators, imports, and properties in both Angular and NestJS projects. This package simplifi
69 lines • 3.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Module = void 0;
exports.CoerceDependencyInjection = CoerceDependencyInjection;
const ts_morph_1 = require("ts-morph");
const coerce_decorator_1 = require("./coerce-decorator");
const coerce_imports_1 = require("./coerce-imports");
const coerce_property_declaration_1 = require("./coerce-property-declaration");
var Module;
(function (Module) {
Module["ANGULAR"] = "@angular/core";
Module["NEST"] = "@nestjs/common";
})(Module || (exports.Module = Module = {}));
function CoerceDependencyInjection(sourceFile, definition, structures = []) {
var _a, _b;
const classDeclaration = sourceFile.getClasses()[0];
if (!classDeclaration) {
throw new Error('Could not find class declaration');
}
const constructorDeclaration = classDeclaration.getConstructors()[0];
if (constructorDeclaration) {
if (constructorDeclaration.getParameters().some((parameter) => parameter.getName() === definition.parameterName)) {
console.warn(`Parameter ${definition.parameterName} already exists in constructor`);
return;
}
}
const propertyDeclaration = (0, coerce_property_declaration_1.CoercePropertyDeclaration)(classDeclaration, definition.parameterName, {
scope: (_a = definition.scope) !== null && _a !== void 0 ? _a : ts_morph_1.Scope.Public,
isReadonly: true,
});
if (definition.module === Module.ANGULAR) {
if (definition.optional) {
propertyDeclaration.setInitializer(`inject(${definition.injectionToken}, { optional: true })`);
}
else {
propertyDeclaration.setInitializer(`inject(${definition.injectionToken})`);
}
(0, coerce_imports_1.CoerceImports)(sourceFile, {
namedImports: ['inject'],
moduleSpecifier: definition.module,
});
}
else {
(0, coerce_decorator_1.CoerceDecorator)(propertyDeclaration, 'Inject', {
arguments: [definition.injectionToken],
});
if (definition.optional) {
(0, coerce_decorator_1.CoerceDecorator)(propertyDeclaration, 'Optional', {
arguments: [],
});
propertyDeclaration.setType(`${definition.type} | null`);
propertyDeclaration.setInitializer('null');
(0, coerce_imports_1.CoerceImports)(sourceFile, {
namedImports: ['Optional'],
moduleSpecifier: definition.module,
});
}
else {
propertyDeclaration.setType((_b = definition.type) !== null && _b !== void 0 ? _b : definition.injectionToken);
propertyDeclaration.setHasExclamationToken(true);
}
(0, coerce_imports_1.CoerceImports)(sourceFile, {
namedImports: ['Inject'],
moduleSpecifier: definition.module,
});
}
(0, coerce_imports_1.CoerceImports)(sourceFile, structures);
}
//# sourceMappingURL=coerce-dependency-injection.js.map