Various improvements to webpack/gulp/vscode support (#1617)

* Various improvements to webpack/gulp/vscode support

* Improve vendor webpack config - hopefully fix const/let appearing
This commit is contained in:
Matt Jeanes 2017-10-24 12:47:54 +01:00 committed by Jamie
commit d59be43ca1
21 changed files with 914 additions and 708 deletions

3
.gitignore vendored
View file

@ -241,4 +241,5 @@ _Pvt_Extensions
# CAKE - C# Make # CAKE - C# Make
/Tools/* /Tools/*
*.db-journal

6
src/Ombi/.vscode/extensions.json vendored Normal file
View file

@ -0,0 +1,6 @@
{
"recommendations": [
"Angular.ng-template",
"ms-vscode.csharp"
]
}

View file

@ -1,20 +1,15 @@
{ {
// Use IntelliSense to find out which attributes exist for C# debugging "version": "0.2.0",
// Use hover for the description of the existing attributes "configurations": [
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
"version": "0.2.0",
"configurations": [
{ {
"name": ".NET Core Launch (web)", "name": ".NET Core Launch",
"type": "coreclr", "type": "coreclr",
"request": "launch", "request": "launch",
"preLaunchTask": "build", "preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceRoot}/bin/Debug/netcoreapp2.0/Ombi.dll", "program": "${workspaceRoot}/bin/Debug/netcoreapp2.0/Ombi.dll",
"args": [], "args": [],
"cwd": "${workspaceRoot}", "cwd": "${workspaceRoot}",
"stopAtEntry": false, "stopAtEntry": false,
"internalConsoleOptions": "openOnSessionStart",
"launchBrowser": { "launchBrowser": {
"enabled": true, "enabled": true,
"args": "${auto-detect-url}", "args": "${auto-detect-url}",

View file

@ -1,5 +1,13 @@
{ {
"files.exclude": {
"**/*.js": {"when": "$(basename).ts"},
"**/*.js.map": true,
"node_modules": true,
"obj": true,
"bin": true
},
"typescript.tsdk": "node_modules\\typescript\\lib",
"cSpell.words": [ "cSpell.words": [
"usermanagement" "usermanagement"
] ]
} }

View file

@ -1,15 +1,42 @@
{ {
"version": "0.1.0", // See https://go.microsoft.com/fwlink/?LinkId=733558
"command": "dotnet", // for the documentation about the tasks.json format
"isShellCommand": true, "version": "2.0.0",
"args": [],
"tasks": [ "tasks": [
{ {
"taskName": "build", "taskName": "restore",
"command": "npm",
"type": "shell",
"args": [ "args": [
"${workspaceRoot}/Ombi.csproj" "run-script",
"restore"
],
"problemMatcher": []
},
{
"taskName": "build",
"command": "dotnet",
"type": "shell",
"args": [
"build"
],
"group": {
"isDefault": true,
"kind": "build"
},
"problemMatcher": "$msCompile"
},
{
"taskName": "lint",
"type": "shell",
"command": "npm",
"args": [
"run",
"lint",
"--",
"--format",
"msbuild"
], ],
"isBuildCommand": true,
"problemMatcher": "$msCompile" "problemMatcher": "$msCompile"
} }
] ]

View file

@ -9,6 +9,8 @@ import { enableProdMode } from "@angular/core";
import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"; import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";
import { AppModule } from "./app/app.module"; import { AppModule } from "./app/app.module";
declare var module: any;
if (module.hot) { if (module.hot) {
module.hot.accept(); module.hot.accept();
module.hot.dispose(() => { module.hot.dispose(() => {

View file

@ -5,6 +5,8 @@ import "core-js/es6/string";
import "core-js/es7/reflect"; import "core-js/es7/reflect";
import "zone.js/dist/zone"; import "zone.js/dist/zone";
declare var module: any;
if (module.hot) { if (module.hot) {
Error.stackTraceLimit = Infinity; Error.stackTraceLimit = Infinity;
// tslint:disable:no-var-requires // tslint:disable:no-var-requires

View file

@ -45,7 +45,8 @@ namespace Ombi.Controllers.External
/// <param name="po">The pushover.</param> /// <param name="po">The pushover.</param>
/// <param name="mm">The mattermost.</param> /// <param name="mm">The mattermost.</param>
/// <param name="log">The logger.</param> /// <param name="log">The logger.</param>
/// <param name="provider"></param> /// <param name="provider">The email provider</param>
/// <param name="cpApi">The couch potato API</param>
public TesterController(INotificationService service, IDiscordNotification notification, IEmailNotification emailN, public TesterController(INotificationService service, IDiscordNotification notification, IEmailNotification emailN,
IPushbulletNotification pushbullet, ISlackNotification slack, IPushoverNotification po, IMattermostNotification mm, IPushbulletNotification pushbullet, ISlackNotification slack, IPushoverNotification po, IMattermostNotification mm,
IPlexApi plex, IEmbyApi emby, IRadarrApi radarr, ISonarrApi sonarr, ILogger<TesterController> log, IEmailProvider provider, IPlexApi plex, IEmbyApi emby, IRadarrApi radarr, ISonarrApi sonarr, ILogger<TesterController> log, IEmailProvider provider,

View file

@ -21,6 +21,10 @@
<NoWarn>1701;1702;1705;1591;</NoWarn> <NoWarn>1701;1702;1705;1591;</NoWarn>
<DefineConstants>TRACE;RELEASE;NETCOREAPP2_0</DefineConstants> <DefineConstants>TRACE;RELEASE;NETCOREAPP2_0</DefineConstants>
</PropertyGroup> </PropertyGroup>
<Target Name="NpmCommandsDebug" Condition="'$(Configuration)'=='Debug'" AfterTargets="Build">
<Exec Command="npm run-script vendor" />
</Target>
<ItemGroup> <ItemGroup>
<!-- Files not to show in IDE --> <!-- Files not to show in IDE -->

View file

@ -161,7 +161,8 @@ namespace Ombi
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{ {
HotModuleReplacement = true HotModuleReplacement = true,
ConfigFile = "webpack.dev.js"
}); });
} }

View file

@ -1,5 +1,4 @@
/// <binding BeforeBuild='build' /> 'use strict';
'use strict';
const gulp = require('gulp'); const gulp = require('gulp');
const run = require('gulp-run'); const run = require('gulp-run');
@ -25,35 +24,26 @@ function getEnvOptions() {
} }
gulp.task('vendor', function () { gulp.task('vendor', function () {
return run('webpack --config webpack.config.vendor.js' + getEnvOptions()).exec(); return run('webpack --config webpack.config.vendor.ts' + getEnvOptions()).exec();
}); });
gulp.task('main', function () { gulp.task('main', function () {
return run('webpack --config webpack.config.js' + getEnvOptions()).exec(); return run('webpack --config webpack.config.ts' + getEnvOptions()).exec();
});
gulp.task('test_compile', function () {
return run('webpack boot-tests=./ClientApp/test/boot-tests.ts' + getEnvOptions()).exec();
});
gulp.task('test_run', function () {
return run('karma start ClientApp/test/karma.conf.js').exec();
}); });
gulp.task('prod_var', function () { gulp.task('prod_var', function () {
global.prod = true; global.prod = true;
}); })
gulp.task('analyse_var', function () { gulp.task('analyse_var', function () {
global.analyse = true; global.analyse = true;
}); })
gulp.task('clean', function() { gulp.task('clean', function() {
del.sync(outputDir, { force: true }); del.sync(outputDir, { force: true });
}); });
gulp.task('test', callback => runSequence('test_compile', 'test_run'));
gulp.task('build', callback => runSequence('vendor', 'main', callback)); gulp.task('build', callback => runSequence('vendor', 'main', callback));
gulp.task('analyse', callback => runSequence('analyse_var', 'build')); gulp.task('analyse', callback => runSequence('analyse_var', 'build'));
gulp.task('full', callback => runSequence('clean', 'build')); gulp.task('full', callback => runSequence('clean', 'build'));
gulp.task('publish', callback => runSequence('prod_var', 'build')); gulp.task('publish', callback => runSequence('prod_var', 'build'));

File diff suppressed because it is too large Load diff

View file

@ -5,10 +5,11 @@
"scripts": { "scripts": {
"vendor": "gulp vendor", "vendor": "gulp vendor",
"publish": "gulp publish", "publish": "gulp publish",
"lint": "tslint ClientApp/**/*.ts" "lint": "tslint ClientApp/**/*.ts",
"restore": "dotnet restore && npm install"
}, },
"dependencies": { "dependencies": {
"@angular/animations": "4.4.1", "@angular/animations": "^4.4.6",
"@angular/cdk": "^2.0.0-beta.12", "@angular/cdk": "^2.0.0-beta.12",
"@angular/common": "^4.4.6", "@angular/common": "^4.4.6",
"@angular/compiler": "^4.4.6", "@angular/compiler": "^4.4.6",
@ -22,8 +23,10 @@
"@angular/router": "^4.4.6", "@angular/router": "^4.4.6",
"@ng-bootstrap/ng-bootstrap": "^1.0.0-beta.5", "@ng-bootstrap/ng-bootstrap": "^1.0.0-beta.5",
"@types/core-js": "^0.9.43", "@types/core-js": "^0.9.43",
"@types/extract-text-webpack-plugin": "^3.0.0",
"@types/intro.js": "^2.4.3", "@types/intro.js": "^2.4.3",
"@types/node": "^8.0.46", "@types/node": "^8.0.46",
"@types/webpack": "^3.0.13",
"angular2-jwt": "^0.2.3", "angular2-jwt": "^0.2.3",
"angular2-moment": "^1.7.0", "angular2-moment": "^1.7.0",
"angular2-template-loader": "^0.6.2", "angular2-template-loader": "^0.6.2",
@ -35,10 +38,10 @@
"css": "^2.2.1", "css": "^2.2.1",
"css-loader": "^0.28.7", "css-loader": "^0.28.7",
"del": "^3.0.0", "del": "^3.0.0",
"event-source-polyfill": "^0.0.9", "event-source-polyfill": "^0.0.11",
"expose-loader": "^0.7.3", "expose-loader": "^0.7.3",
"extract-text-webpack-plugin": "^3.0.1", "extract-text-webpack-plugin": "^3.0.1",
"file-loader": "^0.11.2", "file-loader": "^1.1.5",
"font-awesome": "^4.7.0", "font-awesome": "^4.7.0",
"gulp": "^3.9.1", "gulp": "^3.9.1",
"gulp-run": "^1.7.1", "gulp-run": "^1.7.1",
@ -49,7 +52,7 @@
"ng2-cookies": "^1.0.12", "ng2-cookies": "^1.0.12",
"ng2-dragula": "1.5.0", "ng2-dragula": "1.5.0",
"ngx-clipboard": "^8.1.1", "ngx-clipboard": "^8.1.1",
"ngx-infinite-scroll": "^0.5.2", "ngx-infinite-scroll": "^0.6.1",
"node-sass": "^4.5.3", "node-sass": "^4.5.3",
"npm": "^5.5.1", "npm": "^5.5.1",
"pace-progress": "^1.0.2", "pace-progress": "^1.0.2",
@ -58,14 +61,15 @@
"run-sequence": "^2.2.0", "run-sequence": "^2.2.0",
"rxjs": "^5.5.0", "rxjs": "^5.5.0",
"sass-loader": "^6.0.6", "sass-loader": "^6.0.6",
"style-loader": "^0.18.2", "style-loader": "^0.19.0",
"to-string-loader": "^1.1.5", "to-string-loader": "^1.1.5",
"ts-node": "^3.3.0",
"tslint": "^5.8.0", "tslint": "^5.8.0",
"tslint-language-service": "^0.9.6", "tslint-language-service": "^0.9.6",
"typescript": "^2.5.3", "typescript": "^2.5.3",
"uglify-es": "^3.1.5", "uglify-es": "^3.1.5",
"uglifyjs-webpack-plugin": "^1.0.1", "uglifyjs-webpack-plugin": "^1.0.1",
"url-loader": "^0.5.9", "url-loader": "^0.6.2",
"webpack": "^3.8.1", "webpack": "^3.8.1",
"webpack-bundle-analyzer": "^2.9.0", "webpack-bundle-analyzer": "^2.9.0",
"webpack-hot-middleware": "^2.20.0", "webpack-hot-middleware": "^2.20.0",
@ -81,6 +85,6 @@
"karma-chrome-launcher": "2.2.0", "karma-chrome-launcher": "2.2.0",
"karma-cli": "1.0.1", "karma-cli": "1.0.1",
"karma-jasmine": "1.1.0", "karma-jasmine": "1.1.0",
"karma-webpack": "2.0.4" "karma-webpack": "2.0.5"
} }
} }

View file

@ -17,6 +17,7 @@
"emitDecoratorMetadata": true, "emitDecoratorMetadata": true,
"experimentalDecorators": true, "experimentalDecorators": true,
"skipLibCheck": true, "skipLibCheck": true,
"noEmit": true,
"plugins": [ "plugins": [
{ {
"name": "tslint-language-service", "name": "tslint-language-service",

View file

@ -5,12 +5,5 @@ declare var require: any;
declare var localStorage: any; declare var localStorage: any;
declare var introJs: any; declare var introJs: any;
declare module "*.css" { declare module "webpack-bundle-analyzer";
let string: string; declare module "uglifyjs-webpack-plugin";
export default string;
}
declare module "*.html" {
let string: string;
export default string;
}

View file

@ -1,2 +1 @@
/// <reference path="globals/globals.d.ts" /> /// <reference path="globals/globals.d.ts" />
/// <reference path="../node_modules/@types/intro.js/index.d.ts" />

View file

@ -1,59 +0,0 @@
const path = require('path');
const webpack = require('webpack');
const CheckerPlugin = require('awesome-typescript-loader').CheckerPlugin;
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
module.exports = function (env) {
const extractCSS = new ExtractTextPlugin('main.css');
const prod = env && env.prod;
console.log(prod ? 'Production' : 'Dev' + ' main build');
const analyse = env && env.analyse;
if (analyse) { console.log("Analysing build"); }
const cssLoader = prod ? 'css-loader?minimize' : 'css-loader';
const outputDir = './wwwroot/dist';
const bundleConfig = {
entry: { 'main': './ClientApp/main.ts' },
stats: { modules: false },
context: __dirname,
resolve: { extensions: ['.ts', '.js'] },
devtool: prod ? 'source-map' : 'eval-source-map',
output: {
filename: '[name].js',
publicPath: '/dist/',
path: path.join(__dirname, outputDir)
},
module: {
rules: [
{ test: /\.ts$/, include: /ClientApp/, use: ['awesome-typescript-loader?silent=true', 'angular2-template-loader'] },
{ test: /\.html$/, use: 'html-loader?minimize=false' },
{ test: /\.css$/, use: ['to-string-loader', cssLoader] },
{ test: /\.scss$/, include: /ClientApp(\\|\/)app/, use: ["to-string-loader", cssLoader, "sass-loader"] },
{ test: /\.scss$/, include: /ClientApp(\\|\/)styles/, use: ["style-loader", cssLoader, "sass-loader"] },
{ test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=25000' }
]
},
plugins: [
new CheckerPlugin(),
extractCSS,
new webpack.DllReferencePlugin({
context: __dirname,
manifest: require(path.join(__dirname, outputDir, 'vendor-manifest.json'))
})
].concat(prod ? [
// Plugins that apply in production builds only
new UglifyJSPlugin()
] : [
// Plugins that apply in development builds only
]).concat(analyse ? [
new BundleAnalyzerPlugin({
analyzerMode: 'static',
reportFilename: 'main.html',
openAnalyzer: false
})
] : [])
};
return bundleConfig;
};

View file

@ -0,0 +1,57 @@
import { CheckerPlugin } from "awesome-typescript-loader";
import * as path from "path";
import * as UglifyJSPlugin from "uglifyjs-webpack-plugin";
import { BundleAnalyzerPlugin } from "webpack-bundle-analyzer";
import * as webpack from "webpack";
module.exports = (env: any) => {
const prod = env && env.prod as boolean;
console.log(prod ? "Production" : "Dev" + " main build");
const analyse = env && env.analyse as boolean;
if (analyse) { console.log("Analysing build"); }
const cssLoader = prod ? "css-loader?-url&minimize" : "css-loader?-url";
const outputDir = "./wwwroot/dist";
const bundleConfig: webpack.Configuration = {
entry: { main: "./ClientApp/main.ts" },
stats: { modules: false },
context: __dirname,
resolve: { extensions: [".ts", ".js"] },
devtool: prod ? "source-map" : "eval-source-map",
output: {
filename: "[name].js",
publicPath: "/dist/",
path: path.join(__dirname, outputDir),
},
module: {
rules: [
{ test: /\.ts$/, include: /ClientApp/, use: ["awesome-typescript-loader?silent=true", "angular2-template-loader"] },
{ test: /\.html$/, use: "html-loader?minimize=false" },
{ test: /\.css$/, use: ["to-string-loader", cssLoader] },
{ test: /\.scss$/, include: /ClientApp(\\|\/)app/, use: ["to-string-loader", cssLoader, "sass-loader"] },
{ test: /\.scss$/, include: /ClientApp(\\|\/)styles/, use: ["style-loader", cssLoader, "sass-loader"] },
{ test: /\.(png|jpg|jpeg|gif|svg)$/, use: "url-loader?limit=25000" },
],
},
plugins: [
new CheckerPlugin(),
new webpack.DllReferencePlugin({
context: __dirname,
manifest: require(path.join(__dirname, outputDir, "vendor-manifest.json")),
}),
].concat(prod ? [
// Plugins that apply in production builds only
new UglifyJSPlugin({ sourceMap: true }),
] : [
// Plugins that apply in development builds only
]).concat(analyse ? [
new BundleAnalyzerPlugin({
analyzerMode: "static",
reportFilename: "main.html",
openAnalyzer: false,
}),
] : []),
};
return bundleConfig;
};

View file

@ -1,98 +0,0 @@
const path = require('path');
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
module.exports = function (env) {
const extractCSS = new ExtractTextPlugin('vendor.css');
const prod = env && env.prod;
console.log(prod ? 'Production' : 'Dev' + ' vendor build');
const analyse = env && env.analyse;
if (analyse) { console.log("Analysing build") };
const outputDir = './wwwroot/dist';
const bundleConfig = {
stats: { modules: false },
resolve: { extensions: ['.js'] },
module: {
rules: [
{ test: /\.(png|woff|woff2|eot|ttf|svg|gif)(\?|$)/, use: 'url-loader?limit=100000' },
{ test: /\.css(\?|$)/, use: extractCSS.extract({ use: prod ? 'css-loader?minimize' : 'css-loader' }) },
{ test: /\.scss(\?|$)/, use: extractCSS.extract({ use: [prod ? 'css-loader?minimize' : 'css-loader', 'sass-loader'] }) }
]
},
entry: {
vendor: [
'@angular/animations',
'@angular/common',
'@angular/compiler',
'@angular/core',
'@angular/forms',
'@angular/http',
'@angular/platform-browser',
'@angular/platform-browser-dynamic',
'@angular/router',
'@angular/material',
'primeng/resources/primeng.min.css',
'primeng/resources/themes/omega/theme.css',
'@angular/material/prebuilt-themes/deeppurple-amber.css',
'event-source-polyfill',
'jquery',
'zone.js',
'primeng/primeng',
'reflect-metadata',
'core-js',
'angular2-jwt',
'bootstrap/dist/js/bootstrap',
'font-awesome/scss/font-awesome.scss',
'pace-progress',
'pace-progress/themes/orange/pace-theme-flash.css',
'intro.js-mit/intro.js',
'intro.js-mit/introjs.css',
'ngx-clipboard',
'bootswatch/superhero/bootstrap.min.css',
'style-loader',
'ng2-cookies',
//'ng2-dragula',
//'dragula/dist/dragula.min.css'
]
},
output: {
publicPath: '/dist/',
filename: '[name].js',
library: '[name]_[hash]',
path: path.join(__dirname, outputDir)
},
node: {
fs: "empty",
},
resolve: {
alias: {
pace: 'pace-progress'
}
},
plugins: [
new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', Hammer: 'hammerjs/hammer' }), // Global identifiers
new webpack.ContextReplacementPlugin(/\@angular\b.*\b(bundles|linker)/, path.join(__dirname, './ClientApp')), // Workaround for https://github.com/angular/angular/issues/11580
new webpack.ContextReplacementPlugin(/angular(\\|\/)core(\\|\/)@angular/, path.join(__dirname, './ClientApp')), // Workaround for https://github.com/angular/angular/issues/14898
new webpack.IgnorePlugin(/^vertx$/), // Workaround for https://github.com/stefanpenner/es6-promise/issues/100
extractCSS,
new webpack.DllPlugin({
path: path.join(__dirname, outputDir, '[name]-manifest.json'),
name: '[name]_[hash]'
})
].concat(prod ? [
// Plugins that apply in production builds only
new UglifyJSPlugin()
] : [
// Plugins that apply in development builds only
]).concat(analyse ? [
new BundleAnalyzerPlugin({
analyzerMode: 'static',
reportFilename: 'vendor.html',
openAnalyzer: false
})
] : [])
};
return bundleConfig;
}

View file

@ -0,0 +1,103 @@
import * as ExtractTextPlugin from "extract-text-webpack-plugin";
import * as path from "path";
import * as UglifyJSPlugin from "uglifyjs-webpack-plugin";
import * as webpack from "webpack";
import { BundleAnalyzerPlugin } from "webpack-bundle-analyzer";
module.exports = (env: any) => {
const extractCSS = new ExtractTextPlugin("vendor.css");
const prod = env && env.prod as boolean;
console.log(prod ? "Production" : "Dev" + " vendor build");
const analyse = env && env.analyse as boolean;
if (analyse) { console.log("Analysing build"); }
const outputDir = "./wwwroot/dist";
const bundleConfig = {
stats: { modules: false },
resolve: {
extensions: [".js"],
alias: {
pace: "pace-progress",
},
},
module: {
rules: [
{ test: /\.(png|woff|woff2|eot|ttf|svg|gif)(\?|$)/, use: "url-loader?limit=100000" },
{ test: /\.css(\?|$)/, use: extractCSS.extract({ use: prod ? "css-loader?minimize" : "css-loader" }) },
{ test: /\.scss(\?|$)/, use: extractCSS.extract({ use: [prod ? "css-loader?minimize" : "css-loader", "sass-loader"] }) },
],
},
entry: {
vendor: [
"pace-progress/themes/orange/pace-theme-flash.css",
"primeng/resources/primeng.min.css",
"@angular/material/prebuilt-themes/deeppurple-amber.css",
"font-awesome/scss/font-awesome.scss",
"intro.js-mit/introjs.css",
"bootswatch/superhero/bootstrap.min.css",
"@angular/animations",
"@angular/common",
"@angular/compiler",
"@angular/core",
"@angular/forms",
"@angular/http",
"@angular/platform-browser",
"@angular/platform-browser/animations",
"@angular/platform-browser-dynamic",
"@angular/router",
"@angular/material",
"@angular/cdk",
"pace-progress",
"primeng/primeng",
"jquery",
"zone.js",
"reflect-metadata",
"core-js",
"rxjs",
"css-loader/lib/css-base",
"core-js/es6/string",
"core-js/es6/array",
"core-js/es6/object",
"core-js/es7/reflect",
"hammerjs",
"event-source-polyfill",
"bootstrap/dist/js/bootstrap",
"intro.js-mit/intro.js",
"ngx-clipboard",
"angular2-jwt",
"ng2-cookies",
],
},
output: {
publicPath: "/dist/",
filename: "[name].js",
library: "[name]_[hash]",
path: path.join(__dirname, outputDir),
},
node: {
fs: "empty",
},
plugins: [
new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery", Hammer: "hammerjs/hammer" }), // Global identifiers
new webpack.ContextReplacementPlugin(/\@angular\b.*\b(bundles|linker)/, path.join(__dirname, "./ClientApp")), // Workaround for https://github.com/angular/angular/issues/11580
new webpack.ContextReplacementPlugin(/angular(\\|\/)core(\\|\/)@angular/, path.join(__dirname, "./ClientApp")), // Workaround for https://github.com/angular/angular/issues/14898
extractCSS,
new webpack.DllPlugin({
path: path.join(__dirname, outputDir, "[name]-manifest.json"),
name: "[name]_[hash]",
}),
].concat(prod ? [
// Plugins that apply in production builds only
new UglifyJSPlugin(),
] : [
// Plugins that apply in development builds only
]).concat(analyse ? [
new BundleAnalyzerPlugin({
analyzerMode: "static",
reportFilename: "vendor.html",
openAnalyzer: false,
}),
] : []),
};
return bundleConfig;
};

4
src/Ombi/webpack.dev.js Normal file
View file

@ -0,0 +1,4 @@
// https://github.com/aspnet/JavaScriptServices/issues/1046
require('ts-node/register')
module.exports = require("./webpack.config.ts");