@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
JavaScript
;
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