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