@@ -10,7 +10,7 @@ import Stats._
1010import scala .util .{Failure , Success , Try }
1111
1212object Webpack {
13- // Represents webpack 4 modes
13+ // Represents webpack 5 modes
1414 sealed trait WebpackMode {
1515 def mode : String
1616 }
@@ -61,95 +61,74 @@ object Webpack {
6161 webpackConfigFile : BundlerFile .WebpackConfig ,
6262 libraryBundleName : Option [String ],
6363 mode : WebpackMode ,
64+ devServerPort : Int ,
6465 log : Logger
6566 ): Unit = {
67+ val webpackConfigContent = generateConfigFile(emitSourceMaps, entry, webpackConfigFile, libraryBundleName, mode,
68+ devServerPort)
69+
6670 log.info(" Writing scalajs.webpack.config.js" )
67- // Build the output configuration, configured for library output
68- // if a library bundle name is provided
69- val output = libraryBundleName match {
70- case Some (bundleName) =>
71- JS .obj(
72- " path" -> JS .str(webpackConfigFile.targetDir.toAbsolutePath.toString),
73- " filename" -> JS .str(BundlerFile .Library .fileName(" [name]" )),
74- " library" -> JS .str(bundleName),
75- " libraryTarget" -> JS .str(" var" )
76- )
77- case None =>
78- JS .obj(
79- " path" -> JS .str(webpackConfigFile.targetDir.toAbsolutePath.toString),
80- " filename" -> JS .str(BundlerFile .ApplicationBundle .fileName(" [name]" ))
81- )
82- }
71+ IO .write(webpackConfigFile.file, webpackConfigContent.show)
72+ }
8373
84- // Build the file itself
85- val webpackConfigContent =
86- JS .ref(" module" ).dot(" exports" ).assign(JS .obj(Seq (
87- " entry" -> JS .obj(
88- entry.project -> JS .arr(JS .str(entry.file.absolutePath))
89- ),
90- " output" -> output
91- ) ++ (
92- if (emitSourceMaps) {
93- val webpackNpmPackage = NpmPackage .getForModule(webpackConfigFile.targetDir.toFile, " webpack" )
94- webpackNpmPackage.flatMap(_.major) match {
95- case Some (1 ) =>
96- Seq (
97- " devtool" -> JS .str(" source-map" ),
98- " module" -> JS .obj(
99- " preLoaders" -> JS .arr(
100- JS .obj(
101- " test" -> JS .regex(" \\ .js$" ),
102- " loader" -> JS .str(" source-map-loader" )
103- )
104- )
105- )
106- )
107- case Some (2 ) =>
108- Seq (
109- " devtool" -> JS .str(" source-map" ),
110- " module" -> JS .obj(
111- " rules" -> JS .arr(
112- JS .obj(
113- " test" -> JS .regex(" \\ .js$" ),
114- " enforce" -> JS .str(" pre" ),
115- " loader" -> JS .str(" source-map-loader" )
116- )
117- )
118- )
119- )
120- case Some (3 ) =>
121- Seq (
122- " devtool" -> JS .str(" source-map" ),
123- " module" -> JS .obj(
124- " rules" -> JS .arr(
125- JS .obj(
126- " test" -> JS .regex(" \\ .js$" ),
127- " enforce" -> JS .str(" pre" ),
128- " use" -> JS .arr(JS .str(" source-map-loader" ))
129- )
130- )
131- )
132- )
133- case Some (4 ) =>
134- Seq (
135- " mode" -> JS .str(mode.mode),
136- " devtool" -> JS .str(" source-map" ),
137- " module" -> JS .obj(
138- " rules" -> JS .arr(
139- JS .obj(
140- " test" -> JS .regex(" \\ .js$" ),
141- " enforce" -> JS .str(" pre" ),
142- " use" -> JS .arr(JS .str(" source-map-loader" ))
143- )
74+ private def generateConfigFile (
75+ emitSourceMaps : Boolean ,
76+ entry : BundlerFile .WebpackInput ,
77+ webpackConfigFile : BundlerFile .WebpackConfig ,
78+ libraryBundleName : Option [String ],
79+ mode : WebpackMode ,
80+ devServerPort : Int
81+ ): JS = {
82+ val webpackNpmPackage = NpmPackage .getForModule(webpackConfigFile.targetDir.toFile, " webpack" )
83+ webpackNpmPackage.flatMap(_.major) match {
84+ case Some (5 ) =>
85+ // Build the output configuration, configured for library output
86+ // if a library bundle name is provided
87+ val output = libraryBundleName match {
88+ case Some (bundleName) =>
89+ JS .obj(
90+ " path" -> JS .str(webpackConfigFile.targetDir.toAbsolutePath.toString),
91+ " filename" -> JS .str(BundlerFile .Library .fileName(" [name]" )),
92+ " library" -> JS .str(bundleName),
93+ " libraryTarget" -> JS .str(" var" )
94+ )
95+ case None =>
96+ JS .obj(
97+ " path" -> JS .str(webpackConfigFile.targetDir.toAbsolutePath.toString),
98+ " filename" -> JS .str(BundlerFile .ApplicationBundle .fileName(" [name]" ))
99+ )
100+ }
101+
102+ JS .ref(" module" ).dot(" exports" ).assign(JS .obj(Seq (
103+ " entry" -> JS .obj(
104+ entry.project -> JS .arr(JS .str(entry.file.absolutePath))
105+ ),
106+ " output" -> output,
107+ " mode" -> JS .str(mode.mode),
108+ " devServer" -> JS .obj(" port" -> JS .int(devServerPort)),
109+ ) ++ (
110+ if (emitSourceMaps) {
111+ Seq (
112+ " devtool" -> JS .str(" source-map" ),
113+ " module" -> JS .obj(
114+ " rules" -> JS .arr(
115+ JS .obj(
116+ " test" -> JS .regex(" \\ .js$" ),
117+ " enforce" -> JS .str(" pre" ),
118+ " use" -> JS .arr(JS .str(" source-map-loader" ))
144119 )
145120 )
146121 )
147- case Some (x) => sys.error(s " Unsupported webpack major version $x" )
148- case None => sys.error(" No webpack version defined" )
149- }
150- } else Nil
151- ): _* ))
152- IO .write(webpackConfigFile.file, webpackConfigContent.show)
122+ )
123+ } else Nil
124+ ): _* ))
125+
126+ case Some (x) =>
127+ sys.error(s " Unsupported webpack major version $x" )
128+
129+ case None =>
130+ sys.error(" No webpack version defined" )
131+ }
153132 }
154133
155134 /**
@@ -162,7 +141,8 @@ object Webpack {
162141 * @param entry Scala.js application to bundle
163142 * @param targetDir Target directory (and working directory for Nodejs)
164143 * @param extraArgs Extra arguments passed to webpack
165- * @param mode Mode for webpack 4
144+ * @param mode Mode for webpack 5
145+ * @param devServerPort Port used by webpack-dev-server
166146 * @param log Logger
167147 * @return The generated bundles
168148 */
@@ -176,9 +156,10 @@ object Webpack {
176156 extraArgs : Seq [String ],
177157 nodeArgs : Seq [String ],
178158 mode : WebpackMode ,
159+ devServerPort : Int ,
179160 log : Logger
180161 ): BundlerFile .ApplicationBundle = {
181- writeConfigFile(emitSourceMaps, entry, generatedWebpackConfigFile, None , mode, log)
162+ writeConfigFile(emitSourceMaps, entry, generatedWebpackConfigFile, None , mode, devServerPort, log)
182163
183164 val configFile = customWebpackConfigFile
184165 .map(Webpack .copyCustomWebpackConfigFiles(targetDir, webpackResources))
@@ -206,7 +187,7 @@ object Webpack {
206187 * @param entryPointFile The entrypoint file to bundle dependencies for
207188 * @param libraryModuleName The library module name to assign the webpack bundle to
208189 * @param extraArgs Extra arguments passed to webpack
209- * @param mode Mode for webpack 4
190+ * @param mode Mode for webpack 5
210191 * @param log Logger
211192 * @return The generated bundle
212193 */
@@ -220,6 +201,7 @@ object Webpack {
220201 extraArgs : Seq [String ],
221202 nodeArgs : Seq [String ],
222203 mode : WebpackMode ,
204+ devServerPort : Int ,
223205 log : Logger
224206 ): BundlerFile .Library = {
225207 writeConfigFile(
@@ -228,6 +210,7 @@ object Webpack {
228210 generatedWebpackConfigFile,
229211 Some (libraryModuleName),
230212 mode,
213+ devServerPort,
231214 log
232215 )
233216
@@ -260,8 +243,16 @@ object Webpack {
260243 if (p.warnings.nonEmpty || p.errors.nonEmpty) {
261244 logger.info(" " )
262245 // Filtering is a workaround for #111
263- p.warnings.filterNot(_.contains(" https://raw.githubusercontent.com" )).foreach(x => logger.warn(x))
264- p.errors.foreach(x => logger.error(x))
246+ p.warnings.filterNot(_.message.contains(" https://raw.githubusercontent.com" )).foreach { warning =>
247+ logger.warn(s " WARNING in ${warning.moduleName}" )
248+ logger.warn(warning.message)
249+ logger.warn(" \n " )
250+ }
251+ p.errors.foreach { error =>
252+ logger.error(s " ERROR in ${error.moduleName} ${error.loc}" )
253+ logger.error(error.message)
254+ logger.error(" \n " )
255+ }
265256 }
266257 Some (p)
267258 }
@@ -290,7 +281,7 @@ object Webpack {
290281 */
291282 def run (nodeArgs : String * )(args : String * )(workingDir : File , log : Logger ): Option [WebpackStats ] = {
292283 val webpackBin = workingDir / " node_modules" / " webpack" / " bin" / " webpack"
293- val params = nodeArgs ++ Seq (webpackBin.absolutePath, " --bail " , " -- profile" , " --json" ) ++ args
284+ val params = nodeArgs ++ Seq (webpackBin.absolutePath, " --profile" , " --json" ) ++ args
294285 val cmd = " node" +: params
295286 Commands .run(cmd, workingDir, log, jsonOutput(cmd, log)).fold(sys.error, _.flatten)
296287 }
0 commit comments