| const path = require('path') | 
| const babel = require('@babel/core') | 
| const { isWindows } = require('@vue/cli-shared-utils') | 
|   | 
| function genTranspileDepRegex (transpileDependencies) { | 
|   const deps = transpileDependencies.map(dep => { | 
|     if (typeof dep === 'string') { | 
|       const depPath = path.join('node_modules', dep, '/') | 
|       return isWindows | 
|         ? depPath.replace(/\\/g, '\\\\') // double escape for windows style path | 
|         : depPath | 
|     } else if (dep instanceof RegExp) { | 
|       return dep.source | 
|     } | 
|   }) | 
|   return deps.length ? new RegExp(deps.join('|')) : null | 
| } | 
|   | 
| module.exports = (api, options) => { | 
|   const useThreads = process.env.NODE_ENV === 'production' && !!options.parallel | 
|   const cliServicePath = path.dirname(require.resolve('@vue/cli-service')) | 
|   const transpileDepRegex = genTranspileDepRegex(options.transpileDependencies) | 
|   | 
|   // try to load the project babel config; | 
|   // if the default preset is used, | 
|   // there will be a VUE_CLI_TRANSPILE_BABEL_RUNTIME env var set. | 
|   // the `filename` field is required | 
|   // in case there're filename-related options like `ignore` in the user config | 
|   babel.loadPartialConfigSync({ filename: api.resolve('src/main.js') }) | 
|   | 
|   api.chainWebpack(webpackConfig => { | 
|     webpackConfig.resolveLoader.modules.prepend(path.join(__dirname, 'node_modules')) | 
|   | 
|     const jsRule = webpackConfig.module | 
|       .rule('js') | 
|         .test(/\.m?jsx?$/) | 
|         .exclude | 
|           .add(filepath => { | 
|             // always transpile js in vue files | 
|             if (/\.vue\.jsx?$/.test(filepath)) { | 
|               return false | 
|             } | 
|             // exclude dynamic entries from cli-service | 
|             if (filepath.startsWith(cliServicePath)) { | 
|               return true | 
|             } | 
|   | 
|             // only include @babel/runtime when the @vue/babel-preset-app preset is used | 
|             if ( | 
|               process.env.VUE_CLI_TRANSPILE_BABEL_RUNTIME && | 
|               filepath.includes(path.join('@babel', 'runtime')) | 
|             ) { | 
|               return false | 
|             } | 
|   | 
|             // check if this is something the user explicitly wants to transpile | 
|             if (transpileDepRegex && transpileDepRegex.test(filepath)) { | 
|               return false | 
|             } | 
|             // Don't transpile node_modules | 
|             return /node_modules/.test(filepath) | 
|           }) | 
|           .end() | 
|         .use('cache-loader') | 
|           .loader(require.resolve('cache-loader')) | 
|           .options(api.genCacheConfig('babel-loader', { | 
|             '@babel/core': require('@babel/core/package.json').version, | 
|             '@vue/babel-preset-app': require('@vue/babel-preset-app/package.json').version, | 
|             'babel-loader': require('babel-loader/package.json').version, | 
|             modern: !!process.env.VUE_CLI_MODERN_BUILD, | 
|             browserslist: api.service.pkg.browserslist | 
|           }, [ | 
|             'babel.config.js', | 
|             '.browserslistrc' | 
|           ])) | 
|           .end() | 
|   | 
|     if (useThreads) { | 
|       const threadLoaderConfig = jsRule | 
|         .use('thread-loader') | 
|           .loader(require.resolve('thread-loader')) | 
|   | 
|       if (typeof options.parallel === 'number') { | 
|         threadLoaderConfig.options({ workers: options.parallel }) | 
|       } | 
|     } | 
|   | 
|     jsRule | 
|       .use('babel-loader') | 
|         .loader(require.resolve('babel-loader')) | 
|   }) | 
| } |