You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					93 lines
				
				3.2 KiB
			
		
		
			
		
	
	
					93 lines
				
				3.2 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								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'))
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								}
							 |