UNPKG

@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
"use strict"; 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