@@ -7,6 +7,48 @@ const childProcess = require('child_process');
77const fse = require ( 'fs-extra' ) ;
88const isBuiltinModule = require ( 'is-builtin-module' ) ;
99
10+ /**
11+ * Add the given modules to a package json's dependencies.
12+ */
13+ function addModulesToPackageJson ( externalModules , packageJson ) {
14+ _ . forEach ( externalModules , externalModule => {
15+ const splitModule = _ . split ( externalModule , '@' ) ;
16+ // If we have a scoped module we have to re-add the @
17+ if ( _ . startsWith ( externalModule , '@' ) ) {
18+ splitModule . splice ( 0 , 1 ) ;
19+ splitModule [ 0 ] = '@' + splitModule [ 0 ] ;
20+ }
21+ const moduleVersion = _ . join ( _ . tail ( splitModule ) , '@' ) ;
22+ packageJson . dependencies = packageJson . dependencies || { } ;
23+ packageJson . dependencies [ _ . first ( splitModule ) ] = moduleVersion ;
24+ } ) ;
25+ }
26+
27+ /**
28+ * Remove a given list of excluded modules from a module list
29+ * @this - The active plugin instance
30+ */
31+ function removeExcludedModules ( modules , packageForceExcludes , log ) {
32+ const excludedModules = _ . remove ( modules , externalModule => {
33+ const splitModule = _ . split ( externalModule , '@' ) ;
34+ // If we have a scoped module we have to re-add the @
35+ if ( _ . startsWith ( externalModule , '@' ) ) {
36+ splitModule . splice ( 0 , 1 ) ;
37+ splitModule [ 0 ] = '@' + splitModule [ 0 ] ;
38+ }
39+ const moduleName = _ . first ( splitModule ) ;
40+ return _ . includes ( packageForceExcludes , moduleName ) ;
41+ } ) ;
42+
43+ if ( log && ! _ . isEmpty ( excludedModules ) ) {
44+ this . serverless . cli . log ( `Excluding external modules: ${ _ . join ( excludedModules , ', ' ) } ` ) ;
45+ }
46+ }
47+
48+ /**
49+ * Resolve the needed versions of production depenencies for external modules.
50+ * @this - The active plugin instance
51+ */
1052function getProdModules ( externalModules , packagePath , dependencyGraph ) {
1153 const packageJsonPath = path . join ( process . cwd ( ) , packagePath ) ;
1254 const packageJson = require ( packageJsonPath ) ;
@@ -127,7 +169,9 @@ module.exports = {
127169 return BbPromise . resolve ( stats ) ;
128170 }
129171
172+ // Read plugin configuration
130173 const packageForceIncludes = _ . get ( includes , 'forceInclude' , [ ] ) ;
174+ const packageForceExcludes = _ . get ( includes , 'forceExclude' , [ ] ) ;
131175 const packagePath = includes . packagePath || './package.json' ;
132176 const packageJsonPath = path . join ( process . cwd ( ) , packagePath ) ;
133177
@@ -182,6 +226,7 @@ module.exports = {
182226 ) ;
183227 return getProdModules . call ( this , externalModules , packagePath , dependencyGraph ) ;
184228 } ) ) ;
229+ removeExcludedModules . call ( this , compositeModules , packageForceExcludes , true ) ;
185230
186231 if ( _ . isEmpty ( compositeModules ) ) {
187232 // The compiled code does not reference any external modules at all
@@ -200,17 +245,7 @@ module.exports = {
200245 description : `Packaged externals for ${ this . serverless . service . service } ` ,
201246 private : true
202247 } ;
203- _ . forEach ( compositeModules , compositeModule => {
204- const splitModule = _ . split ( compositeModule , '@' ) ;
205- // If we have a scoped module we have to re-add the @
206- if ( _ . startsWith ( compositeModule , '@' ) ) {
207- splitModule . splice ( 0 , 1 ) ;
208- splitModule [ 0 ] = '@' + splitModule [ 0 ] ;
209- }
210- const moduleVersion = _ . join ( _ . tail ( splitModule ) , '@' ) ;
211- compositePackage . dependencies = compositePackage . dependencies || { } ;
212- compositePackage . dependencies [ _ . first ( splitModule ) ] = moduleVersion ;
213- } ) ;
248+ addModulesToPackageJson ( compositeModules , compositePackage ) ;
214249 this . serverless . utils . writeFileSync ( compositePackageJson , JSON . stringify ( compositePackage , null , 2 ) ) ;
215250
216251 // (1.a.2) Copy package-lock.json if it exists, to prevent unwanted upgrades
@@ -250,16 +285,8 @@ module.exports = {
250285 getExternalModules . call ( this , compileStats ) ,
251286 _ . map ( packageForceIncludes , whitelistedPackage => ( { external : whitelistedPackage } ) )
252287 ) , packagePath , dependencyGraph ) ;
253- _ . forEach ( prodModules , prodModule => {
254- const splitModule = _ . split ( prodModule , '@' ) ;
255- // If we have a scoped module we have to re-add the @
256- if ( _ . startsWith ( prodModule , '@' ) ) {
257- splitModule . splice ( 0 , 1 ) ;
258- splitModule [ 0 ] = '@' + splitModule [ 0 ] ;
259- }
260- const moduleVersion = _ . join ( _ . tail ( splitModule ) , '@' ) ;
261- modulePackage . dependencies [ _ . first ( splitModule ) ] = moduleVersion ;
262- } ) ;
288+ removeExcludedModules . call ( this , prodModules , packageForceExcludes ) ;
289+ addModulesToPackageJson ( prodModules , modulePackage ) ;
263290 this . serverless . utils . writeFileSync ( modulePackageJson , JSON . stringify ( modulePackage , null , 2 ) ) ;
264291
265292 // Copy modules
0 commit comments