Browse Source

Merge all configs into one

Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
John Molakvoæ (skjnldsv) 2 years ago
parent
commit
7f20d59f9c
6 changed files with 223 additions and 149 deletions
  1. 5 24
      package-lock.json
  2. 1 0
      package.json
  3. 105 111
      webpack.common.js
  4. 5 7
      webpack.dev.js
  5. 102 0
      webpack.modules.js
  6. 5 7
      webpack.prod.js

+ 5 - 24
package-lock.json

@@ -88,6 +88,7 @@
         "babel-loader-exclude-node-modules-except": "^1.2.1",
         "css-loader": "^5.2.7",
         "eslint-loader": "^4.0.2",
+        "eslint-webpack-plugin": "^2.5.4",
         "exports-loader": "^1.1.1",
         "file-loader": "^6.2.0",
         "handlebars-loader": "^1.7.1",
@@ -7661,7 +7662,6 @@
       "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz",
       "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "@types/estree": "*",
         "@types/json-schema": "*"
@@ -7671,8 +7671,7 @@
       "version": "0.0.50",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
       "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==",
-      "dev": true,
-      "peer": true
+      "dev": true
     },
     "node_modules/@types/graceful-fs": {
       "version": "4.1.5",
@@ -8334,7 +8333,6 @@
       "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
       "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
       "dev": true,
-      "peer": true,
       "engines": {
         "node": ">=8"
       }
@@ -11511,7 +11509,6 @@
       "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz",
       "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "@types/eslint": "^7.2.6",
         "arrify": "^2.0.1",
@@ -11537,7 +11534,6 @@
       "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
       "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "fill-range": "^7.0.1"
       },
@@ -11550,7 +11546,6 @@
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
       "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "to-regex-range": "^5.0.1"
       },
@@ -11563,7 +11558,6 @@
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true,
-      "peer": true,
       "engines": {
         "node": ">=0.12.0"
       }
@@ -11573,7 +11567,6 @@
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
       "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "braces": "^3.0.1",
         "picomatch": "^2.2.3"
@@ -11587,7 +11580,6 @@
       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
       "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "@types/json-schema": "^7.0.8",
         "ajv": "^6.12.5",
@@ -11606,7 +11598,6 @@
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
-      "peer": true,
       "dependencies": {
         "is-number": "^7.0.0"
       },
@@ -28800,7 +28791,6 @@
       "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz",
       "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==",
       "dev": true,
-      "peer": true,
       "requires": {
         "@types/estree": "*",
         "@types/json-schema": "*"
@@ -28810,8 +28800,7 @@
       "version": "0.0.50",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
       "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==",
-      "dev": true,
-      "peer": true
+      "dev": true
     },
     "@types/graceful-fs": {
       "version": "4.1.5",
@@ -29380,8 +29369,7 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
       "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
-      "dev": true,
-      "peer": true
+      "dev": true
     },
     "asn1.js": {
       "version": "5.4.1",
@@ -32154,7 +32142,6 @@
       "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz",
       "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==",
       "dev": true,
-      "peer": true,
       "requires": {
         "@types/eslint": "^7.2.6",
         "arrify": "^2.0.1",
@@ -32169,7 +32156,6 @@
           "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
           "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
           "dev": true,
-          "peer": true,
           "requires": {
             "fill-range": "^7.0.1"
           }
@@ -32179,7 +32165,6 @@
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
           "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
           "dev": true,
-          "peer": true,
           "requires": {
             "to-regex-range": "^5.0.1"
           }
@@ -32188,15 +32173,13 @@
           "version": "7.0.0",
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
           "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-          "dev": true,
-          "peer": true
+          "dev": true
         },
         "micromatch": {
           "version": "4.0.4",
           "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
           "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
           "dev": true,
-          "peer": true,
           "requires": {
             "braces": "^3.0.1",
             "picomatch": "^2.2.3"
@@ -32207,7 +32190,6 @@
           "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
           "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
           "dev": true,
-          "peer": true,
           "requires": {
             "@types/json-schema": "^7.0.8",
             "ajv": "^6.12.5",
@@ -32219,7 +32201,6 @@
           "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
           "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
           "dev": true,
-          "peer": true,
           "requires": {
             "is-number": "^7.0.0"
           }

+ 1 - 0
package.json

@@ -104,6 +104,7 @@
     "babel-loader-exclude-node-modules-except": "^1.2.1",
     "css-loader": "^5.2.7",
     "eslint-loader": "^4.0.2",
+    "eslint-webpack-plugin": "^2.5.4",
     "exports-loader": "^1.1.1",
     "file-loader": "^6.2.0",
     "handlebars-loader": "^1.7.1",

+ 105 - 111
webpack.common.js

@@ -1,48 +1,11 @@
 /* eslint-disable camelcase */
-const { merge } = require('webpack-merge')
 const { VueLoaderPlugin } = require('vue-loader')
 const path = require('path')
 
 const BabelLoaderExcludeNodeModulesExcept = require('babel-loader-exclude-node-modules-except')
 const ESLintPlugin = require('eslint-webpack-plugin')
 
-const accessibility = require('./apps/accessibility/webpack')
-const comments = require('./apps/comments/webpack')
-const core = require('./core/webpack')
-const dashboard = require('./apps/dashboard/webpack')
-const dav = require('./apps/dav/webpack')
-const files = require('./apps/files/webpack')
-const files_sharing = require('./apps/files_sharing/webpack')
-const files_trashbin = require('./apps/files_trashbin/webpack')
-const files_versions = require('./apps/files_versions/webpack')
-const oauth2 = require('./apps/oauth2/webpack')
-const settings = require('./apps/settings/webpack')
-const systemtags = require('./apps/systemtags/webpack')
-const user_status = require('./apps/user_status/webpack')
-const weather_status = require('./apps/weather_status/webpack')
-const twofactor_backupscodes = require('./apps/twofactor_backupcodes/webpack')
-const updatenotification = require('./apps/updatenotification/webpack')
-const workflowengine = require('./apps/workflowengine/webpack')
-
-const modules = {
-	accessibility,
-	comments,
-	core,
-	dashboard,
-	dav,
-	files,
-	files_sharing,
-	files_trashbin,
-	files_versions,
-	oauth2,
-	settings,
-	systemtags,
-	user_status,
-	weather_status,
-	twofactor_backupscodes,
-	updatenotification,
-	workflowengine,
-}
+const modules = require('./webpack.modules.js')
 
 const modulesToBuild = () => {
 	const MODULE = process.env.MODULE
@@ -50,84 +13,115 @@ const modulesToBuild = () => {
 		if (!modules[MODULE]) {
 			throw new Error(`No module "${MODULE}" found`)
 		}
-		return [modules[MODULE]]
+		return modules[MODULE]
 	}
-	return Object.values(modules)
+	// merge all configs into one object
+	return Object.assign({}, ...Object.values(modules))
 }
 
-module.exports = []
-	.concat(
-		...modulesToBuild()
-	)
-	.map(config => merge({
-		module: {
-			rules: [
-				{
-					test: /\.css$/,
-					use: ['style-loader', 'css-loader'],
-				},
-				{
-					test: /\.scss$/,
-					use: ['style-loader', 'css-loader', 'sass-loader'],
-				},
-				{
-					test: /\.vue$/,
-					loader: 'vue-loader',
-					exclude: BabelLoaderExcludeNodeModulesExcept([
-						'vue-material-design-icons',
-					]),
-				},
-				{
-					test: /\.js$/,
-					loader: 'babel-loader',
-					// automatically detect necessary packages to
-					// transpile in the node_modules folder
-					exclude: BabelLoaderExcludeNodeModulesExcept([
-						'@nextcloud/dialogs',
-						'@nextcloud/event-bus',
-						'@nextcloud/vue-dashboard',
-						'davclient.js',
-						'nextcloud-vue-collections',
-						'p-finally',
-						'p-limit',
-						'p-locate',
-						'p-queue',
-						'p-timeout',
-						'p-try',
-						'semver',
-						'striptags',
-						'toastify-js',
-						'v-tooltip',
-						'yocto-queue',
-					]),
-				},
-				{
-					test: /\.(png|jpg|gif)$/,
-					loader: 'url-loader',
-					options: {
-						name: '[name].[ext]?[hash]',
-						limit: 8192,
-					},
+module.exports = {
+	entry: modulesToBuild(),
+	output: {
+		// Step away from the src folder and extract to the js folder
+		path: path.join(__dirname),
+		publicPath: '/dist/',
+		filename: (chunkData) => {
+			// Get relative path of the src folder
+			const srcPath = chunkData.chunk.entryModule.context
+			const relativePath = path.relative(__dirname, srcPath)
+
+			// If this is a core source, output in core dist folder
+			if (relativePath.indexOf('core/src') > -1) {
+				return path.join('core/js/dist/', '[name].js?v=[contenthash]')
+			}
+			// Get out of the shared dist folder and output inside apps js folder
+			return path.join(relativePath, '..', 'js') + '/[name].js?v=[contenthash]'
+		},
+		chunkFilename: 'dist/[name]-[id].js?v=[contenthash]',
+	},
+
+	module: {
+		rules: [
+			{
+				test: /\.css$/,
+				use: ['style-loader', 'css-loader'],
+			},
+			{
+				test: /\.scss$/,
+				use: ['style-loader', 'css-loader', 'sass-loader'],
+			},
+			{
+				test: /\.vue$/,
+				loader: 'vue-loader',
+				exclude: BabelLoaderExcludeNodeModulesExcept([
+					'vue-material-design-icons',
+				]),
+			},
+			{
+				test: /\.js$/,
+				loader: 'babel-loader',
+				// automatically detect necessary packages to
+				// transpile in the node_modules folder
+				exclude: BabelLoaderExcludeNodeModulesExcept([
+					'@nextcloud/dialogs',
+					'@nextcloud/event-bus',
+					'@nextcloud/vue-dashboard',
+					'davclient.js',
+					'nextcloud-vue-collections',
+					'p-finally',
+					'p-limit',
+					'p-locate',
+					'p-queue',
+					'p-timeout',
+					'p-try',
+					'semver',
+					'striptags',
+					'toastify-js',
+					'v-tooltip',
+					'yocto-queue',
+				]),
+			},
+			{
+				test: /\.(png|jpe?g|gif|svg|woff2?|eot|ttf)$/,
+				loader: 'url-loader',
+				options: {
+					name: '[name].[ext]?[hash]',
 				},
-				{
-					test: /\.handlebars/,
-					loader: 'handlebars-loader',
-					query: {
-						extensions: '.handlebars',
-					},
+			},
+			{
+				test: /\.handlebars/,
+				loader: 'handlebars-loader',
+				query: {
+					extensions: '.handlebars',
 				},
+			},
 
-			],
-		},
-		plugins: [new VueLoaderPlugin(), new ESLintPlugin()],
-		resolve: {
-			alias: {
-				OC: path.resolve(__dirname, './core/src/OC'),
-				OCA: path.resolve(__dirname, './core/src/OCA'),
-				// make sure to use the handlebar runtime when importing
-				handlebars: 'handlebars/runtime',
+		],
+	},
+
+	optimization: {
+		splitChunks: {
+			automaticNameDelimiter: '-',
+			cacheGroups: {
+				vendors: {
+					test: /[\\/]node_modules[\\/]/,
+					enforce: true,
+					name: 'nextcloud',
+					chunks: 'all',
+				},
 			},
-			extensions: ['*', '.js', '.vue'],
-			symlinks: false,
 		},
-	}, config))
+	},
+
+	plugins: [new VueLoaderPlugin(), new ESLintPlugin()],
+	resolve: {
+		alias: {
+			OC: path.resolve(__dirname, './core/src/OC'),
+			OCA: path.resolve(__dirname, './core/src/OCA'),
+			// make sure to use the handlebar runtime when importing
+			handlebars: 'handlebars/runtime',
+		},
+		extensions: ['*', '.js', '.vue'],
+		symlinks: false,
+	},
+}

+ 5 - 7
webpack.dev.js

@@ -1,9 +1,7 @@
 const { merge } = require('webpack-merge')
-const common = require('./webpack.common.js')
+const config = require('./webpack.common.js')
 
-module.exports = common.map(
-	config => merge(config, {
-		mode: 'development',
-		devtool: 'cheap-source-map',
-	})
-)
+module.exports = merge(config, {
+	mode: 'development',
+	devtool: 'cheap-source-map',
+})

+ 102 - 0
webpack.modules.js

@@ -0,0 +1,102 @@
+/**
+ * @copyright Copyright (c) 2021 John Molakvoæ <skjnldsv@protonmail.com>
+ *
+ * @author John Molakvoæ <skjnldsv@protonmail.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+const path = require('path')
+
+module.exports = {
+	accessibility: {
+		accessibility: path.join(__dirname, 'apps/accessibility/src', 'main.js'),
+		accessibilityoca: path.join(__dirname, 'apps/accessibility/src', 'accessibilityoca.js'),
+	},
+	comments: {
+		comments: path.join(__dirname, 'apps/comments/src', 'comments.js'),
+		'comments-app': path.join(__dirname, 'apps/comments/src', 'comments-app.js'),
+		'comments-tab': path.join(__dirname, 'apps/comments/src', 'comments-tab.js'),
+	},
+	core: {
+		files_client: path.join(__dirname, 'core/src', 'files/client.js'),
+		files_fileinfo: path.join(__dirname, 'core/src', 'files/fileinfo.js'),
+		files_iedavclient: path.join(__dirname, 'core/src', 'files/iedavclient.js'),
+		install: path.join(__dirname, 'core/src', 'install.js'),
+		login: path.join(__dirname, 'core/src', 'login.js'),
+		main: path.join(__dirname, 'core/src', 'main.js'),
+		maintenance: path.join(__dirname, 'core/src', 'maintenance.js'),
+		recommendedapps: path.join(__dirname, 'core/src', 'recommendedapps.js'),
+		'unified-search': path.join(__dirname, 'core/src', 'unified-search.js'),
+		systemtags: path.resolve(__dirname, 'core/src', 'systemtags/merged-systemtags.js'),
+	},
+	dashboard: {
+		'dashboard-main': path.join(__dirname, 'apps/dashboard/src', 'main.js'),
+	},
+	dav: {
+		'settings-admin-caldav': path.join(__dirname, 'apps/dav/src', 'settings.js'),
+	},
+	files: {
+		sidebar: path.join(__dirname, 'apps/files/src', 'sidebar.js'),
+		templates: path.join(__dirname, 'apps/files/src', 'templates.js'),
+		'files-app-settings': path.join(__dirname, 'apps/files/src', 'files-app-settings.js'),
+		'personal-settings': path.join(__dirname, 'apps/files/src', 'main-personal-settings.js'),
+	},
+	files_sharing: {
+		additionalScripts: path.join(__dirname, 'apps/files_sharing/src', 'additionalScripts.js'),
+		collaboration: path.join(__dirname, 'apps/files_sharing/src', 'collaborationresourceshandler.js'),
+		files_sharing_tab: path.join(__dirname, 'apps/files_sharing/src', 'files_sharing_tab.js'),
+		files_sharing: path.join(__dirname, 'apps/files_sharing/src', 'files_sharing.js'),
+		main: path.join(__dirname, 'apps/files_sharing/src', 'index.js'),
+		'personal-settings': path.join(__dirname, 'apps/files_sharing/src', 'personal-settings.js'),
+	},
+	files_trashbin: {
+		files_trashbin: path.join(__dirname, 'apps/files_trashbin/src', 'files_trashbin.js'),
+	},
+	files_versions: {
+		files_versions: path.join(__dirname, 'apps/files_versions/src', 'files_versions.js'),
+	},
+	oauth2: {
+		oauth2: path.join(__dirname, 'apps/oauth2/src', 'main.js'),
+	},
+	settings: {
+		'settings-apps-users-management': path.join(__dirname, 'apps/settings/src', 'main-apps-users-management.js'),
+		'settings-admin-security': path.join(__dirname, 'apps/settings/src', 'main-admin-security.js'),
+		'settings-personal-security': path.join(__dirname, 'apps/settings/src', 'main-personal-security.js'),
+		'settings-personal-webauthn': path.join(__dirname, 'apps/settings/src', 'main-personal-webauth.js'),
+		'settings-nextcloud-pdf': path.join(__dirname, 'apps/settings/src', 'main-nextcloud-pdf.js'),
+		'settings-personal-info': path.join(__dirname, 'apps/settings/src', 'main-personal-info.js'),
+	},
+	systemtags: {
+		systemtags: path.join(__dirname, 'apps/systemtags/src', 'systemtags.js'),
+	},
+	user_status: {
+		'user_status-dashboard': path.join(__dirname, 'apps/user_status/src', 'dashboard.js'),
+		'user_status-menu': path.join(__dirname, 'apps/user_status/src', 'main-user-status-menu.js'),
+	},
+	weather_status: {
+		'weather-status': path.join(__dirname, 'apps/weather_status/src', 'weather-status.js'),
+	},
+	twofactor_backupscodes: {
+		settings: path.join(__dirname, 'apps/twofactor_backupcodes/src', 'settings.js'),
+	},
+	updatenotification: {
+		updatenotification: path.join(__dirname, 'apps/updatenotification/src', 'init.js'),
+	},
+	workflowengine: {
+		workflowengine: path.join(__dirname, 'apps/workflowengine/src', 'workflowengine.js'),
+	},
+}

+ 5 - 7
webpack.prod.js

@@ -1,9 +1,7 @@
 const { merge } = require('webpack-merge')
-const common = require('./webpack.common.js')
+const config = require('./webpack.common.js')
 
-module.exports = common.map(
-	config => merge(config, {
-		mode: 'production',
-		devtool: 'source-map',
-	})
-)
+module.exports = merge(config, {
+	mode: 'production',
+	devtool: 'source-map',
+})