import type { SpeedyPlugin } from '@speedy-js/speedy-types'; import { isJsExt, isJsLoader, resolvePathAndQuery } from '@speedy-js/speedy-utils'; import path from 'path'; const pluginName = 'speedy:babel-input-plugin'; export const es5InputPlugin = (polyfill: boolean): SpeedyPlugin => { return { name: pluginName, apply(compiler) { compiler.hooks.initialize.tapPromise(pluginName, async () => { compiler.config.target = 'es5'; }); compiler.hooks.transform.tapPromise({ name: pluginName, stage: 253 }, async (args) => { const filename = resolvePathAndQuery(args.path).originalFilePath; if (isJsExt(filename) || isJsLoader(args.loader)) { const plugins = []; const presets = []; if (polyfill) { plugins.push([ require('@babel/plugin-transform-runtime'), { corejs: false, regenerator: false, helpers: true, absoluteRuntime: path.dirname( require.resolve('@babel/runtime-corejs3/package.json', { paths: [__dirname] }) ), }, ]); plugins.push([ require('babel-plugin-polyfill-regenerator'), { method: 'usage-global', absoluteImports: path.dirname( require.resolve('regenerator-runtime/package.json', { paths: [__dirname] }) ), }, ]); plugins.push([ require('babel-plugin-polyfill-corejs3'), { method: 'usage-global', absoluteImports: path.dirname(require.resolve('core-js/package.json', { paths: [__dirname] })), targets: { ios: 9, android: 4, }, }, ]); } if (/.(jsx|tsx)$/.test(filename) || args.loader === 'tsx' || args.loader === 'jsx') { presets.push([require('@babel/preset-react')]); } if (/.(ts|tsx)$/.test(filename) || args.loader === 'ts' || args.loader === 'tsx') { presets.push([require('@babel/preset-typescript')]); } const result = await require('@babel/core').transformAsync(args.code, { filename, exclude: [/\bcore-js\b/], presets: [ [ require('@babel/preset-env'), { modules: false, }, ], ...presets, ], plugins, sourceType: 'module', sourceMaps: Boolean(compiler.config.sourceMap), compact: false, babelrc: false, configFile: false, }); return { ...args, code: result?.code!, map: result?.map, }; } return args; }); }, }; };