const path = require('path'); const webpack = require('webpack'); const ProgressPlugin = require('webpack/lib/ProgressPlugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const autoprefixer = require('autoprefixer'); const postcssUrl = require('postcss-url'); const {GlobCopyWebpackPlugin, BaseHrefWebpackPlugin} = require('@angular/cli/plugins/webpack'); const {CommonsChunkPlugin} = require('webpack').optimize; const {AotPlugin} = require('@ngtools/webpack'); var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const nodeModules = path.join(process.cwd(), 'node_modules'); const bundledScripts = [ "script-loader!./node_modules/jquery/dist/jquery.min.js", "script-loader!./node_modules/lodash/lodash.min.js", "script-loader!./node_modules/angular/angular.min.js", "script-loader!./node_modules/restangular/dist/restangular.min.js", "script-loader!./node_modules/jqueryui/jquery-ui.min.js", "script-loader!./node_modules/angular-ui-router/release/angular-ui-router.min.js", "script-loader!./node_modules/angular-filter/dist/angular-filter.min.js", "script-loader!./node_modules/angular-ui-bootstrap/dist/ui-bootstrap.js", "script-loader!./node_modules/angular-ui-bootstrap/dist/ui-bootstrap-tpls.js", "script-loader!./node_modules/angular-resource/angular-resource.min.js", "script-loader!./node_modules/angular-base64/angular-base64.min.js", "script-loader!./node_modules/angular-uuid4/angular-uuid4.min.js", "script-loader!./node_modules/angular-translate/dist/angular-translate.min.js", "script-loader!./node_modules/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js", "script-loader!./node_modules/angular-base64-upload/dist/angular-base64-upload.min.js", "script-loader!./node_modules/angular-ui-notification/dist/angular-ui-notification.min.js", "script-loader!./node_modules/cytoscape/dist/cytoscape.min.js", "script-loader!./node_modules/checklist-model/checklist-model.js", "script-loader!./node_modules/perfect-scrollbar/dist/js/perfect-scrollbar.jquery.min.js", "script-loader!./node_modules/qtip2/dist/jquery.qtip.min.js", "script-loader!./node_modules/@bardit/cytoscape-qtip/cytoscape-qtip.js", "script-loader!./node_modules/js-md5/build/md5.min.js", "script-loader!./node_modules/angular-clipboard/angular-clipboard.js", "script-loader!./node_modules/angular-resizable/angular-resizable.min.js", "script-loader!./node_modules/sdc-angular-dragdrop/src/angular-dragdrop.min.js", "script-loader!./node_modules/angular-tooltips/dist/angular-tooltips.min.js", "script-loader!./node_modules/angular-sanitize/angular-sanitize.min.js" ]; const baseHref = undefined; const deployUrl = undefined; // Arguments pass from webpack const prod = process.argv.indexOf('-p') !== -1; module.exports = function(params) { const webpackCommonConfig = { resolve: { extensions: [ ".ts", ".js", ".less" ], modules: [ "./node_modules" ], alias: { directives: path.join(__dirname, 'app/directives/'), } }, resolveLoader: { modules: [ "./node_modules" ] }, entry: { 'scripts/main': [ './src/main.ts' ], 'scripts/polyfills': [ './src/polyfills.ts' ], 'scripts/vendor': bundledScripts, 'scripts/styles': [ "./src/styles.less" ] }, module: { rules: [ { enforce: "pre", test: /\.js$/, loader: "source-map-loader", exclude: [ path.join(__dirname, 'node_modules') ] }, { test: /\.json$/, loader: "json-loader" }, { test: /\.html$/, loader: "html-loader" }, { exclude: [ path.join(process.cwd(), "src/styles.less") ], test: /\.css$/, loaders: [ "exports-loader?module.exports.toString()", "css-loader?{\"sourceMap\":false,\"importLoaders\":1}", "postcss-loader" ] }, { exclude: [ path.join(process.cwd(), "src/styles.less") ], test: /\.scss$|\.sass$/, loaders: [ "exports-loader?module.exports.toString()", "css-loader?{\"sourceMap\":false,\"importLoaders\":1}", "postcss-loader", "sass-loader" ] }, { exclude: [ path.join(process.cwd(), "src/styles.less") ], test: /\.less$/, loaders: [ "exports-loader?module.exports.toString()", "css-loader?{\"sourceMap\":false,\"importLoaders\":1}", "postcss-loader", "less-loader" ] }, { exclude: [ path.join(process.cwd(), "src/styles.less") ], test: /\.styl$/, loaders: [ "exports-loader?module.exports.toString()", "css-loader?{\"sourceMap\":false,\"importLoaders\":1}", "postcss-loader", "stylus-loader?{\"sourceMap\":false,\"paths\":[]}" ] }, { include: [ path.join(process.cwd(), "src/styles.less") ], test: /\.css$/, loaders: ExtractTextPlugin.extract({ use: [ "css-loader?{\"sourceMap\":false,\"importLoaders\":1}", "postcss-loader" ], fallback: "style-loader", publicPath: "" }) }, { include: [ path.join(process.cwd(), "src/styles.less") ], test: /\.scss$|\.sass$/, loaders: ExtractTextPlugin.extract({ use: [ "css-loader?{\"sourceMap\":false,\"importLoaders\":1}", "postcss-loader", "sass-loader" ], fallback: "style-loader", publicPath: "" }) }, { include: [ path.join(process.cwd(), "src/styles.less") ], test: /\.less$/, loaders: ExtractTextPlugin.extract({ use: [ "css-loader?{\"sourceMap\":false,\"importLoaders\":1}", "postcss-loader", "less-loader" ], fallback: "style-loader", publicPath: "" }) }, { include: [ path.join(process.cwd(), "src/styles.less") ], test: /\.styl$/, loaders: ExtractTextPlugin.extract({ use: [ "css-loader?{\"sourceMap\":false,\"importLoaders\":1}", "postcss-loader", "stylus-loader?{\"sourceMap\":false,\"paths\":[]}" ], fallback: "style-loader", publicPath: "" }) }, { test: /\.ts$/, loader: "@ngtools/webpack" } ] }, plugins: [ new CleanWebpackPlugin(['dist', 'build'], { root: path.join(__dirname, ''), verbose: true, dry: false, exclude: ['shared.js'] }), new webpack.LoaderOptionsPlugin({ debug: false }), new webpack.DefinePlugin({ process: { env: { sdcConfig: prod? '"production"': '"development"' } } }), new webpack.NoEmitOnErrorsPlugin(), new ProgressPlugin(), // new BundleAnalyzerPlugin(), // new HtmlWebpackPlugin({ // template: "./src/index.html", // filename: "./index.html", // hash: false, // inject: true, // compile: true, // favicon: false, // minify: false, // cache: true, // showErrors: true, // chunks: "all", // excludeChunks: [], // title: "Webpack App", // xhtml: true, // chunksSortMode: function sort(left, right) { // let paramsString = params.entryPoints + ''; // let leftString = left.names[0].replace('scripts/',''); // let rightString = right.names[0].replace('scripts/',''); // let leftIndex = paramsString.indexOf(leftString); // let rightindex = paramsString.indexOf(rightString); // //console.log("left: " + leftString + " | leftIndex: " + leftIndex); // //console.log("right: " + rightString + " | rightindex: " + rightindex); // //console.log("result: " + leftIndex-rightindex); // //console.log("----------------------------------------"); // return leftIndex-rightindex; // } // }), new GlobCopyWebpackPlugin({ patterns: [ "assets/preloading.css", "assets/languages", "assets/styles/fonts", "assets/styles/images", "assets/styles/app.css" ], globOptions: { cwd: path.join(process.cwd(), "src"), dot: true, ignore: "**/.gitkeep" } }), new GlobCopyWebpackPlugin({ patterns: [ "configurations" ], globOptions: { cwd: path.join(process.cwd(), ""), dot: true, ignore: "**/.gitkeep" } }), new BaseHrefWebpackPlugin({}), new CommonsChunkPlugin({ name: "scripts/inline", minChunks: null }), new CommonsChunkPlugin({ name: "scripts/vendor", minChunks: (module) => module.resource && module.resource.startsWith(nodeModules), chunks: [ "main" ] }), new ExtractTextPlugin({ filename: "[name].bundle.css", disable: true }), new webpack.LoaderOptionsPlugin({ sourceMap: false, options: { postcss: [ autoprefixer(), postcssUrl({ url: (URL) => { // Only convert absolute URLs, which CSS-Loader won't process into require(). if (!URL.startsWith('/')) { return URL; } // Join together base-href, deploy-url and the original URL. // Also dedupe multiple slashes into single ones. return `/${baseHref || ''}/${deployUrl || ''}/${URL}`.replace(/\/\/+/g, '/'); } }) ], sassLoader: { sourceMap: false, includePaths: [] }, lessLoader: { sourceMap: false }, context: "" } }), new AotPlugin({ mainPath: "main.ts", exclude: [ "**/*.spec.ts" ], tsConfigPath: "src/tsconfig.json", skipCodeGeneration: true }) ], node: { fs: "empty", global: true, crypto: "empty", tls: "empty", net: "empty", process: true, module: false, clearImmediate: false, setImmediate: false } } return webpackCommonConfig; }