UNPKG

4.25 kBJavaScriptView Raw
1var debug = require('debug')('compiled')
2var la = require('lazy-ass')
3var is = require('check-more-types')
4var utils = require('./utils')
5var findES6Support = require('./find-es-support')
6var getConfig = require('./get-config')
7var fs = require('fs')
8var babelMapping = require('es-features-to-babel-plugins')
9la(is.object(babelMapping), 'expected object with mapping', babelMapping)
10
11function transpile (supportedFeatures, neededFeatures, inputFilename, outputFilename,
12 babelPolyfillModuleName) {
13 var plugins = [] // plugin names
14 // for now always include polyfill,
15 // because hard to detect all edge cases when new methods are used
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
80function 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
97var build = require('./build')
98
99function 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
107function 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
124function 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
145module.exports = compile