quasar
146 строк · 4.1 Кб
1// Inspired by @vue/babel-preset-app
2
3const path = require('path')4
5const {6default: getTargets,7isRequired
8} = require('@babel/helper-compilation-targets')9
10function getPolyfills (targets, userPolyfills = []) {11// if no targets specified, include all default polyfills12if (!userPolyfills.length || !targets || !Object.keys(targets).length) {13return userPolyfills14}15
16const compatData = require('core-js-compat').data17return userPolyfills.filter(item => isRequired(item, targets, { compatData }))18}
19
20module.exports = (_, opts = {}) => {21const presets = []22const plugins = []23
24const runtimePath = path.dirname(require.resolve('@babel/runtime/package.json'))25const runtimeVersion = require('@babel/runtime/package.json').version26
27const {28polyfills: userPolyfills,29loose = false,30debug = false,31useBuiltIns = 'usage',32modules = false,33bugfixes = true,34targets: rawTargets,35spec,36include,37exclude,38shippedProposals,39forceAllTransforms,40decoratorsBeforeExport,41decoratorsLegacy,42
43// Undocumented option of @babel/plugin-transform-runtime.44// When enabled, an absolute path is used when importing a runtime helper after transforming.45// This ensures the transpiled file always use the runtime version required in this package.46// However, this may cause hash inconsistency if the project is moved to another directory.47// So here we allow user to explicit disable this option if hash consistency is a requirement48// and the runtime version is sure to be correct.49absoluteRuntime = runtimePath,50
51// https://babeljs.io/docs/en/babel-plugin-transform-runtime#version52// By default transform-runtime assumes that @babel/runtime@7.0.0-beta.0 is installed, which means helpers introduced later than 7.0.0-beta.0 will be inlined instead of imported.53// See https://github.com/babel/babel/issues/1026154// And https://github.com/facebook/docusaurus/pull/211155version = runtimeVersion56} = opts57
58let targets = getTargets(rawTargets)59let polyfills = []60
61if (useBuiltIns === 'usage') {62polyfills = getPolyfills(targets, userPolyfills)63
64if (polyfills.length > 0) {65plugins.push([66require('./polyfills'),67{ polyfills, useAbsolutePath: !!absoluteRuntime }68])69}70}71
72const envOptions = {73bugfixes,74corejs: useBuiltIns ? require('core-js/package.json').version : false,75spec,76loose,77debug,78modules,79targets,80useBuiltIns,81include,82exclude: polyfills.concat(exclude || []),83shippedProposals,84forceAllTransforms
85}86
87// pass options along to babel-preset-env88presets.unshift([ require('@babel/preset-env'), envOptions ])89
90plugins.push(91// Stage 292[93require('@babel/plugin-proposal-decorators'), {94decoratorsBeforeExport,95legacy: decoratorsLegacy !== false96}97],98[99require('@babel/plugin-transform-class-properties'), {100loose
101}102],103require('@babel/plugin-proposal-function-sent'),104require('@babel/plugin-transform-export-namespace-from'),105require('@babel/plugin-transform-numeric-separator'),106require('@babel/plugin-proposal-throw-expressions'),107
108// Stage 3109require('@babel/plugin-syntax-dynamic-import'),110require('@babel/plugin-syntax-import-meta'),111require('@babel/plugin-transform-json-strings'),112
113// Transform runtime, but only for helpers114[115require('@babel/plugin-transform-runtime'), {116regenerator: useBuiltIns !== 'usage',117
118// polyfills are injected by preset-env & polyfillsPlugin, so no need to add them again119corejs: false,120
121helpers: useBuiltIns === 'usage',122useESModules: false,123
124absoluteRuntime,125
126version
127}128]129)130
131return {132sourceType: 'unambiguous',133overrides: [{134exclude: [ /@babel[\/|\\\\]runtime/, /core-js/ ],135presets,136plugins
137}, {138// there are some untranspiled code in @babel/runtime139// https://github.com/babel/babel/issues/9903140include: [ /@babel[\/|\\\\]runtime/ ],141presets: [142[ require('@babel/preset-env'), envOptions ]143]144}]145}146}
147