blob: 768e7f3b5353cd03916500cfcb8ebca7724e62a7 [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 webpack = require('webpack');
const path = require('path');
const ManifestPlugin = require('webpack-manifest-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
// Input Directory (airflow/www)
// noinspection JSUnresolvedVariable
const STATIC_DIR = path.resolve(__dirname, './static');
// Output Directory (airflow/www/static/dist)
// noinspection JSUnresolvedVariable
const BUILD_DIR = path.resolve(__dirname, './static/dist');
const config = {
entry: {
connectionForm: `${STATIC_DIR}/js/connection_form.js`,
base: `${STATIC_DIR}/js/base.js`,
ie: `${STATIC_DIR}/js/ie.js`,
graph: `${STATIC_DIR}/js/graph.js`,
ganttChartD3v2: `${STATIC_DIR}/js/gantt-chart-d3v2.js`,
main: `${STATIC_DIR}/css/main.css`,
airflowDefaultTheme: `${STATIC_DIR}/css/bootstrap-theme.css`,
},
output: {
path: BUILD_DIR,
filename: '[name].[chunkhash].js',
chunkFilename: '[name].[chunkhash].js',
},
resolve: {
extensions: [
'.js',
'.jsx',
'.css',
],
},
module: {
rules: [
{
test: /datatables\.net.*/,
loader: 'imports-loader?define=>false',
},
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
},
// Extract css files
{
test: /\.css$/,
include: STATIC_DIR,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
],
},
/* for css linking images */
{
test: /\.png$/,
loader: 'url-loader?limit=100000',
},
{
test: /\.jpg$/,
loader: 'file-loader',
},
{
test: /\.gif$/,
loader: 'file-loader',
},
/* for font-awesome */
{
test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loader: 'url-loader?limit=10000&mimetype=application/font-woff',
},
{
test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loader: 'file-loader',
},
],
},
plugins: [
new ManifestPlugin(),
new CleanWebpackPlugin(['static/dist']),
new MiniCssExtractPlugin({ filename: '[name].[chunkhash].css' }),
// MomentJS loads all the locale, making it a huge JS file.
// This will ignore the locales from momentJS
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify(process.env.NODE_ENV),
},
}),
// Since we have all the dependencies separated from hard-coded JS within HTML,
// this seems like an efficient solution for now. Will update that once
// we'll have the dependencies imported within the custom JS
new CopyWebpackPlugin([
{ from: 'node_modules/nvd3/build/*.min.*', flatten: true },
// Update this when upgrade d3 package, as the path in new D3 is different
{ from: 'node_modules/d3/d3.min.*', flatten: true },
{ from: 'node_modules/dagre-d3/dist/*.min.*', flatten: true },
{ from: 'node_modules/d3-tip/dist/index.js', to: 'd3-tip.js', flatten: true },
{ from: 'node_modules/bootstrap-3-typeahead/*min.*', flatten: true },
{
from: 'node_modules/bootstrap-toggle/**/*bootstrap-toggle.min.*',
flatten: true,
},
{ from: 'node_modules/datatables.net/**/**.min.*', flatten: true },
{ from: 'node_modules/datatables.net-bs/**/**.min.*', flatten: true },
], { copyUnmodified: true }),
],
};
module.exports = config;