123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- const path = require('path')
- const defaultPolyfills = [
- // promise polyfill alone doesn't work in IE,
- // needs this as well. see: #1642
- 'es6.array.iterator',
- // this is required for webpack code splitting, vuex etc.
- 'es6.promise',
- // this is needed for object rest spread support in templates
- // as vue-template-es2015-compiler 1.8+ compiles it to Object.assign() calls.
- 'es6.object.assign',
- // #2012 es6.promise replaces native Promise in FF and causes missing finally
- 'es7.promise.finally'
- ]
- function getPolyfills (targets, includes, { ignoreBrowserslistConfig, configPath }) {
- const { isPluginRequired } = require('@babel/preset-env')
- const builtInsList = require('@babel/preset-env/data/built-ins.json')
- const getTargets = require('@babel/preset-env/lib/targets-parser').default
- const builtInTargets = getTargets(targets, {
- ignoreBrowserslistConfig,
- configPath
- })
- return includes.filter(item => {
- return isPluginRequired(builtInTargets, builtInsList[item])
- })
- }
- module.exports = (context, options = {}) => {
- const presets = []
- const plugins = []
- const defaultEntryFiles = JSON.parse(process.env.VUE_CLI_ENTRY_FILES || '[]')
- // JSX
- if (options.jsx !== false) {
- presets.push([require('@vue/babel-preset-jsx'), typeof options.jsx === 'object' ? options.jsx : {}])
- }
- const runtimePath = path.dirname(require.resolve('@babel/runtime/package.json'))
- const {
- polyfills: userPolyfills,
- loose = false,
- debug = false,
- useBuiltIns = 'usage',
- modules = false,
- targets: rawTargets,
- spec,
- ignoreBrowserslistConfig = !!process.env.VUE_CLI_MODERN_BUILD,
- configPath,
- include,
- exclude,
- shippedProposals,
- forceAllTransforms,
- decoratorsBeforeExport,
- decoratorsLegacy,
- // entry file list
- entryFiles = defaultEntryFiles,
- // Undocumented option of @babel/plugin-transform-runtime.
- // When enabled, an absolute path is used when importing a runtime helper atfer tranforming.
- // This ensures the transpiled file always use the runtime version required in this package.
- // However, this may cause hash inconsitency if the project is moved to another directory.
- // So here we allow user to explicit disable this option if hash consistency is a requirement
- // and the runtime version is sure to be correct.
- absoluteRuntime = runtimePath
- } = options
- // resolve targets
- let targets
- if (process.env.VUE_CLI_BABEL_TARGET_NODE) {
- // running tests in Node.js
- targets = { node: 'current' }
- } else if (process.env.VUE_CLI_BUILD_TARGET === 'wc' || process.env.VUE_CLI_BUILD_TARGET === 'wc-async') {
- // targeting browsers that at least support ES2015 classes
- // https://github.com/babel/babel/blob/master/packages/babel-preset-env/data/plugins.json#L52-L61
- targets = {
- browsers: [
- 'Chrome >= 49',
- 'Firefox >= 45',
- 'Safari >= 10',
- 'Edge >= 13',
- 'iOS >= 10',
- 'Electron >= 0.36'
- ]
- }
- } else if (process.env.VUE_CLI_MODERN_BUILD) {
- // targeting browsers that support <script type="module">
- targets = { esmodules: true }
- } else {
- targets = rawTargets
- }
- // included-by-default polyfills. These are common polyfills that 3rd party
- // dependencies may rely on (e.g. Vuex relies on Promise), but since with
- // useBuiltIns: 'usage' we won't be running Babel on these deps, they need to
- // be force-included.
- let polyfills
- const buildTarget = process.env.VUE_CLI_BUILD_TARGET || 'app'
- if (
- buildTarget === 'app' &&
- useBuiltIns === 'usage' &&
- !process.env.VUE_CLI_BABEL_TARGET_NODE &&
- !process.env.VUE_CLI_MODERN_BUILD
- ) {
- polyfills = getPolyfills(targets, userPolyfills || defaultPolyfills, {
- ignoreBrowserslistConfig,
- configPath
- })
- plugins.push([
- require('./polyfillsPlugin'),
- { polyfills, entryFiles, useAbsolutePath: !!absoluteRuntime }
- ])
- } else {
- polyfills = []
- }
- const envOptions = {
- spec,
- loose,
- debug,
- modules,
- targets,
- useBuiltIns,
- ignoreBrowserslistConfig,
- configPath,
- include,
- exclude: polyfills.concat(exclude || []),
- shippedProposals,
- forceAllTransforms
- }
- // cli-plugin-jest sets this to true because Jest runs without bundling
- if (process.env.VUE_CLI_BABEL_TRANSPILE_MODULES) {
- envOptions.modules = 'commonjs'
- // necessary for dynamic import to work in tests
- plugins.push(require('babel-plugin-dynamic-import-node'))
- }
- // pass options along to babel-preset-env
- presets.unshift([require('@babel/preset-env'), envOptions])
- // additional <= stage-3 plugins
- // Babel 7 is removing stage presets altogether because people are using
- // too many unstable proposals. Let's be conservative in the defaults here.
- plugins.push(
- require('@babel/plugin-syntax-dynamic-import'),
- [require('@babel/plugin-proposal-decorators'), {
- decoratorsBeforeExport,
- legacy: decoratorsLegacy !== false
- }],
- [require('@babel/plugin-proposal-class-properties'), { loose }],
- )
- // transform runtime, but only for helpers
- plugins.push([require('@babel/plugin-transform-runtime'), {
- regenerator: useBuiltIns !== 'usage',
- // polyfills are injected by preset-env & polyfillsPlugin, so no need to add them again
- corejs: false,
- helpers: useBuiltIns === 'usage',
- useESModules: !process.env.VUE_CLI_BABEL_TRANSPILE_MODULES,
- absoluteRuntime
- }])
- // use @babel/runtime-corejs2 so that helpers that need polyfillable APIs will reference core-js instead.
- // if useBuiltIns is not set to 'usage', then it means users would take care of the polyfills on their own,
- // i.e., core-js is no longer needed.
- // this extra plugin can be removed once one of the two issues resolves:
- // https://github.com/babel/babel/issues/7597
- // https://github.com/babel/babel/issues/9903
- if (useBuiltIns === 'usage' && !process.env.VUE_CLI_MODERN_BUILD) {
- const runtimeCoreJs2Path = path.dirname(require.resolve('@babel/runtime-corejs2/package.json'))
- plugins.push([require('babel-plugin-module-resolver'), {
- alias: {
- '@babel/runtime': '@babel/runtime-corejs2',
- [runtimePath]: runtimeCoreJs2Path
- }
- }])
- }
- return {
- presets,
- plugins
- }
- }
|