@rxap/schematics-ts-morph
Version:
This package provides utilities for manipulating TypeScript code using ts-morph, particularly for Angular and NestJS projects. It offers functions to add, coerce, and modify code elements like classes, methods, decorators, and imports. The package also in
85 lines • 4.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CoerceInterfaceFormTypeControl = CoerceInterfaceFormTypeControl;
exports.CoerceFormControl = CoerceFormControl;
exports.CoerceFormDefinitionFormControl = CoerceFormDefinitionFormControl;
const schematics_utilities_1 = require("@rxap/schematics-utilities");
const ts_morph_1 = require("@rxap/ts-morph");
const ts_morph_2 = require("ts-morph");
const coerce_interface_1 = require("../ts-morph/coerce-interface");
const coerce_form_definition_control_1 = require("./coerce-form-definition-control");
function CoerceInterfaceFormTypeControl(sourceFile, classDeclaration, formTypeName, control) {
if (sourceFile.getTypeAlias(formTypeName)) {
console.log(`Type alias ${formTypeName} already exists! Skip interface generation`);
return;
}
const interfaceDeclaration = (0, coerce_interface_1.CoerceInterface)(sourceFile, formTypeName);
interfaceDeclaration.setIsExported(true);
(0, ts_morph_1.CoercePropertyDeclaration)(interfaceDeclaration, (0, schematics_utilities_1.camelize)(control.name)).set({ type: (0, ts_morph_1.WriteType)(control, sourceFile) });
}
function CoerceFormControl(sourceFile, classDeclaration, formTypeName, control) {
var _a;
const propertyDeclaration = (0, ts_morph_1.CoercePropertyDeclaration)(classDeclaration, (0, schematics_utilities_1.camelize)(control.name)).set({
type: w => {
w.write('RxapFormControl<');
(0, ts_morph_1.WriteType)(control, sourceFile)(w);
w.write('>');
},
hasExclamationToken: true,
scope: ts_morph_2.Scope.Public,
isReadonly: true,
});
const decoratorDeclaration = (0, ts_morph_1.CoerceDecorator)(propertyDeclaration, 'UseFormControl', { arguments: [] });
const items = {};
if (((_a = control.validatorList) === null || _a === void 0 ? void 0 : _a.length) || control.isRequired) {
items['validators'] = (0, coerce_form_definition_control_1.FormControlValidatorCodeBlockWriter)(sourceFile, control);
}
if (control.state) {
items['state'] = (0, coerce_form_definition_control_1.FormControlStateCodeBlockWriter)(sourceFile, control);
}
else if (control.isArray) {
items['state'] = '[]';
}
if (Object.keys(items).length) {
const [firstArgument] = decoratorDeclaration.getArguments();
if (!firstArgument) {
decoratorDeclaration.set({ arguments: [ts_morph_2.Writers.object(items)] });
}
else {
const argument = firstArgument.asKindOrThrow(ts_morph_2.SyntaxKind.ObjectLiteralExpression);
if (items['validators']) {
const validators = argument.getProperty('validators');
if (validators) {
// TODO : merge validators
console.log('validators already exists');
}
else {
argument.addPropertyAssignment({ name: 'validators', initializer: items['validators'] });
}
}
if (items['state']) {
const state = argument.getProperty('state');
if (state) {
state.asKindOrThrow(ts_morph_2.SyntaxKind.PropertyAssignment).setInitializer(items['state']);
}
else {
argument.addPropertyAssignment({ name: 'state', initializer: items['state'] });
}
}
}
}
(0, ts_morph_1.CoerceImports)(sourceFile, {
namedImports: ['RxapFormControl', 'UseFormControl'],
moduleSpecifier: '@rxap/forms',
});
return {
propertyDeclaration,
decoratorDeclaration,
};
}
function CoerceFormDefinitionFormControl(options) {
const { coerceFormControl = CoerceFormControl, coerceFormTypeControl = CoerceInterfaceFormTypeControl, } = options;
return (0, coerce_form_definition_control_1.CoerceFormDefinitionControl)(Object.assign(Object.assign({}, options), { coerceFormControl,
coerceFormTypeControl }));
}
//# sourceMappingURL=coerce-form-definition-form-control.js.map