generated from atomicpages/ts-starter
/
index.ts
101 lines (90 loc) · 2.48 KB
/
index.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import path from 'path';
import { promisify } from 'util';
import Glob from 'glob';
import {
withCustomConfig,
ParserOptions,
ComponentDoc,
FileParser,
withCompilerOptions,
withDefaultConfig,
} from 'react-docgen-typescript';
import { Plugin, DocusaurusContext, RouteConfig } from '@docusaurus/types';
import { CompilerOptions } from 'typescript';
const glob = promisify(Glob);
type Route = Pick<RouteConfig, 'exact' | 'component' | 'path' | 'priority'>;
type Union =
| {
global?: undefined | false;
route: Route;
}
| {
global: boolean;
route?: Route;
};
type Options = Union & {
src: string | string[];
tsConfig?: string;
compilerOptions?: CompilerOptions;
parserOptions?: ParserOptions;
};
const getParser = (
config?: Options['tsConfig'],
options?: Options['compilerOptions'],
parserOptions?: Options['parserOptions']
): FileParser['parse'] => {
if (config) {
return withCustomConfig(config, parserOptions).parse;
} else if (options) {
return withCompilerOptions(options, parserOptions).parse;
}
return withDefaultConfig(parserOptions).parse;
};
export default function plugin(
context: DocusaurusContext,
{ src, global = false, route, tsConfig, compilerOptions, parserOptions }: Options
): Plugin<ComponentDoc[]> {
return {
name: 'docusaurus-plugin-react-docgen-typescript',
async loadContent() {
return getParser(
tsConfig,
compilerOptions,
parserOptions
)(await glob(Array.isArray(src) ? `{${src.join(',')}}` : src));
},
configureWebpack(config) {
return {
resolve: {
alias: {
'@docgen': path.join(
config.resolve.alias['@generated'],
'docusaurus-plugin-react-docgen-typescript',
'default'
),
},
},
};
},
async contentLoaded({ content, actions }): Promise<void> {
const { createData, setGlobalData, addRoute } = actions;
if (global) {
console.warn(
'Using global data can potentially slow down your entire app. Use with care ❤️'
);
setGlobalData(content);
} else if (route) {
addRoute({
...route,
modules: {
docgen: await createData('docgen.json', JSON.stringify(content)),
},
});
} else {
content.map(component =>
createData(`${component.displayName}.json`, JSON.stringify(component.props))
);
}
},
};
}