/
mdx-exports.ts
78 lines (73 loc) · 2.42 KB
/
mdx-exports.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
73
74
75
76
77
78
import { MDXExportType, MDXExportTypes } from '../types';
import { stringifyObject } from './stringify-object';
const mdxPropertiesExport = (
exportType: MDXExportType,
defObject: Record<string, unknown>,
): string => {
const obj = { ...defObject, ...(exportType ? exportType.story : {}) };
return stringifyObject(obj);
};
const mdxFunctionExport = (
name: string,
exportType: MDXExportType,
): string | undefined =>
`export const ${name} = ${exportType.render ? exportType.render : '{}'}`;
export const extractStoryExports = (
storybookExports: boolean,
exports?: MDXExportTypes,
): string => {
if (exports) {
const exportNames = Object.keys(exports);
if (exportNames.length) {
let defaultExportCode = '';
if (exports.default) {
const defaults: Record<string, unknown> = {
MDXPage: new String('MDXContent'),
};
if (storybookExports) {
//docs parameters
defaults.parameters = {
docs: {
page: new String('MDXContent'),
container: new String(
'({ children }) => <React.Fragment>{children}</React.Fragment>',
),
},
};
}
const expCode = mdxPropertiesExport(exports.default, defaults);
defaultExportCode = `
const mdxDefaultExport = MDXContent;
Object.assign(mdxDefaultExport, ${expCode});
export default mdxDefaultExport;
`;
}
const expStories = Object.keys(exports).filter(id => id !== 'default');
if (expStories.length) {
const storiesExports: string[] = [];
for (const exportStory of expStories) {
const expFn = mdxFunctionExport(exportStory, exports[exportStory]);
if (expFn) {
storiesExports.push(expFn);
}
const expCode = mdxPropertiesExport(exports[exportStory], {});
if (expCode) {
storiesExports.push(`${exportStory}.story = ${expCode}
`);
}
}
return `${defaultExportCode}\n${storiesExports.join('\n')}`;
} else if (storybookExports) {
//fake page object to accoodate storybook
return `${defaultExportCode}
export const __page = () => { throw new Error("Docs-only story"); };
__page.story = { parameters: { docsOnly: true } };
`;
}
return `${defaultExportCode}`;
}
}
return `
export default { MDXPage: MDXContent };
`;
};