| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 | 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 inconsistency 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  }}
 |