@@ -2,36 +2,64 @@ const path = require('path');
22const webpack = require ( 'webpack' ) ;
33const { CleanWebpackPlugin} = require ( 'clean-webpack-plugin' ) ;
44const HtmlWebpackPlugin = require ( 'html-webpack-plugin' ) ;
5+ const MiniCssExtractPlugin = require ( 'mini-css-extract-plugin' ) ;
6+ const CssMinimizerPlugin = require ( 'css-minimizer-webpack-plugin' ) ;
57const { version} = require ( './package.json' ) ;
8+ const merge = require ( 'webpack-merge' ) . merge ;
9+
10+ const baseConfigOriginal = require ( '../../../webpack.config' ) ;
11+
12+ const resolveMonorepoRoot = ( ...segments ) => path . resolve ( __dirname , '../../../' , ...segments ) ;
13+
14+ const { entry, ...baseConfig } = baseConfigOriginal ;
15+
16+ const outputConfig = {
17+ dist : {
18+ path : path . resolve ( __dirname , './dist' ) ,
19+ filename : 'webexWidgets.mjs' ,
20+ library : {
21+ type : 'module' ,
22+ } ,
23+ } ,
24+ demo : {
25+ path : path . resolve ( __dirname , './docs' ) ,
26+ filename : 'demo.bundle.[contenthash].js' ,
27+ } ,
28+ } ;
629
730module . exports = function ( env , argv ) {
8- return {
31+ const buildType = env . buildType ;
32+ const mode = argv . mode ;
33+ const isDemo = buildType === 'demo' ;
34+ const isDist = buildType === 'dist' ;
35+
36+ const entryPoint = env . entry ;
37+
38+ return merge ( baseConfig , {
939 cache : true ,
10- output :
11- argv . mode === 'production'
12- ? {
13- path : path . resolve ( __dirname , './docs' ) ,
14- filename : 'demo.bundle.[hash].js' ,
15- }
16- : undefined , // Otherwise the CleanWebpackPlugin will wipe our build during devserver
17- devtool : argv . mode === 'production' ? 'source-map' : 'inline-source-map' ,
18- resolve : {
19- extensions : [ '.js' , '.jsx' ] ,
20- fallback : {
21- "buffer" : require . resolve ( "buffer/" ) ,
22- "crypto" : require . resolve ( "crypto-browserify" ) ,
23- "os" : require . resolve ( "os-browserify/browser" ) ,
24- "stream" : require . resolve ( "stream-browserify" ) ,
25- "util" : require . resolve ( "util/" ) ,
26- "url" : require . resolve ( "url/" ) ,
27- "vm" : require . resolve ( "vm-browserify" ) ,
28- "querystring" : require . resolve ( 'querystring-es3' ) ,
29- "fs" : false
30- } /*
31- * In order to include polyfills for node.js core modules, we need to add a fallback
32- * for the relevant packages as webpack 5 doesn't include them by default
33- */
34- } ,
40+ entry : entryPoint ,
41+ output : outputConfig [ buildType ] ,
42+
43+ // Enable ESM output
44+ experiments : isDist
45+ ? {
46+ outputModule : true ,
47+ }
48+ : { } ,
49+
50+ devtool : mode === 'production' ? 'source-map' : 'inline-source-map' ,
51+
52+ externals : isDemo ? { } : [ 'prop-types' , 'react' , 'react-dom' , 'webex' , '@webex/common' ] ,
53+
54+ // // CSS minimization for dist builds
55+ optimization : isDist
56+ ? {
57+ minimizer : [
58+ `...` , // Keep default JS minimizer
59+ new CssMinimizerPlugin ( ) ,
60+ ] ,
61+ }
62+ : { } ,
3563 module : {
3664 rules : [
3765 {
@@ -41,6 +69,20 @@ module.exports = function(env, argv) {
4169 loader : 'babel-loader' ,
4270 } ,
4371 } ,
72+ {
73+ test : / \. c s s $ / ,
74+ use : [ isDemo ? 'style-loader' : MiniCssExtractPlugin . loader , 'css-loader' ] ,
75+ include : [
76+ resolveMonorepoRoot ( 'node_modules/@momentum-ui' ) ,
77+ resolveMonorepoRoot ( 'node_modules/@webex/components' ) ,
78+ path . resolve ( __dirname , 'packages' ) ,
79+ ] ,
80+ } ,
81+ {
82+ test : / \. s c s s $ / ,
83+ use : [ isDemo ? 'style-loader' : MiniCssExtractPlugin . loader , 'css-loader' , 'sass-loader' ] ,
84+ include : [ path . resolve ( __dirname , 'packages' ) ] ,
85+ } ,
4486 {
4587 test : / \. h t m l $ / ,
4688 use : [
@@ -49,22 +91,14 @@ module.exports = function(env, argv) {
4991 } ,
5092 ] ,
5193 } ,
52- {
53- test : / \. c s s $ / ,
54- use : [ 'style-loader' , 'css-loader' ] ,
55- } ,
56- {
57- test : / \. s c s s $ / ,
58- exclude : / n o d e _ m o d u l e s / ,
59- use : [ 'style-loader' , 'css-loader' , 'sass-loader' ] ,
60- } ,
6194 {
6295 test : / \. ( w o f f ( 2 ) ? | t t f | e o t | s v g | p n g | g i f ) ( \? v = \d + \. \d + \. \d + ) ? $ / ,
6396 use : [
6497 {
6598 loader : 'file-loader' ,
6699 options : {
67- outputPath : 'assets/' ,
100+ outputPath : isDemo ? 'assets/' : 'css/assets/' ,
101+ name : '[name].[contenthash].[ext]' ,
68102 } ,
69103 } ,
70104 ] ,
@@ -86,23 +120,27 @@ module.exports = function(env, argv) {
86120 server : {
87121 type : 'https' ,
88122 } ,
89- } // After upgrading webpack dev server to the latest version, config required changes as existing options were deprecated
123+ }
90124 : undefined ,
91125 plugins : [
92126 new CleanWebpackPlugin ( ) ,
93- new HtmlWebpackPlugin ( {
94- filename : 'index.html' ,
95- template : 'demo/index.html' ,
96- favicon : 'demo/webex-logo.png' ,
97- } ) ,
98- new webpack . HotModuleReplacementPlugin ( ) ,
127+ isDemo &&
128+ new HtmlWebpackPlugin ( {
129+ filename : 'index.html' ,
130+ template : 'demo/index.html' ,
131+ favicon : 'demo/webex-logo.png' ,
132+ } ) ,
133+ isDemo && new webpack . HotModuleReplacementPlugin ( ) ,
134+ ! isDemo &&
135+ new MiniCssExtractPlugin ( {
136+ filename : 'css/webex-widgets.css' ,
137+ } ) ,
99138 new webpack . DefinePlugin ( {
100- __appVersion__ : JSON . stringify ( version )
139+ __appVersion__ : JSON . stringify ( version ) ,
101140 } ) ,
102- new webpack . ProvidePlugin ( { //Fixes 'process is not defined' and 'Buffer not defined' errors
103- process : 'process/browser' ,
141+ new webpack . ProvidePlugin ( {
104142 Buffer : [ 'buffer' , 'Buffer' ] ,
105143 } ) ,
106144 ] ,
107- } ;
145+ } ) ;
108146} ;
0 commit comments