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; }); };