@storybook/addon-svelte-csf
Version:
Allows to write stories in Svelte syntax
103 lines (102 loc) • 3.75 kB
JavaScript
import { findASTPropertyIndex, findPropertyDescriptionIndex, findPropertyDocsIndex, findPropertyParametersIndex, getDescriptionPropertyValue, getDocsPropertyValue, getParametersPropertyValue, } from '../shared/parameters.js';
import { createASTObjectExpression, createASTProperty } from '../../../parser/ast.js';
import { getDefineMetaFirstArgumentObjectExpression } from '../../../parser/extract/svelte/define-meta.js';
/**
* This function inserts parameters to `defineMeta()`.
* Attempt to insert JSDoc comment above the `defineMeta()` call.
*
* Before:
*
* ```js
* // Some description about the component
* const { Story } = defineMeta({});
* ```
*
* After:
* ```js
* // Some description about the component
* const { Story } = defineMeta({
* parameters: {
* docs: {
* description: { component: "Some description about the component" },
* },
* },
* });
* ```
*/
export function insertDefineMetaParameters(params) {
const { nodes, filename } = params;
if (!nodes.svelte.defineMetaVariableDeclaration.leadingComments) {
return;
}
const defineMetaFirstArgumentObjectExpression = getDefineMetaFirstArgumentObjectExpression({
nodes: nodes.compiled,
filename,
});
if (findPropertyParametersIndex({
filename,
node: defineMetaFirstArgumentObjectExpression,
}) === -1) {
defineMetaFirstArgumentObjectExpression.properties.push(createASTProperty('parameters', createASTObjectExpression()));
}
if (findPropertyDocsIndex({
filename,
node: defineMetaFirstArgumentObjectExpression,
}) === -1) {
getParametersPropertyValue({
filename,
node: defineMetaFirstArgumentObjectExpression,
}).properties.push(createASTProperty('docs', createASTObjectExpression()));
}
if (findPropertyDescriptionIndex({
filename,
node: defineMetaFirstArgumentObjectExpression,
}) === -1) {
getDocsPropertyValue({
filename,
node: defineMetaFirstArgumentObjectExpression,
}).properties.push(createASTProperty('description', createASTObjectExpression()));
}
if (findASTPropertyIndex({
name: 'component',
node: getDescriptionPropertyValue({
filename,
node: defineMetaFirstArgumentObjectExpression,
}),
}) !== -1) {
console.warn(`Svelte CSF:
Description was already set in parameters.docs.description.component,
ignoring JSDoc comment above defineMeta() in:
${filename}`);
return;
}
getDescriptionPropertyValue({
filename,
node: defineMetaFirstArgumentObjectExpression,
}).properties.push(createASTProperty('component', {
type: 'Literal',
value: extractDescription(nodes.svelte.defineMetaVariableDeclaration.leadingComments),
}));
}
/**
* Adopted from: https://github.com/storybookjs/storybook/blob/next/code/lib/csf-tools/src/enrichCsf.ts/#L148-L164
* Adjusted for this addon, because here we use AST format from `estree`, not `babel`.
*/
function extractDescription(leadingComments) {
const comments = leadingComments
.map((comment) => {
if (comment.type === 'Line' ||
// is not a JSDoc format - `/**` - by default parser omits the leading `/*` and ending `*/`
!comment.value.startsWith('*')) {
return null;
}
return (comment.value
.split('\n')
// remove leading *'s and spaces from the beginning of each line
.map((line) => line.replace(/^(\s+)?(\*+)?(\s)?/, ''))
.join('\n')
.trim());
})
.filter(Boolean);
return comments.join('\n');
}