1- const cloneDeep = require ( 'lodash.clonedeep' )
21const path = require ( 'path' )
32const webpack = require ( 'webpack' )
43const debug = require ( 'debug' ) ( 'cypress:webpack' )
54
65const createDeferred = require ( './deferred' )
6+ const stubbableRequire = require ( './stubbable-require' )
77
88const bundles = { }
99
10- // by default, we transform JavaScript supported by @babel/preset-env
11- const defaultBabelLoaderRules = ( ) => {
12- return [
13- {
14- test : / \. j s ? $ / ,
15- exclude : [ / n o d e _ m o d u l e s / ] ,
16- use : [
17- {
18- loader : require . resolve ( 'babel-loader' ) ,
19- options : {
20- presets : [ require . resolve ( '@babel/preset-env' ) ] ,
21- } ,
22- } ,
23- ] ,
24- } ,
25- ]
26- }
27-
2810// we don't automatically load the rules, so that the babel dependencies are
2911// not required if a user passes in their own configuration
30- const defaultOptions = {
31- webpackOptions : {
12+ const getDefaultWebpackOptions = ( ) => {
13+ debug ( 'load default options' )
14+
15+ return {
3216 module : {
33- rules : [ ] ,
17+ rules : [
18+ {
19+ test : / \. j s x ? $ / ,
20+ exclude : [ / n o d e _ m o d u l e s / ] ,
21+ use : [
22+ {
23+ loader : stubbableRequire . resolve ( 'babel-loader' ) ,
24+ options : {
25+ presets : [ stubbableRequire . resolve ( '@babel/preset-env' ) ] ,
26+ } ,
27+ } ,
28+ ] ,
29+ } ,
30+ ] ,
3431 } ,
35- } ,
36- watchOptions : { } ,
32+ }
3733}
3834
3935// export a function that returns another function, making it easy for users
@@ -57,24 +53,24 @@ const preprocessor = (options = {}) => {
5753 // the supported file and spec file to be requested again
5854 return ( file ) => {
5955 const filePath = file . filePath
56+
6057 debug ( 'get' , filePath )
6158
6259 // since this function can get called multiple times with the same
6360 // filePath, we return the cached bundle promise if we already have one
6461 // since we don't want or need to re-initiate webpack for it
6562 if ( bundles [ filePath ] ) {
6663 debug ( `already have bundle for ${ filePath } ` )
64+
6765 return bundles [ filePath ]
6866 }
6967
7068 // user can override the default options
71- let webpackOptions = Object . assign ( { } , defaultOptions . webpackOptions , options . webpackOptions )
72- // here is where we load the default rules if the user has not passed
73- // in their own configuration
74- if ( webpackOptions . module . rules === defaultOptions . webpackOptions ) {
75- webpackOptions . module . rules = defaultBabelLoaderRules ( )
76- }
77- let watchOptions = Object . assign ( { } , defaultOptions . watchOptions , options . watchOptions )
69+ let webpackOptions = options . webpackOptions || getDefaultWebpackOptions ( )
70+ const watchOptions = options . watchOptions || { }
71+
72+ debug ( 'webpackOptions: %o' , webpackOptions )
73+ debug ( 'watchOptions: %o' , watchOptions )
7874
7975 // we're provided a default output path that lives alongside Cypress's
8076 // app data files so we don't have to worry about where to put the bundled
@@ -186,14 +182,16 @@ const preprocessor = (options = {}) => {
186182 }
187183}
188184
189- // provide a clone of the default options, making sure to lazy-load
190- // babel dependencies so that they aren't required unless the user
191- // utilizes them
185+ // provide a clone of the default options, lazy-loading them
186+ // so they aren't required unless the user utilizes them
192187Object . defineProperty ( preprocessor , 'defaultOptions' , {
193188 get ( ) {
194- const clonedDefaults = cloneDeep ( defaultOptions )
195- clonedDefaults . webpackOptions . module . rules = defaultBabelLoaderRules ( )
196- return clonedDefaults
189+ debug ( 'get default options' )
190+
191+ return {
192+ webpackOptions : getDefaultWebpackOptions ( ) ,
193+ watchOptions : { } ,
194+ }
197195 } ,
198196} )
199197
0 commit comments