From 7f20d59f9c231fe6f3d776f81b714ba4a34c3b18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Fri, 6 Aug 2021 17:39:01 +0200 Subject: [PATCH] Merge all configs into one MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ (skjnldsv) --- package-lock.json | 29 ++---- package.json | 1 + webpack.common.js | 218 ++++++++++++++++++++++----------------------- webpack.dev.js | 12 ++- webpack.modules.js | 102 +++++++++++++++++++++ webpack.prod.js | 12 ++- 6 files changed, 224 insertions(+), 150 deletions(-) create mode 100644 webpack.modules.js diff --git a/package-lock.json b/package-lock.json index 2b0be31aff4..2e652a74271 100644 --- a/package-lock.json +++ b/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" } diff --git a/package.json b/package.json index e501daf407f..47048cbc7ee 100644 --- a/package.json +++ b/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", diff --git a/webpack.common.js b/webpack.common.js index 97ece513eac..74fbef1aa9e 100644 --- a/webpack.common.js +++ b/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, - }, - }, - { - test: /\.handlebars/, - loader: 'handlebars-loader', - query: { - extensions: '.handlebars', - }, - }, +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]' }, - 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', + 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', + }, + }, + + ], + }, + + 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, + }, +} diff --git a/webpack.dev.js b/webpack.dev.js index 798f34ef4ff..97295dd4ea4 100644 --- a/webpack.dev.js +++ b/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', +}) diff --git a/webpack.modules.js b/webpack.modules.js new file mode 100644 index 00000000000..36bec0ca94f --- /dev/null +++ b/webpack.modules.js @@ -0,0 +1,102 @@ +/** + * @copyright Copyright (c) 2021 John Molakvoæ + * + * @author John Molakvoæ + * + * @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 . + * + */ +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'), + }, +} diff --git a/webpack.prod.js b/webpack.prod.js index e0597e595c6..3c8b032d17f 100644 --- a/webpack.prod.js +++ b/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', +})