fix: load all Babel libs dynamically

This commit is contained in:
Oliver Eyton-Williams
2020-01-15 12:06:50 +01:00
committed by mrugesh
parent dc7092ecd1
commit 21833ab508

View File

@ -10,9 +10,6 @@ import {
stubTrue
} from 'lodash';
import * as Babel from '@babel/standalone';
import presetEnv from '@babel/preset-env';
import presetReact from '@babel/preset-react';
import protect from '@freecodecamp/loop-protect';
import * as vinyl from '../utils/polyvinyl.js';
@ -38,30 +35,49 @@ function testLoopProtectCB(line) {
);
}
Babel.registerPlugin('loopProtection', protect(protectTimeout, loopProtectCB));
// hold Babel, presets and options so we don't try to import them multiple times
let Babel;
let presetEnv, presetReact;
let babelOptionsJSBase, babelOptionsJS, babelOptionsJSX, babelOptionsJSPreview;
async function loadBabel() {
if (Babel) return;
/* eslint-disable no-inline-comments */
Babel = await import(
/* webpackChunkName: "@babel/standalone" */ '@babel/standalone'
);
presetEnv = await import(
/* webpackChunkName: "@babel/preset-env" */ '@babel/preset-env'
);
presetReact = await import(
/* webpackChunkName: "@babel/preset-react" */ '@babel/preset-react'
);
/* eslint-enable no-inline-comments */
Babel.registerPlugin(
'loopProtection',
protect(protectTimeout, loopProtectCB)
);
Babel.registerPlugin(
'testLoopProtection',
protect(testProtectTimeout, testLoopProtectCB, loopsPerTimeoutCheck)
);
const babelOptionsJSBase = {
babelOptionsJSBase = {
presets: [presetEnv]
};
const babelOptionsJSX = {
babelOptionsJSX = {
plugins: ['loopProtection'],
presets: [presetEnv, presetReact]
};
const babelOptionsJS = {
babelOptionsJS = {
...babelOptionsJSBase,
plugins: ['testLoopProtection']
};
const babelOptionsJSPreview = {
babelOptionsJSPreview = {
...babelOptionsJSBase,
plugins: ['loopProtection']
};
}
const babelTransformCode = options => code =>
Babel.transform(code, options).code;
@ -110,22 +126,26 @@ const babelTransformer = ({ preview = false, protect = true }) => {
return cond([
[
testJS,
flow(
partial(
async code => {
await loadBabel();
return partial(
vinyl.transformHeadTailAndContents,
tryTransform(babelTransformCode(options))
)
)
)(code);
}
],
[
testJSX,
flow(
async code => {
await loadBabel();
return flow(
partial(
vinyl.transformHeadTailAndContents,
tryTransform(babelTransformCode(babelOptionsJSX))
),
partial(vinyl.setExt, 'js')
)
)(code);
}
],
[stubTrue, identity]
]);
@ -142,7 +162,8 @@ async function transformSASS(element) {
);
}
function transformScript(element) {
async function transformScript(element) {
await loadBabel();
const scriptTags = element.querySelectorAll('script');
scriptTags.forEach(script => {
script.innerHTML = tryTransform(babelTransformCode(babelOptionsJSX))(