@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
95 lines • 4.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isAngularValidator = isAngularValidator;
exports.CoerceFormDefinitionControl = CoerceFormDefinitionControl;
exports.FormControlValidatorCodeBlockWriter = FormControlValidatorCodeBlockWriter;
exports.FormControlStateCodeBlockWriter = FormControlStateCodeBlockWriter;
const schematics_utilities_1 = require("@rxap/schematics-utilities");
const ts_morph_1 = require("@rxap/ts-morph");
const utilities_1 = require("@rxap/utilities");
const ts_morph_transform_1 = require("../ts-morph-transform");
const form_definition_utilities_1 = require("./form-definition-utilities");
function isAngularValidator(validator) {
return [
/^min\(.+\)/,
/^max\(.+\)/,
'required',
'requiredTrue',
'email',
/^minLength\(.+\)/,
/^maxLength\(.+\)/,
/^pattern\(.+\)/,
'nullValidator',
].some(pattern => typeof pattern === 'string' ? pattern === validator : pattern.test(validator));
}
function CoerceFormDefinitionControl(options) {
const { coerceFormControl = utilities_1.noop, tsMorphTransform = utilities_1.noop, coerceFormTypeControl = utilities_1.noop, formName, } = options;
return (0, ts_morph_transform_1.TsMorphAngularProjectTransformRule)(options, (project) => {
const className = (0, form_definition_utilities_1.GetFormDefinitionClassName)({ name: formName });
const sourceFile = (0, ts_morph_1.CoerceSourceFile)(project, '/' + (0, schematics_utilities_1.CoerceSuffix)(formName, '.form.ts'));
const classDeclaration = (0, ts_morph_1.CoerceClass)(sourceFile, className, { isExported: true });
// region add control to interface
const interfaceName = (0, form_definition_utilities_1.GetFormDefinitionInterfaceName)({ name: formName });
coerceFormTypeControl(sourceFile, classDeclaration, interfaceName, options);
// endregion
coerceFormControl(sourceFile, classDeclaration, interfaceName, options);
tsMorphTransform(sourceFile, classDeclaration);
});
}
function FormControlValidatorCodeBlockWriter(sourceFile, control) {
return (w) => {
w.write('[');
if (control.validatorList.length > 1 || (control.validatorList.length && control.isRequired)) {
w.newLine();
}
for (let i = 0; i < control.validatorList.length; i++) {
const validator = control.validatorList[i];
if (isAngularValidator(validator)) {
(0, ts_morph_1.CoerceImports)(sourceFile, {
namedImports: ['Validators'],
moduleSpecifier: '@angular/forms',
});
w.write('Validators.');
}
else {
(0, ts_morph_1.CoerceImports)(sourceFile, {
namedImports: ['RxapValidators'],
moduleSpecifier: '@rxap/forms',
});
w.write('RxapValidators.');
}
w.write(validator);
if (i < control.validatorList.length - 1) {
w.write(',');
}
}
if (control.isRequired) {
if (control.validatorList.length) {
w.write(',');
}
(0, ts_morph_1.CoerceImports)(sourceFile, {
namedImports: ['Validators'],
moduleSpecifier: '@angular/forms',
});
w.write('Validators.required');
}
if (control.validatorList.length > 1 || (control.validatorList.length && control.isRequired)) {
w.newLine();
}
w.write(']');
};
}
function FormControlStateCodeBlockWriter(sourceFile, control) {
return (w) => {
if (typeof control.state === 'string') {
w.write(control.state);
}
else if (typeof control.state === 'function') {
control.state(w);
}
else {
throw new Error('Invalid state type');
}
};
}
//# sourceMappingURL=coerce-form-definition-control.js.map