iwmlib/3rdparty/systemjs/plugin-babel.js
2019-03-21 09:57:27 +01:00

223 lines
7.9 KiB
JavaScript
Executable File

var babel = require('systemjs-babel-build').babel;
// the SystemJS babel build includes standard presets
var es2015 = require('systemjs-babel-build').presetES2015;
var es2015Register = require('systemjs-babel-build').presetES2015Register;
var modulesRegister = require('systemjs-babel-build').modulesRegister;
var stage3 = require('systemjs-babel-build').pluginsStage3;
var stage2 = require('systemjs-babel-build').pluginsStage2;
var stage1 = require('systemjs-babel-build').pluginsStage1;
var react = require('systemjs-babel-build').pluginsReact;
var externalHelpers = require('systemjs-babel-build').externalHelpers;
var runtimeTransform = require('systemjs-babel-build').runtimeTransform;
var babelRuntimePath;
var modularHelpersPath = System.decanonicalize('./babel-helpers/', module.id);
var externalHelpersPath = System.decanonicalize('./babel-helpers.js', module.id);
var regeneratorRuntimePath = System.decanonicalize('./regenerator-runtime.js', module.id);
if (modularHelpersPath.substr(modularHelpersPath.length - 3, 3) == '.js')
modularHelpersPath = modularHelpersPath.substr(0, modularHelpersPath.length - 3);
// in builds we want to embed canonical names to helpers
if (System.getCanonicalName) {
modularHelpersPath = System.getCanonicalName(modularHelpersPath);
externalHelpersPath = System.getCanonicalName(externalHelpersPath);
regeneratorRuntimePath = System.getCanonicalName(regeneratorRuntimePath);
}
// disable SystemJS runtime detection
SystemJS._loader.loadedTranspilerRuntime = true;
function prepend(a, b) {
for (var p in b)
if (!(p in a))
a[p] = b[p];
return a;
}
/*
* babelOptions:
* modularRuntime: true / false (whether to use babel-runtime or babel/external-helpers respectively)
* sourceMaps: true / false (defaults to true)
* es2015: true / false (defaults to true)
* stage3: true / false (defaults to true)
* stage2: true / false (defaults to true)
* stage1: true / false (defaults to false)
* react: true / false (defaults to false)
* plugins: array of custom plugins (objects or module name strings)
* presets: array of custom presets (objects or module name strings)
* compact: as in Babel
* comments: as in Babel
*
* babelOptions can be set at SystemJS.babelOptions OR on the metadata object for a given module
*/
var defaultBabelOptions = {
modularRuntime: true,
sourceMaps: true,
es2015: true,
stage3: true,
stage2: true,
stage1: false,
react: false,
compact: false,
comments: true
};
exports.translate = function(load, traceOpts) {
// we don't transpile anything other than CommonJS or ESM
if (load.metadata.format == 'global' || load.metadata.format == 'amd' || load.metadata.format == 'json')
throw new TypeError('plugin-babel cannot transpile ' + load.metadata.format + ' modules. Ensure "' + load.name + '" is configured not to use this loader.');
var loader = this;
var pluginLoader = loader.pluginLoader || loader;
// we only output ES modules when running in the builder
var outputESM = traceOpts ? traceOpts.outputESM : loader.builder;
var babelOptions = {};
if (load.metadata.babelOptions)
prepend(babelOptions, load.metadata.babelOptions);
if (loader.babelOptions)
prepend(babelOptions, loader.babelOptions);
prepend(babelOptions, defaultBabelOptions);
// determine any plugins or preset strings which need to be imported as modules
var pluginAndPresetModuleLoads = [];
if (babelOptions.presets)
babelOptions.presets.forEach(function(preset) {
if (typeof preset == 'string')
pluginAndPresetModuleLoads.push(pluginLoader['import'](preset, module.id));
});
if (babelOptions.plugins)
babelOptions.plugins.forEach(function(plugin) {
plugin = typeof plugin == 'string' ? plugin : Array.isArray(plugin) && typeof plugin[0] == 'string' && plugin[0];
if (!plugin)
return;
pluginAndPresetModuleLoads.push(pluginLoader.import(plugin, module.id).then(function (m) {
return m.default || m;
}));
});
return Promise.all(pluginAndPresetModuleLoads)
.then(function(pluginAndPresetModules) {
var curPluginOrPresetModule = 0;
var presets = [];
var plugins = [];
if (babelOptions.modularRuntime) {
if (load.metadata.format == 'cjs')
throw new TypeError('plugin-babel does not support modular runtime for CJS module transpilations. Set babelOptions.modularRuntime: false if needed.');
presets.push(runtimeTransform);
}
else {
if (load.metadata.format == 'cjs')
load.source = 'var babelHelpers = require("' + externalHelpersPath + '");' + load.source;
else
load.source = 'import babelHelpers from "' + externalHelpersPath + '";' + load.source;
presets.push(externalHelpers);
}
if (babelOptions.es2015)
presets.push((outputESM || load.metadata.format == 'cjs') ? es2015 : es2015Register);
else if (!(outputESM || load.metadata.format == 'cjs'))
presets.push(modulesRegister);
if (babelOptions.stage3)
presets.push({
plugins: stage3
});
if (babelOptions.stage2)
presets.push({
plugins: stage2
});
if (babelOptions.stage1)
presets.push({
plugins: stage1
});
if (babelOptions.react)
presets.push({
plugins: react
});
if (babelOptions.presets)
babelOptions.presets.forEach(function(preset) {
if (typeof preset == 'string')
presets.push(pluginAndPresetModules[curPluginOrPresetModule++]);
else
presets.push(preset);
});
if (babelOptions.plugins)
babelOptions.plugins.forEach(function(plugin) {
if (typeof plugin == 'string')
plugins.push(pluginAndPresetModules[curPluginOrPresetModule++]);
else if (Array.isArray(plugin) && typeof plugin[0] == 'string')
plugins.push([pluginAndPresetModules[curPluginOrPresetModule++], plugin[1]]);
else
plugins.push(plugin);
});
var output = babel.transform(load.source, {
babelrc: false,
plugins: plugins,
presets: presets,
filename: load.address,
sourceFileName: load.address,
moduleIds: false,
sourceMaps: traceOpts && traceOpts.sourceMaps || babelOptions.sourceMaps,
inputSourceMap: load.metadata.sourceMap,
compact: babelOptions.compact,
comments: babelOptions.comments,
code: true,
ast: true,
resolveModuleSource: function(m) {
if (m.substr(0, 22) == 'babel-runtime/helpers/') {
m = modularHelpersPath + m.substr(22) + '.js';
}
else if (m == 'babel-runtime/regenerator') {
m = regeneratorRuntimePath;
}
else if (m.substr(0, 14) == 'babel-runtime/') {
if (!babelRuntimePath) {
babelRuntimePath = System.decanonicalize('babel-runtime/', module.id);
if (babelRuntimePath[babelRuntimePath.length - 1] !== '/')
babelRuntimePath += '/';
if (babelRuntimePath.substr(babelRuntimePath.length - 3, 3) == '.js')
babelRuntimePath = babelRuntimePath.substr(0, babelRuntimePath.length - 3);
if (loader.getCanonicalName)
babelRuntimePath = loader.getCanonicalName(babelRuntimePath);
if (babelRuntimePath == 'babel-runtime/')
throw new Error('The babel-runtime module must be mapped to support modular helpers and builtins. If using jspm run jspm install npm:babel-runtime.');
}
m = babelRuntimePath + m.substr(14) + '.js';
}
return m;
}
});
// add babelHelpers as a dependency for non-modular runtime
if (!babelOptions.modularRuntime)
load.metadata.deps.push(externalHelpersPath);
// set output module format
// (in builder we output modules as esm)
if (!load.metadata.format || load.metadata.format == 'detect' || load.metadata.format == 'esm')
load.metadata.format = outputESM ? 'esm' : 'register';
load.metadata.sourceMap = output.map;
return output.code;
});
};