blob: dc6ad08cf5158f723a4f810ba64f0d9affb98e3e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
const AngularTemplateCacheWebpackPlugin = require('angular-templatecache-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const ClosureWebpackPlugin = require('closure-webpack-plugin');
const CopyPlugin = require('copy-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const DependencyListPlugin = require('./plugins/dependency-list-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const webpack = require('webpack');
module.exports = {
bail: true,
mode: 'production',
stats: 'minimal',
output: {
path: __dirname + '/dist',
filename: 'guacamole.[contenthash].js',
},
// Generate source maps
devtool: 'source-map',
// Entry point for the Guacamole webapp is the "index" AngularJS module
entry: './src/app/index/indexModule.js',
module: {
rules: [
// NOTE: This is required in order to parse ES2020 language features,
// like the optional chaining and nullish coalescing operators. It
// specifically needs to operate on the node-modules directory since
// Webpack 4 cannot handle such language features.
{
test: /\.js$/i,
use: {
loader: 'babel-loader',
options: {
presets: [
['@babel/preset-env']
]
}
}
},
// Automatically extract imported CSS for later reference within separate CSS file
{
test: /\.css$/i,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
import: false,
url: false
}
}
]
},
/*
* Necessary to be able to use angular 1 with webpack as explained in https://github.com/webpack/webpack/issues/2049
*/
{
test: require.resolve('angular'),
loader: 'exports-loader',
options: {
type: 'commonjs',
exports: 'single window.angular'
}
}
]
},
optimization: {
minimizer: [
// Minify using Google Closure Compiler
new ClosureWebpackPlugin({ mode: 'STANDARD' }, {
languageIn: 'ECMASCRIPT_2020',
languageOut: 'ECMASCRIPT5',
compilationLevel: 'SIMPLE'
}),
new CssMinimizerPlugin()
],
splitChunks: {
cacheGroups: {
// Bundle CSS as one file
styles: {
name: 'styles',
test: /\.css$/,
chunks: 'all',
enforce: true
}
}
}
},
plugins: [
new AngularTemplateCacheWebpackPlugin({
module: 'templates-main',
root: 'app/',
source: 'src/app/**/*.html',
standalone: true
}),
// Automatically clean out dist/ directory
new CleanWebpackPlugin(),
// Copy static files to dist/
new CopyPlugin([
{ from: 'app/**/*' },
{ from: 'fonts/**/*' },
{ from: 'images/**/*' },
{ from: 'layouts/**/*' },
{ from: 'translations/**/*' },
{ from: 'verifyCachedVersion.js' }
], {
context: 'src/'
}),
// Copy core libraries for global inclusion
new CopyPlugin([
{ from: 'angular/angular.min.js' },
{ from: 'blob-polyfill/Blob.js' },
{ from: 'datalist-polyfill/datalist-polyfill.min.js' },
{ from: 'jquery/dist/jquery.min.js' },
{ from: 'lodash/lodash.min.js' }
], {
context: 'node_modules/'
}),
// Generate index.html from template
new HtmlWebpackPlugin({
inject: false,
template: 'src/index.html'
}),
// Extract CSS from Webpack bundle as separate file
new MiniCssExtractPlugin({
filename: 'guacamole.[contenthash].css',
chunkFilename: '[id].guacamole.[contenthash].css'
}),
// List all bundled node modules for sake of automatic LICENSE file
// generation / sanity checks
new DependencyListPlugin(),
// Automatically require used modules
new webpack.ProvidePlugin({
jstz: 'jstz',
Pickr: '@simonwep/pickr',
saveAs: 'file-saver'
})
],
resolve: {
// Include Node modules and base source tree within search path for
// import/resolve
modules: [
'src',
'node_modules'
]
}
};