UNPKG

@revoloo/cypress6

Version:

Cypress.io end to end testing tool

128 lines (115 loc) 4.1 kB
const path = require('path') const webpackPreprocessor = require('@cypress/webpack-preprocessor') const getDefaultWebpackOptions = (file, options = {}) => { const config = { mode: 'development', node: { global: true, __filename: true, __dirname: true, }, module: { rules: [{ test: /\.mjs$/, include: /node_modules/, exclude: [/browserslist/], type: 'javascript/auto', }, { test: /(\.jsx?|\.mjs)$/, exclude: [/node_modules/, /browserslist/], type: 'javascript/auto', use: [{ loader: require.resolve('babel-loader'), options: { plugins: [ ...[ 'babel-plugin-add-module-exports', '@babel/plugin-proposal-class-properties', '@babel/plugin-proposal-object-rest-spread', ].map(require.resolve), [require.resolve('@babel/plugin-transform-runtime'), { absoluteRuntime: path.dirname(require.resolve('@babel/runtime/package')), }], ], presets: [ [require.resolve('@babel/preset-env'), { modules: 'commonjs' }], require.resolve('@babel/preset-react'), ], }, }], }, { test: /\.coffee$/, exclude: [/node_modules/, /browserslist/], loader: require.resolve('coffee-loader'), }], }, resolve: { extensions: ['.js', '.json', '.jsx', '.mjs', '.coffee'], alias: { 'child_process': require.resolve('./empty'), 'cluster': require.resolve('./empty'), 'console': require.resolve('./empty'), 'dgram': require.resolve('./empty'), 'dns': require.resolve('./empty'), 'fs': require.resolve('./empty'), 'http2': require.resolve('./empty'), 'inspector': require.resolve('./empty'), 'module': require.resolve('./empty'), 'net': require.resolve('./empty'), 'perf_hooks': require.resolve('./empty'), 'readline': require.resolve('./empty'), 'repl': require.resolve('./empty'), 'tls': require.resolve('./empty'), }, }, } if (options.typescript) { const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin') // node will try to load a projects tsconfig.json instead of the node // package using require('tsconfig'), so we alias it as 'tsconfig-package' const configFile = require('tsconfig-package').findSync(path.dirname(file.filePath)) config.module.rules.push({ test: /\.tsx?$/, exclude: [/node_modules/], use: [ { loader: require.resolve('ts-loader'), options: { compiler: options.typescript, compilerOptions: { inlineSourceMap: true, inlineSources: true, downlevelIteration: true, }, logLevel: 'error', silent: true, transpileOnly: true, }, }, ], }) config.resolve.extensions = config.resolve.extensions.concat(['.ts', '.tsx']) config.resolve.plugins = [new TsconfigPathsPlugin({ configFile, silent: true, })] } return config } const typescriptExtensionRegex = /\.tsx?$/ const preprocessor = (options = {}) => { return (file) => { if (!options.typescript && typescriptExtensionRegex.test(file.filePath)) { return Promise.reject(new Error(`You are attempting to run a TypeScript file, but do not have TypeScript installed. Ensure you have 'typescript' installed to enable TypeScript support.\n\nThe file: ${file.filePath}`)) } options.webpackOptions = options.webpackOptions || getDefaultWebpackOptions(file, options) return webpackPreprocessor(options)(file) } } preprocessor.defaultOptions = { webpackOptions: getDefaultWebpackOptions(), watchOptions: {}, } // for testing purposes, but do not add this to the typescript interface preprocessor.__reset = webpackPreprocessor.__reset module.exports = preprocessor