1 | const { format } = require('prettier')
|
2 | const { transform } = require('babel-core')
|
3 | const createIndex = require('./createIndex')
|
4 | const templates = require('./templates')
|
5 | const composite = require('./templates/composite')
|
6 | const {
|
7 | stringifyObject,
|
8 | getExtensionImport,
|
9 | getComp,
|
10 | getSystemFuncs
|
11 | } = require('./templates/util')
|
12 |
|
13 | const compile = code =>
|
14 | transform(code, {
|
15 | presets: [
|
16 | require('babel-preset-env'),
|
17 | require('babel-preset-stage-0'),
|
18 | require('babel-preset-react')
|
19 | ]
|
20 | }).code
|
21 |
|
22 | const parse = conf =>
|
23 | Object.assign({}, conf, {
|
24 | systemFunctions: getSystemFuncs(conf.system || []),
|
25 | extensionImport: getExtensionImport(conf.type),
|
26 | type: getComp(conf.type || 'div'),
|
27 | style: stringifyObject(conf.style || {}),
|
28 | props: stringifyObject(conf.props || {})
|
29 | })
|
30 |
|
31 | module.exports = (config, options = {}) => {
|
32 | const components = Array.isArray(config) ? config : config.components
|
33 | const { library = 'styled-components', harmony } = options
|
34 |
|
35 | const template = templates[library] || templates['styled-components']
|
36 |
|
37 | const index = {
|
38 | name: 'index',
|
39 | module: harmony ? createIndex(components) : compile(createIndex(components))
|
40 | }
|
41 |
|
42 | const mods = components.map(conf => {
|
43 | const parsed = parse(conf)
|
44 | const code = isComposite(parsed) ? composite(parsed) : template(parsed)
|
45 | const mod = harmony
|
46 | ? format(code, {
|
47 | semi: false,
|
48 | singleQuote: true
|
49 | })
|
50 | : compile(code)
|
51 |
|
52 | return {
|
53 | name: conf.name,
|
54 | module: mod
|
55 | }
|
56 | })
|
57 |
|
58 | return [index, ...mods]
|
59 | }
|
60 |
|
61 | const isComposite = comp => comp.imports && comp.jsx
|