@rxap/ts-morph
Version:
Provides utilities for manipulating TypeScript code using the ts-morph library. It offers a fluent API to add, modify, and remove code elements such as classes, decorators, imports, and properties in both Angular and NestJS projects. This package simplifi
67 lines • 3.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CoerceStories = CoerceStories;
const utilities_1 = require("@rxap/utilities");
const ts_morph_1 = require("ts-morph");
const coerce_imports_1 = require("../coerce-imports");
const coerce_property_assignment_1 = require("../coerce-property-assignment");
const coerce_variable_declaration_1 = require("../coerce-variable-declaration");
function CoerceStories(sourceFile, options) {
const { feature, componentName, moduleMetadata, parentTitle } = options;
(0, coerce_imports_1.CoerceImports)(sourceFile, [
{
moduleSpecifier: '@storybook/angular',
namedImports: ['Meta', 'StoryObj']
},
{
moduleSpecifier: `./${(0, utilities_1.dasherize)(componentName)}.component`,
namedImports: [`${(0, utilities_1.classify)(componentName)}Component`]
}
]);
let title = (0, utilities_1.classify)(componentName);
if (parentTitle) {
title = `${parentTitle} / ${title}`;
}
else if (feature) {
title = `${(0, utilities_1.classify)(feature)} / ${title}`;
}
const meta = {
component: `${(0, utilities_1.classify)(componentName)}Component`,
title: w => w.quote(title),
};
if (moduleMetadata) {
meta['decorators'] = w => {
w.writeLine('[');
w.writeLine(' moduleMetadata({})');
w.newLine();
w.write(']');
};
(0, coerce_imports_1.CoerceImports)(sourceFile, {
moduleSpecifier: '@storybook/angular',
namedImports: ['moduleMetadata']
});
}
const metaDeclaration = (0, coerce_variable_declaration_1.CoerceVariableDeclaration)(sourceFile, 'meta', {
type: `Meta<${(0, utilities_1.classify)(componentName)}Component>`,
initializer: ts_morph_1.Writers.object(meta)
}, { isExported: false });
if (!sourceFile.getStatement(s => s.getText().includes('export default meta;'))) {
sourceFile.addStatements(`export default meta;`);
}
if (!sourceFile.getStatement(s => s.getText().includes('type Story = StoryObj<'))) {
sourceFile.addStatements(`type Story = StoryObj<${(0, utilities_1.classify)(componentName)}Component>;`);
}
(0, coerce_variable_declaration_1.CoerceVariableDeclaration)(sourceFile, 'Primary', {
type: `Story`,
initializer: ts_morph_1.Writers.object({ args: '{}' })
});
if (moduleMetadata) {
const initializer = metaDeclaration.getInitializerIfKindOrThrow(ts_morph_1.SyntaxKind.ObjectLiteralExpression);
const decoratorsProperty = (0, coerce_property_assignment_1.CoercePropertyAssignment)(initializer, 'decorators', '[ moduleMetadata({}) ]');
const decoratorsInitializer = decoratorsProperty.getInitializerIfKindOrThrow(ts_morph_1.SyntaxKind.ArrayLiteralExpression);
const moduleMetadataFunction = decoratorsInitializer.getElements().find(e => e.isKind(ts_morph_1.SyntaxKind.CallExpression));
const firstArgument = moduleMetadataFunction.getArguments()[0].asKindOrThrow(ts_morph_1.SyntaxKind.ObjectLiteralExpression);
moduleMetadata(firstArgument);
}
}
//# sourceMappingURL=coerce-stories.js.map