-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrender.ts
69 lines (61 loc) · 1.77 KB
/
render.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
import * as t from '@babel/types';
import generate from '@babel/generator';
import pkg from 'npm-pkg-json';
import prettier from 'prettier';
import reconciler from './reconciler';
import dev from './dev';
import { BundleType, Options } from './types';
import { File } from './elements';
import { updateContext } from './context';
export function renderAst(
jsx: JSX.Element,
options: Options = {},
ast: t.File = t.file(t.program([]), [], [])
): t.File {
updateContext({ parserOptions: options.parserOptions || {} });
// create root element
// a root node is already injected by this element constructor
const rootElement = new File();
rootElement.node = ast;
// create root fiber
const root = reconciler.createContainer(rootElement, false, false);
// reconcile virtual dom
reconciler.updateContainer(jsx, root, null, () => {});
// add dev tools support
reconciler.injectIntoDevTools({
bundleType: Number(dev) as BundleType,
rendererPackageName: pkg.name,
version: pkg.version
});
// return rendered result (not required for side effect renderers)
// in this case the rendered result is the node itself
return rootElement.node as t.File;
}
export function render(
element: JSX.Element,
options: Options = {},
ast: t.File = t.file(t.program([]), [], [])
): string {
options = {
prettier: true,
...options
};
if (options.prettier === true) options.prettier = {};
if (options.prettier) {
options.prettier = {
parser: 'babel',
...options.prettier
};
}
const { code } = generate(
renderAst(element, options, ast),
options.generatorOptions || {}
);
if (options.prettier) {
return prettier.format(
code,
typeof options.prettier === 'boolean' ? {} : options.prettier
);
}
return code;
}