1 | import {dirname, basename} from 'path'
|
2 | import {readFile} from 'fs'
|
3 | import {transform} from 'babel-core'
|
4 | import {promisify} from 'bluebird'
|
5 | import {write} from './write'
|
6 | import mkdirp from 'mkdirp'
|
7 | import {parse} from './importResolve'
|
8 |
|
9 | const babelOptions = {
|
10 | babelrc: false,
|
11 | ignore: null,
|
12 | sourceMaps: true
|
13 | }
|
14 |
|
15 | const babelPlugins = [
|
16 | 'syntax-async-generators',
|
17 | 'syntax-class-properties',
|
18 | 'syntax-decorators',
|
19 | 'syntax-do-expressions',
|
20 | 'syntax-export-extensions',
|
21 | 'syntax-function-bind',
|
22 | 'syntax-function-sent',
|
23 | 'syntax-object-rest-spread'
|
24 | ]
|
25 |
|
26 | const babelPresets = [
|
27 | ]
|
28 |
|
29 | function babelrc (options = {}, plugins = [], presets = []) {
|
30 | const result = Object.assign({}, babelOptions, options)
|
31 | result.plugins = babelPlugins.concat(plugins)
|
32 | result.presets = babelPresets.concat(presets)
|
33 | return result
|
34 | }
|
35 |
|
36 | const importResolveOptions = {}
|
37 |
|
38 | const stages = [
|
39 | {
|
40 |
|
41 |
|
42 | plugins: ['transform-node-env-inline'],
|
43 |
|
44 |
|
45 |
|
46 | presets: ['react']
|
47 | },
|
48 |
|
49 |
|
50 | {plugins: ['minify-dead-code-elimination']},
|
51 |
|
52 |
|
53 | {plugins: ['transform-commonjs-es2015-modules']},
|
54 |
|
55 |
|
56 | {plugins: [['transform-import-resolve', importResolveOptions]]},
|
57 |
|
58 |
|
59 | {plugins: ['transform-es2015-modules-systemjs']},
|
60 |
|
61 |
|
62 | {presets: ['latest', 'stage-0', 'babili']}
|
63 | ]
|
64 |
|
65 | export async function processFile (file, output, destination) {
|
66 | importResolveOptions.parse = parse(file, output, destination)
|
67 |
|
68 | let code = await promisify(readFile)(file, 'utf8')
|
69 | let map = null
|
70 |
|
71 | for (const {plugins, presets} of stages) {
|
72 | ({code, map} = transform(code, babelrc({
|
73 | filename: file,
|
74 | inputSourceMap: map
|
75 | }, plugins, presets)))
|
76 | }
|
77 |
|
78 | await promisify(mkdirp)(dirname(output))
|
79 | await Promise.all([
|
80 | write(code + '\n//# sourceMappingURL=' + basename(output) + '.map', output),
|
81 | write(JSON.stringify(map), output + '.map')
|
82 | ])
|
83 | }
|