@storybook/addon-svelte-csf
Version:
Allows to write stories in Svelte syntax
61 lines (60 loc) • 2.49 kB
JavaScript
import { print } from 'esrap';
import MagicString from 'magic-string';
import { createExportOrderVariableDeclaration } from './appendix/create-export-order.js';
import { createRuntimeStoriesImport } from './appendix/create-import.js';
import { createVariableFromRuntimeStoriesCall } from './appendix/create-variable-from-runtime-stories-call.js';
import { createNamedExportStories } from './appendix/create-named-export-stories.js';
import { STORYBOOK_META_IDENTIFIER } from '../../constants.js';
import { createASTIdentifier } from '../../parser/ast.js';
import { getStoriesIdentifiers } from '../../parser/analyse/story/attributes/identifiers.js';
import { createRuntimeStoryVariableDeclaration } from './appendix/create-runtime-story-variable-declaration.js';
export async function createAppendix(params) {
const { code, nodes, filename } = params;
const { compiled, svelte } = nodes;
const { storiesFunctionDeclaration } = compiled;
const storiesIdentifiers = getStoriesIdentifiers({
nodes: svelte,
filename,
});
const variableFromRuntimeStoriesCall = createVariableFromRuntimeStoriesCall({
storiesFunctionDeclaration,
filename,
});
const storiesVariableDeclarations = storiesIdentifiers.map(({ exportName }, idx) => createRuntimeStoryVariableDeclaration({
exportName,
filename,
nodes: {
variable: variableFromRuntimeStoriesCall,
tags: getStoryTags({
storyComponents: params.nodes.svelte.storyComponents,
idx,
}),
},
}));
const appendix = print({
type: 'Program',
sourceType: 'module',
body: [
createRuntimeStoriesImport(),
variableFromRuntimeStoriesCall,
createExportDefaultMeta(),
createExportOrderVariableDeclaration({ storiesIdentifiers, filename }),
...storiesVariableDeclarations,
createNamedExportStories({ storiesIdentifiers }),
],
});
code.append('\n' + appendix.code);
}
function createExportDefaultMeta() {
return {
type: 'ExportDefaultDeclaration',
declaration: createASTIdentifier(STORYBOOK_META_IDENTIFIER),
};
}
function getStoryTags(params) {
const storyComponent = params.storyComponents[params.idx];
const tags = storyComponent.component.attributes.find((a) => a.name === 'tags');
if (!tags)
return;
return tags.value.expression;
}