UNPKG

2.27 kBJavaScriptView Raw
1import {dirname, basename} from 'path'
2import {readFile} from 'fs'
3import {transform} from 'babel-core'
4import {promisify} from 'bluebird'
5import {write} from './write'
6import mkdirp from 'mkdirp'
7import {parse} from './importResolve'
8
9const babelOptions = {
10 babelrc: false,
11 ignore: null,
12 sourceMaps: true
13}
14
15const 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
26const babelPresets = [
27]
28
29function 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
36const importResolveOptions = {}
37
38const stages = [
39 {
40 // Inline NODE_ENV ("development"/"production")
41 // Must run before minify-dead-code-elimination
42 plugins: ['transform-node-env-inline'],
43 // {plugins: ['transform-inline-environment-variables']},
44
45 // Parse and transform JSX/Flow
46 presets: ['react']
47 },
48
49 // Get rid of require() calls that are not used in the current prod/dev environment
50 {plugins: ['minify-dead-code-elimination']},
51
52 // Transform CommonJS to ES2015 modules
53 {plugins: ['transform-commonjs-es2015-modules']},
54
55 // Trace all import sources
56 {plugins: [['transform-import-resolve', importResolveOptions]]},
57
58 // Transform ES2015 modules to SystemJS for client-side asynchronous loading
59 {plugins: ['transform-es2015-modules-systemjs']},
60
61 // Transform to minified ES5 code
62 {presets: ['latest', 'stage-0', 'babili']}
63]
64
65export 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}