Skip to content
Snippets Groups Projects
Select Git revision
  • a28838b8667645fda47df8a0d3911614fd601c35
  • master default
  • feat/info-xml-backends
  • fix/shareapi-l10n
  • fix/missing-RemoteException-class
  • backport/46504/stable28
  • backport/46504/stable29
  • automated/noid/stable29-update-psalm-baseline
  • automated/noid/stable28-update-psalm-baseline
  • feat/46438/provide-feedback-edit-locally
  • fix-getimagesize
  • stable27
  • stable28
  • stable29
  • query-builder-connection
  • feature/request-803
  • autosharding
  • fix/noid/test-samba-with-self-hosted
  • fix/bring-back-forbidden-names
  • fix/htaccess
  • fix/use-filename-validator
  • v28.0.8rc1
  • v29.0.4rc1
  • v27.1.11
  • v28.0.7
  • v29.0.3
  • v28.0.7rc4
  • v29.0.3rc4
  • v29.0.3rc3
  • v28.0.7rc3
  • v27.1.11rc3
  • v27.1.11rc2
  • v28.0.7rc2
  • v29.0.3rc2
  • v27.1.11rc1
  • v28.0.7rc1
  • v29.0.3rc1
  • v29.0.2
  • v27.1.10
  • v29.0.2rc2
  • v29.0.2rc1
41 results

webpack.common.js

Blame
  • webpack.common.js 4.41 KiB
    /* eslint-disable camelcase */
    const { VueLoaderPlugin } = require('vue-loader')
    const path = require('path')
    const BabelLoaderExcludeNodeModulesExcept = require('babel-loader-exclude-node-modules-except')
    const webpack = require('webpack')
    const modules = require('./webpack.modules.js')
    
    const formatOutputFromModules = (modules) => {
    	// merge all configs into one object, and use AppID to generate the fileNames
    	// with the following format:
    	// AppId-fileName: path/to/js-file.js
    	const moduleEntries = Object.keys(modules).map(moduleKey => {
    		const module = modules[moduleKey]
    
    		const entries = Object.keys(module).map(entryKey => {
    			const entry = module[entryKey]
    			return { [`${moduleKey}-${entryKey}`]: entry }
    		})
    
    		return Object.assign({}, ...Object.values(entries))
    	})
    	return Object.assign({}, ...Object.values(moduleEntries))
    }
    
    const modulesToBuild = () => {
    	const MODULE = process.env.MODULE
    	if (MODULE) {
    		if (!modules[MODULE]) {
    			throw new Error(`No module "${MODULE}" found`)
    		}
    		return formatOutputFromModules({
    			[MODULE]: modules[MODULE],
    		})
    	}
    
    	return formatOutputFromModules(modules)
    }
    
    module.exports = {
    	entry: modulesToBuild(),
    	output: {
    		// Step away from the src folder and extract to the js folder
    		path: path.join(__dirname, 'dist'),
    		// Let webpack determine automatically where it's located
    		publicPath: 'auto',
    		filename: '[name].js?v=[contenthash]',
    		chunkFilename: '[name]-[id].js?v=[contenthash]',
    		// Make sure sourcemaps have a proper path and do not
    		// leak local paths https://github.com/webpack/webpack/issues/3603
    		devtoolNamespace: 'nextcloud',
    		devtoolModuleFilenameTemplate(info) {
    			const rootDir = process.cwd()
    			const rel = path.relative(rootDir, info.absoluteResourcePath)
    			return `webpack:///nextcloud/${rel}`
    		},
    		clean: {
    			keep: /icons\.css/, // Keep static icons css
    		},
    	},
    
    	module: {
    		rules: [
    			{
    				test: /davclient/,
    				loader: 'exports-loader',
    				options: {
    					type: 'commonjs',
    					exports: 'dav',
    				},
    			},
    			{
    				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',
    					'emoji-mart-vue-fast',
    				]),
    			},
    			{
    				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)$/,
    				type: 'asset/inline',
    			},
    			{
    				test: /\.handlebars/,
    				loader: 'handlebars-loader',
    			},
    			{
    				resourceQuery: /raw/,
    				type: 'asset/source',
    			},
    		],
    	},
    
    	optimization: {
    		splitChunks: {
    			automaticNameDelimiter: '-',
    			cacheGroups: {
    				vendors: {
    					// split every dependency into one bundle
    					test: /[\\/]node_modules[\\/]/,
    					enforce: true,
    					// necessary to keep this name to properly inject it
    					// see OC_Template.php
    					name: 'core-common',
    					chunks: 'all',
    				},
    			},
    		},
    	},
    
    	plugins: [
    		new VueLoaderPlugin(),
    		new webpack.ProvidePlugin({
    			// Provide jQuery to jquery plugins as some are loaded before $ is exposed globally.
    			// We need to provide the path to node_moduels as otherwise npm link will fail due
    			// to tribute.js checking for jQuery in @nextcloud/vue
    			jQuery: path.resolve(path.join(__dirname, 'node_modules/jquery')),
    
    			// Shim ICAL to prevent using the global object (window.ICAL).
    			// The library ical.js heavily depends on instanceof checks which will
    			// break if two separate versions of the library are used (e.g. bundled one
    			// and global one).
    			ICAL: 'ical.js',
    
    			// https://github.com/webpack/changelog-v5/issues/10
    			Buffer: ['buffer', 'Buffer'],
    		}),
    	],
    	resolve: {
    		alias: {
    			// make sure to use the handlebar runtime when importing
    			handlebars: 'handlebars/runtime',
    		},
    		extensions: ['*', '.js', '.vue'],
    		symlinks: true,
    		fallback: {
    			stream: require.resolve('stream-browserify'),
    			buffer: require.resolve('buffer'),
    		},
    	},
    }