unbundle
Version:
`require()` and `import`/`export` in the browser, without the bundling
84 lines (67 loc) • 2.27 kB
JavaScript
import {dirname, basename} from 'path'
import {readFile} from 'fs'
import {transform} from 'babel-core'
import {promisify} from 'bluebird'
import {write} from './write'
import mkdirp from 'mkdirp'
import {parse} from './importResolve'
const babelOptions = {
babelrc: false,
ignore: null,
sourceMaps: true
}
const babelPlugins = [
'syntax-async-generators',
'syntax-class-properties',
'syntax-decorators',
'syntax-do-expressions',
'syntax-export-extensions',
'syntax-function-bind',
'syntax-function-sent',
'syntax-object-rest-spread'
]
const babelPresets = [
]
function babelrc (options = {}, plugins = [], presets = []) {
const result = Object.assign({}, babelOptions, options)
result.plugins = babelPlugins.concat(plugins)
result.presets = babelPresets.concat(presets)
return result
}
const importResolveOptions = {}
const stages = [
{
// Inline NODE_ENV ("development"/"production")
// Must run before minify-dead-code-elimination
plugins: ['transform-node-env-inline'],
// {plugins: ['transform-inline-environment-variables']},
// Parse and transform JSX/Flow
presets: ['react']
},
// Get rid of require() calls that are not used in the current prod/dev environment
{plugins: ['minify-dead-code-elimination']},
// Transform CommonJS to ES2015 modules
{plugins: ['transform-commonjs-es2015-modules']},
// Trace all import sources
{plugins: [['transform-import-resolve', importResolveOptions]]},
// Transform ES2015 modules to SystemJS for client-side asynchronous loading
{plugins: ['transform-es2015-modules-systemjs']},
// Transform to minified ES5 code
{presets: ['latest', 'stage-0', 'babili']}
]
export async function processFile (file, output, destination) {
importResolveOptions.parse = parse(file, output, destination)
let code = await promisify(readFile)(file, 'utf8')
let map = null
for (const {plugins, presets} of stages) {
({code, map} = transform(code, babelrc({
filename: file,
inputSourceMap: map
}, plugins, presets)))
}
await promisify(mkdirp)(dirname(output))
await Promise.all([
write(code + '\n//# sourceMappingURL=' + basename(output) + '.map', output),
write(JSON.stringify(map), output + '.map')
])
}