1 | var debug = require('debug')('compiled')
|
2 | var la = require('lazy-ass')
|
3 | var is = require('check-more-types')
|
4 | var utils = require('./utils')
|
5 | var findES6Support = require('./find-es-support')
|
6 | var getConfig = require('./get-config')
|
7 | var fs = require('fs')
|
8 | var babelMapping = require('es-features-to-babel-plugins')
|
9 | la(is.object(babelMapping), 'expected object with mapping', babelMapping)
|
10 |
|
11 | function transpile (supportedFeatures, neededFeatures, inputFilename, outputFilename,
|
12 | babelPolyfillModuleName) {
|
13 | var plugins = []
|
14 |
|
15 |
|
16 | var addBabelPolyfill = true
|
17 |
|
18 | function addUniquePlugin (name) {
|
19 | if (!name) {
|
20 | return
|
21 | }
|
22 | if (plugins.indexOf(name) === -1) {
|
23 | plugins.push(name)
|
24 | }
|
25 | }
|
26 |
|
27 | function addPlugin (names) {
|
28 | if (names === babelMapping.INCLUDE_BABEL_POLYFILL) {
|
29 | addBabelPolyfill = true
|
30 | return
|
31 | }
|
32 |
|
33 | if (typeof names === 'string') {
|
34 | return addUniquePlugin(names)
|
35 | }
|
36 | if (Array.isArray(names)) {
|
37 | names.forEach(addPlugin)
|
38 | }
|
39 | }
|
40 |
|
41 | neededFeatures.forEach(function (feature) {
|
42 | if (!supportedFeatures[feature]) {
|
43 | var needPlugins = babelMapping[feature]
|
44 | if (!needPlugins) {
|
45 | console.log('WARNING: feature', feature, 'is not handled')
|
46 | return
|
47 | }
|
48 | addPlugin(needPlugins)
|
49 | }
|
50 | })
|
51 |
|
52 | debug('using plugins', plugins)
|
53 |
|
54 | var babel = require('babel-core')
|
55 | var options = {
|
56 | plugins: plugins
|
57 | }
|
58 |
|
59 | return new Promise(function (resolve, reject) {
|
60 | babel.transformFile(inputFilename, options, function (err, result) {
|
61 | debug('transformed file', inputFilename, 'was there an error?', err)
|
62 | if (err) {
|
63 | return reject(err)
|
64 | }
|
65 |
|
66 | var output = result.code
|
67 | if (addBabelPolyfill) {
|
68 | debug('adding Babel polyfill require')
|
69 | output = utils.addBabelRequire(output, babelPolyfillModuleName)
|
70 | }
|
71 | output = utils.finishTextWithEndline(output)
|
72 |
|
73 | require('fs').writeFileSync(outputFilename, output, 'utf-8')
|
74 | debug('saved file', outputFilename)
|
75 | resolve(outputFilename)
|
76 | })
|
77 | })
|
78 | }
|
79 |
|
80 | function compileBundle (es6results, inputFilename, esFeaturesFilename, outputFilename,
|
81 | moduleWithBabelPolyfill) {
|
82 | la(is.unemptyString(inputFilename), 'missing input filename')
|
83 | la(is.unemptyString(outputFilename), 'missing output filename')
|
84 |
|
85 | var name = utils.bundleName(inputFilename)
|
86 |
|
87 | var es6features = JSON.parse(fs.readFileSync(esFeaturesFilename, 'utf-8'))
|
88 | la(is.array(es6features),
|
89 | 'expected list of features from', esFeaturesFilename,
|
90 | 'got', es6features)
|
91 | debug('%s needs es6 features', name, es6features)
|
92 |
|
93 | return transpile(es6results,
|
94 | es6features, inputFilename, outputFilename, moduleWithBabelPolyfill)
|
95 | }
|
96 |
|
97 | var build = require('./build')
|
98 |
|
99 | function anyMissingBuiltFiles (config) {
|
100 | return config.files.some(function (filename) {
|
101 | var filenames = utils.formFilenames(config, filename)
|
102 | return !fs.existsSync(filenames.built) ||
|
103 | !fs.existsSync(filenames.features)
|
104 | })
|
105 | }
|
106 |
|
107 | function compileBuiltFiles (config, esFeatures) {
|
108 | la(is.object(esFeatures), 'missing supported ES6 features',
|
109 | 'config', config, 'es6 features', esFeatures)
|
110 |
|
111 | var promises = config.files.map(function (filename) {
|
112 | var filenames = utils.formFilenames(config, filename)
|
113 |
|
114 | debug('%s and %s => %s',
|
115 | filenames.built, filenames.features, filenames.compiled)
|
116 |
|
117 | return compileBundle(esFeatures,
|
118 | filenames.built, filenames.features, filenames.compiled,
|
119 | config.moduleWithBabelPolyfill)
|
120 | })
|
121 | return Promise.all(promises)
|
122 | }
|
123 |
|
124 | function compile (options) {
|
125 | var config = is.object(options) ? options : getConfig()
|
126 | debug('found %d files to compile', config.files.length)
|
127 |
|
128 | var start = Promise.resolve(true)
|
129 | if (anyMissingBuiltFiles(config)) {
|
130 | console.log('missing build bundles, building ...')
|
131 | start = start.then(build)
|
132 | } else {
|
133 | debug('all built bundles are present')
|
134 | }
|
135 |
|
136 | var environmentESFeatures = is.object(config.esFeatures)
|
137 | ? Promise.resolve.bind(Promise, options.esFeatures)
|
138 | : findES6Support
|
139 |
|
140 | return start
|
141 | .then(environmentESFeatures)
|
142 | .then(compileBuiltFiles.bind(null, config))
|
143 | }
|
144 |
|
145 | module.exports = compile
|