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

75 lines 4.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CoerceFormControls = CoerceFormControls; exports.CoerceFormDefinition = CoerceFormDefinition; const schematics_1 = require("@angular-devkit/schematics"); const ts_morph_1 = require("@rxap/ts-morph"); const utilities_1 = require("@rxap/utilities"); const ts_morph_2 = require("ts-morph"); const ts_morph_transform_1 = require("../ts-morph-transform"); const coerce_form_definition_array_1 = require("./coerce-form-definition-array"); const coerce_form_definition_form_control_1 = require("./coerce-form-definition-form-control"); const coerce_form_definition_group_1 = require("./coerce-form-definition-group"); const coerce_form_definition_type_1 = require("./coerce-form-definition-type"); const form_definition_utilities_1 = require("./form-definition-utilities"); function CoerceFormControls(sourceFile, classDeclaration, formTypeName, { controlList }) { for (const control of controlList !== null && controlList !== void 0 ? controlList : []) { switch (control.role) { case 'group': (0, coerce_form_definition_group_1.CoerceFormGroup)(sourceFile, classDeclaration, formTypeName, control); break; case 'control': (0, coerce_form_definition_form_control_1.CoerceFormControl)(sourceFile, classDeclaration, formTypeName, control); break; case 'array': (0, coerce_form_definition_array_1.CoerceFormArray)(sourceFile, classDeclaration, formTypeName, control); break; default: throw new Error(`Unknown control role: ${control.role}`); } } } function CoerceFormDefinition(options) { const { coerceFormControls = CoerceFormControls, tsMorphTransform = utilities_1.noop, name, } = options; const interfaceName = (0, form_definition_utilities_1.GetFormDefinitionInterfaceName)(options); return (0, schematics_1.chain)([ (0, ts_morph_transform_1.TsMorphAngularProjectTransformRule)(options, (project, [sourceFile]) => { const classDeclaration = (0, form_definition_utilities_1.CoerceFormDefinitionClass)(sourceFile, options); // region add controls to interface if (!classDeclaration.getImplements().some(implement => implement.getText().startsWith('FormType'))) { classDeclaration.addImplements(`FormType<${interfaceName}>`); } (0, ts_morph_1.CoerceImports)(sourceFile, { namedImports: ['FormType'], moduleSpecifier: '@rxap/forms', }); // endregion (0, ts_morph_1.CoercePropertyDeclaration)(classDeclaration, 'rxapFormGroup').set({ type: `RxapFormGroup<${interfaceName}>`, hasExclamationToken: true, isReadonly: true, scope: ts_morph_2.Scope.Public, }); (0, ts_morph_1.CoerceImports)(sourceFile, { namedImports: ['RxapFormGroup'], moduleSpecifier: '@rxap/forms', }); coerceFormControls(sourceFile, classDeclaration, interfaceName, options); // region add class decorators (0, ts_morph_1.CoerceDecorator)(classDeclaration, 'RxapForm', { arguments: [w => w.quote(name)] }); (0, ts_morph_1.CoerceImports)(sourceFile, { namedImports: ['RxapForm'], moduleSpecifier: '@rxap/forms', }); (0, ts_morph_1.CoerceDecorator)(classDeclaration, 'Injectable', { arguments: [] }); (0, ts_morph_1.CoerceImports)(sourceFile, { namedImports: ['Injectable'], moduleSpecifier: '@angular/core', }); // endregion tsMorphTransform(sourceFile, classDeclaration); }, [(0, form_definition_utilities_1.GetFormDefinitionFilePath)(options)]), (0, coerce_form_definition_type_1.CoerceFormDefinitionTypeRule)(options), ]); } //# sourceMappingURL=coerce-form-definition.js.map