forked from storybookjs/storybook
-
Notifications
You must be signed in to change notification settings - Fork 0
/
processCSFFile.ts
72 lines (61 loc) 路 2.39 KB
/
processCSFFile.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import type { Parameters, AnyFramework, ComponentTitle } from '@storybook/csf';
import { isExportStory } from '@storybook/csf';
import { logger } from '@storybook/client-logger';
import { normalizeStory } from './normalizeStory';
import { normalizeComponentAnnotations } from './normalizeComponentAnnotations';
import type { ModuleExports, CSFFile, NormalizedComponentAnnotations, Path } from '../types';
const checkGlobals = (parameters: Parameters) => {
const { globals, globalTypes } = parameters;
if (globals || globalTypes) {
logger.error(
'Global args/argTypes can only be set globally',
JSON.stringify({
globals,
globalTypes,
})
);
}
};
const checkStorySort = (parameters: Parameters) => {
const { options } = parameters;
if (options?.storySort) logger.error('The storySort option parameter can only be set globally');
};
const checkDisallowedParameters = (parameters: Parameters) => {
if (!parameters) {
return;
}
checkGlobals(parameters);
checkStorySort(parameters);
};
// Given the raw exports of a CSF file, check and normalize it.
export function processCSFFile<TFramework extends AnyFramework>(
moduleExports: ModuleExports,
importPath: Path,
title: ComponentTitle
): CSFFile<TFramework> {
const { default: defaultExport, __namedExportsOrder, ...namedExports } = moduleExports;
let exports = namedExports;
const meta: NormalizedComponentAnnotations<TFramework> =
normalizeComponentAnnotations<TFramework>(defaultExport, title, importPath);
checkDisallowedParameters(meta.parameters);
// prefer a user/loader provided `__namedExportsOrder` array if supplied
// we do this as es module exports are always ordered alphabetically
// see https://github.com/storybookjs/storybook/issues/9136
// This directly affects the order of stories in the docs view and in folders on the sidebar.
if (Array.isArray(__namedExportsOrder)) {
exports = {};
__namedExportsOrder.forEach((name) => {
const namedExport = namedExports[name];
if (namedExport) exports[name] = namedExport;
});
}
const csfFile: CSFFile<TFramework> = { meta, stories: {} };
Object.keys(exports).forEach((key) => {
if (isExportStory(key, meta)) {
const storyMeta = normalizeStory(key, exports[key], meta);
checkDisallowedParameters(storyMeta.parameters);
csfFile.stories[storyMeta.id] = storyMeta;
}
});
return csfFile;
}