-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
46 lines (38 loc) · 1.2 KB
/
index.js
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
const {parse} = require('@babel/parser');
const generate = require('@babel/generator').default;
const traverse = require('@babel/traverse').default;
const mdx = require('@mdx-js/mdx');
const visit = require('unist-util-visit');
let meta;
// eslint-disable-next-line unicorn/consistent-function-scoping
const extractMdxMetadata = () => (tree) => {
visit(tree, 'export', (node) => {
const ast = parse(node.value, {
plugins: ['jsx'],
sourceType: 'module',
});
traverse(ast, {
VariableDeclarator: (path) => {
if (path.node.id.name === 'meta') {
// eslint-disable-next-line no-eval, security/detect-eval-with-expression
meta = eval(`module.exports = ${generate(path.node.init).code}`);
return;
}
},
});
});
};
module.exports = async (content, options) => {
const defaultOptions = {
defaultReturnValue: {},
};
const mergedOptions = {
...defaultOptions,
...options,
};
meta = mergedOptions.defaultReturnValue;
await mdx(content, {
remarkPlugins: [extractMdxMetadata],
});
return meta;
};