|
|
@@ -4,83 +4,90 @@ const merge = require('webpack-merge');
|
|
|
const common = require('./webpack.common.js');
|
|
|
const path = require('path');
|
|
|
const webpack = require('webpack');
|
|
|
-const HtmlWebpackPlugin = require("html-webpack-plugin");
|
|
|
+const HtmlWebpackPlugin = require('html-webpack-plugin');
|
|
|
const CleanWebpackPlugin = require('clean-webpack-plugin');
|
|
|
-const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
|
|
+const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
|
|
|
+const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
|
|
// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
|
|
|
|
|
-module.exports = merge(common, {
|
|
|
- devtool: "cheap-module-source-map",
|
|
|
- mode: 'development',
|
|
|
+module.exports = (env = {}) =>
|
|
|
+ merge(common, {
|
|
|
+ devtool: 'cheap-module-source-map',
|
|
|
+ mode: 'development',
|
|
|
|
|
|
- entry: {
|
|
|
- app: './public/app/index.ts',
|
|
|
- dark: './public/sass/grafana.dark.scss',
|
|
|
- light: './public/sass/grafana.light.scss',
|
|
|
- },
|
|
|
+ entry: {
|
|
|
+ app: './public/app/index.ts',
|
|
|
+ dark: './public/sass/grafana.dark.scss',
|
|
|
+ light: './public/sass/grafana.light.scss',
|
|
|
+ },
|
|
|
|
|
|
- // If we enabled watch option via CLI
|
|
|
- watchOptions: {
|
|
|
- ignored: /node_modules/
|
|
|
- },
|
|
|
+ // If we enabled watch option via CLI
|
|
|
+ watchOptions: {
|
|
|
+ ignored: /node_modules/,
|
|
|
+ },
|
|
|
|
|
|
- module: {
|
|
|
- rules: [
|
|
|
- {
|
|
|
- test: /\.tsx?$/,
|
|
|
- enforce: 'pre',
|
|
|
- exclude: /node_modules/,
|
|
|
- use: {
|
|
|
- loader: 'tslint-loader',
|
|
|
- options: {
|
|
|
- emitErrors: true,
|
|
|
- typeCheck: false,
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- {
|
|
|
- test: /\.tsx?$/,
|
|
|
- exclude: /node_modules/,
|
|
|
- use: {
|
|
|
- loader: 'ts-loader',
|
|
|
- options: {
|
|
|
- transpileOnly: true
|
|
|
+ module: {
|
|
|
+ rules: [
|
|
|
+ {
|
|
|
+ test: /\.tsx?$/,
|
|
|
+ enforce: 'pre',
|
|
|
+ exclude: /node_modules/,
|
|
|
+ use: {
|
|
|
+ loader: 'tslint-loader',
|
|
|
+ options: {
|
|
|
+ emitErrors: true,
|
|
|
+ typeCheck: false,
|
|
|
+ },
|
|
|
},
|
|
|
},
|
|
|
- },
|
|
|
- require('./sass.rule.js')({ sourceMap: false, preserveUrl: false }),
|
|
|
- {
|
|
|
- test: /\.(png|jpg|gif|ttf|eot|svg|woff(2)?)(\?[a-z0-9=&.]+)?$/,
|
|
|
- loader: 'file-loader'
|
|
|
- },
|
|
|
- ]
|
|
|
- },
|
|
|
+ {
|
|
|
+ test: /\.tsx?$/,
|
|
|
+ exclude: /node_modules/,
|
|
|
+ use: {
|
|
|
+ loader: 'ts-loader',
|
|
|
+ options: {
|
|
|
+ transpileOnly: true,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ require('./sass.rule.js')({ sourceMap: false, preserveUrl: false }),
|
|
|
+ {
|
|
|
+ test: /\.(png|jpg|gif|ttf|eot|svg|woff(2)?)(\?[a-z0-9=&.]+)?$/,
|
|
|
+ loader: 'file-loader',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
|
|
|
- plugins: [
|
|
|
- new CleanWebpackPlugin(),
|
|
|
- new MiniCssExtractPlugin({
|
|
|
- filename: "grafana.[name].[hash].css"
|
|
|
- }),
|
|
|
- new HtmlWebpackPlugin({
|
|
|
- filename: path.resolve(__dirname, '../../public/views/error.html'),
|
|
|
- template: path.resolve(__dirname, '../../public/views/error-template.html'),
|
|
|
- inject: false,
|
|
|
- }),
|
|
|
- new HtmlWebpackPlugin({
|
|
|
- filename: path.resolve(__dirname, '../../public/views/index.html'),
|
|
|
- template: path.resolve(__dirname, '../../public/views/index-template.html'),
|
|
|
- inject: 'body',
|
|
|
- chunks: ['manifest', 'vendor', 'app'],
|
|
|
- }),
|
|
|
- new webpack.NamedModulesPlugin(),
|
|
|
- new webpack.HotModuleReplacementPlugin(),
|
|
|
- new webpack.DefinePlugin({
|
|
|
- 'process.env': {
|
|
|
- 'NODE_ENV': JSON.stringify('development')
|
|
|
- }
|
|
|
- }),
|
|
|
- // new BundleAnalyzerPlugin({
|
|
|
- // analyzerPort: 8889
|
|
|
- // })
|
|
|
- ]
|
|
|
-});
|
|
|
+ plugins: [
|
|
|
+ new CleanWebpackPlugin(),
|
|
|
+ env.noTsCheck
|
|
|
+ ? new webpack.DefinePlugin({}) // bogus plugin to satisfy webpack API
|
|
|
+ : new ForkTsCheckerWebpackPlugin({
|
|
|
+ checkSyntacticErrors: true,
|
|
|
+ }),
|
|
|
+ new MiniCssExtractPlugin({
|
|
|
+ filename: 'grafana.[name].[hash].css',
|
|
|
+ }),
|
|
|
+ new HtmlWebpackPlugin({
|
|
|
+ filename: path.resolve(__dirname, '../../public/views/error.html'),
|
|
|
+ template: path.resolve(__dirname, '../../public/views/error-template.html'),
|
|
|
+ inject: false,
|
|
|
+ }),
|
|
|
+ new HtmlWebpackPlugin({
|
|
|
+ filename: path.resolve(__dirname, '../../public/views/index.html'),
|
|
|
+ template: path.resolve(__dirname, '../../public/views/index-template.html'),
|
|
|
+ inject: 'body',
|
|
|
+ chunks: ['manifest', 'vendor', 'app'],
|
|
|
+ }),
|
|
|
+ new webpack.NamedModulesPlugin(),
|
|
|
+ new webpack.HotModuleReplacementPlugin(),
|
|
|
+ new webpack.DefinePlugin({
|
|
|
+ 'process.env': {
|
|
|
+ NODE_ENV: JSON.stringify('development'),
|
|
|
+ },
|
|
|
+ }),
|
|
|
+ // new BundleAnalyzerPlugin({
|
|
|
+ // analyzerPort: 8889
|
|
|
+ // })
|
|
|
+ ],
|
|
|
+ });
|