UNPKG

@storybook/addon-svelte-csf

Version:
103 lines (102 loc) 3.75 kB
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'); }