From d657dd53fc6dfa270c24459c3cbaae8c753178b8 Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 1 Dec 2016 12:07:47 -0600 Subject: [PATCH 1/6] Add tslint-loader dependency. Upgrade dependencies. --- package.json | 52 +++++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index b693aac985..89f6eef5ad 100644 --- a/package.json +++ b/package.json @@ -30,17 +30,17 @@ "lint": "tslint \"src/**/*.ts\" || true" }, "dependencies": { - "@angular/common": "~2.1.2", - "@angular/compiler": "~2.1.2", - "@angular/compiler-cli": "~2.1.2", - "@angular/core": "~2.1.2", - "@angular/forms": "~2.1.2", - "@angular/http": "~2.1.2", - "@angular/platform-browser": "~2.1.2", - "@angular/platform-browser-dynamic": "~2.1.2", - "@angular/platform-server": "~2.1.2", - "@angular/router": "~3.1.2", - "@angular/upgrade": "~2.1.2", + "@angular/common": "~2.2.4", + "@angular/compiler": "~2.2.4", + "@angular/compiler-cli": "~2.2.4", + "@angular/core": "~2.2.4", + "@angular/forms": "~2.2.4", + "@angular/http": "~2.2.4", + "@angular/platform-browser": "~2.2.4", + "@angular/platform-browser-dynamic": "~2.2.4", + "@angular/platform-server": "~2.2.4", + "@angular/router": "~3.2.4", + "@angular/upgrade": "~2.2.4", "@angularclass/bootloader": "~1.0.1", "@angularclass/idle-preload": "~1.0.4", "angular2-express-engine": "~2.1.0-rc.1", @@ -60,23 +60,24 @@ }, "devDependencies": { "@ngtools/webpack": "~1.1.7", - "@types/body-parser": "0.0.29", - "@types/compression": "0.0.29", - "@types/cookie-parser": "^1.3.29", - "@types/express": "^4.0.32", - "@types/express-serve-static-core": "^4.0.33", - "@types/hammerjs": "^2.0.32", + "@types/body-parser": "0.0.33", + "@types/compression": "0.0.33", + "@types/cookie-parser": "^1.3.30", + "@types/express": "^4.0.34", + "@types/express-serve-static-core": "^4.0.39", + "@types/hammerjs": "^2.0.33", "@types/memory-cache": "0.0.29", - "@types/mime": "0.0.28", + "@types/mime": "0.0.29", "@types/morgan": "^1.7.32", - "@types/node": "^6.0.38", - "@types/serve-static": "^1.7.27", + "@types/node": "^6.0.51", + "@types/serve-static": "^1.7.31", "@types/webfontloader": "^1.6.27", "accepts": "^1.3.3", - "angular2-template-loader": "^0.4.0", + "angular2-template-loader": "^0.6.0", "awesome-typescript-loader": "^2.2.4", - "codelyzer": "1.0.0-beta.3", + "codelyzer": "2.0.0-beta.1", "cookie-parser": "^1.4.3", + "copy-webpack-plugin": "~4.0.1", "express-interceptor": "^1.2.0", "iltorb": "^1.0.13", "imports-loader": "^0.6.5", @@ -91,13 +92,14 @@ "string-replace-loader": "^1.0.5", "ts-helpers": "^1.1.2", "ts-node": "^1.3.0", - "tslint": "3.13.0", - "typescript": "2.0.2", + "tslint": "4.0.2", + "tslint-loader": "3.2.1", + "typescript": "2.0.10", "v8-lazy-parse-webpack-plugin": "^0.3.0", "webpack": "2.1.0-beta.27", "webpack-bundle-analyzer": "1.4.1", "webpack-dev-middleware": "^1.8.4", "webpack-dev-server": "2.1.0-beta.11", - "webpack-merge": "~0.16.0" + "webpack-merge": "~1.0.2" } } From d48b7524a10ebfef5e24de2cf52a201ad0647280 Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 1 Dec 2016 12:11:30 -0600 Subject: [PATCH 2/6] Start with recommended configurations based of Style Guide. --- tslint.json | 107 +++++++--------------------------------------------- 1 file changed, 14 insertions(+), 93 deletions(-) diff --git a/tslint.json b/tslint.json index 0ca77a12c6..3561fe78ed 100644 --- a/tslint.json +++ b/tslint.json @@ -2,102 +2,19 @@ "rulesDirectory": [ "node_modules/codelyzer" ], - "rules":{ - "class-name": true, - "comment-format": [ + "rules": { + "directive-selector": [ true, - "check-space" + "attribute", + "prometheus", + "camelCase" ], - "curly": true, - "eofline": true, - "forin": true, - "indent": [ + "component-selector": [ true, - "spaces" + "element", + "prometheus", + "kebab-case" ], - "label-position": true, - "label-undefined": true, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - "static-before-instance", - "variables-before-functions" - ], - "no-arg": true, - "no-bitwise": true, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-construct": true, - "no-debugger": true, - "no-duplicate-key": true, - "no-duplicate-variable": true, - "no-empty": false, - "no-eval": true, - "no-inferrable-types": true, - "no-shadowed-variable": true, - "no-string-literal": false, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unused-expression": true, - "no-unused-variable": true, - "no-unreachable": true, - "no-use-before-declare": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "quotemark": [ - true, - "single" - ], - "radix": true, - "semicolon": [ - "always" - ], - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "variable-name": false, - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ], - "directive-selector-prefix": [true, "ds"], - "component-selector-prefix": [true, "ds"], - "directive-selector-name": [true, "camelCase"], - "component-selector-name": [true, "kebab-case"], - "directive-selector-type": [true, "attribute"], - "component-selector-type": [true, "element"], "use-input-property-decorator": true, "use-output-property-decorator": true, "use-host-property-decorator": true, @@ -107,7 +24,11 @@ "no-forward-ref": true, "use-life-cycle-interface": true, "use-pipe-transform-interface": true, - "pipe-naming": [true, "camelCase", "ds"], + "pipe-naming": [ + true, + "camelCase", + "prometheus" + ], "component-class-suffix": true, "directive-class-suffix": true, "import-destructuring-spacing": true, From 79b9bacd5a5b96b6994a47d8de07c415d7a0fb35 Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 1 Dec 2016 12:12:14 -0600 Subject: [PATCH 3/6] Add tslint-loader with pre enforced. Add to loader options plugin. --- webpack.config.ts | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/webpack.config.ts b/webpack.config.ts index 436d22515e..a6249585c2 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -15,7 +15,12 @@ export var commonPlugins = [ // Loader options new webpack.LoaderOptionsPlugin({ - + options: { + tslint: { + emitErrors: false, + failOnHint: false + }, + } }), ]; @@ -24,7 +29,7 @@ export var commonConfig = { devtool: 'source-map', resolve: { extensions: ['.ts', '.js', '.json'], - modules: [ root('node_modules') ] + modules: [root('node_modules')] }, context: __dirname, output: { @@ -34,11 +39,17 @@ export var commonConfig = { module: { rules: [ // TypeScript - { test: /\.ts$/, use: ['awesome-typescript-loader', 'angular2-template-loader'] }, + { test: /\.ts$/, use: ['awesome-typescript-loader', 'angular2-template-loader'] }, { test: /\.html$/, use: 'raw-loader' }, - { test: /\.css$/, use: 'raw-loader' }, - { test: /\.scss$/, use: ['raw-loader', 'sass-loader'] }, - { test: /\.json$/, use: 'json-loader' } + { test: /\.css$/, use: 'raw-loader' }, + { test: /\.scss$/, use: ['raw-loader', 'sass-loader'] }, + { test: /\.json$/, use: 'json-loader' }, + { + enforce: 'pre', + test: /\.ts?$/, + use: 'tslint-loader', + exclude: /(node_modules)/, + } ], }, plugins: [ From 9e967287614295903c6f29dc0465d8b5add79d57 Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 1 Dec 2016 12:25:26 -0600 Subject: [PATCH 4/6] Use dspace as a prefix for directives, component, and pipes. --- tslint.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tslint.json b/tslint.json index 3561fe78ed..c84aa07ebb 100644 --- a/tslint.json +++ b/tslint.json @@ -6,13 +6,13 @@ "directive-selector": [ true, "attribute", - "prometheus", + "dspace", "camelCase" ], "component-selector": [ true, "element", - "prometheus", + "dspace", "kebab-case" ], "use-input-property-decorator": true, @@ -27,7 +27,7 @@ "pipe-naming": [ true, "camelCase", - "prometheus" + "dspace" ], "component-class-suffix": true, "directive-class-suffix": true, From 47b2de2aa4406a4e54cba875b7af2b4b81047db0 Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 1 Dec 2016 12:32:54 -0600 Subject: [PATCH 5/6] Formatted files. Using ds as prefix instead of dspace. --- README.md | 4 ---- nodemon.json | 2 +- src/__workaround.browser.ts | 10 +++++----- src/__workaround.node.ts | 22 +++++++++++----------- src/angular2-meta.ts | 6 +++--- src/app/app.component.ts | 2 +- src/app/app.module.ts | 2 +- src/app/home/home.component.ts | 2 +- src/app/shared/api.service.ts | 6 +++--- src/app/shared/cache.service.ts | 2 +- src/app/shared/model/model.service.ts | 8 ++++---- src/assets/logo.png | Bin 22394 -> 0 bytes src/backend/api.ts | 16 ++++++++-------- src/browser.module.ts | 2 +- src/index.html | 3 +++ src/node.module.ts | 8 ++++---- src/server.aot.ts | 18 +++++++++--------- src/server.ts | 6 +++--- src/typings.d.ts | 8 ++++---- tsconfig.aot.json | 4 +++- tsconfig.json | 4 +++- tslint.json | 6 +++--- webpack.prod.config.ts | 6 +++--- 23 files changed, 75 insertions(+), 72 deletions(-) delete mode 100644 src/assets/logo.png diff --git a/README.md b/README.md index 50352981ab..0052719a67 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,3 @@ Currently this contains the [Angular 2 Universal Starter](https://github.com/ang ## AoT and Prod - `npm run build:prod:ngc` to compile the ngfactory files and build prod - - - - diff --git a/nodemon.json b/nodemon.json index 97a836fbb5..7c50f34761 100644 --- a/nodemon.json +++ b/nodemon.json @@ -3,5 +3,5 @@ "dist", "src/index.html" ], - "ext" : "js ts json html" + "ext": "js ts json html" } diff --git a/src/__workaround.browser.ts b/src/__workaround.browser.ts index 026f505fa3..939d7a5883 100644 --- a/src/__workaround.browser.ts +++ b/src/__workaround.browser.ts @@ -8,14 +8,14 @@ let __compiler__ = require('@angular/compiler'); import { __platform_browser_private__ } from '@angular/platform-browser'; import { __core_private__ } from '@angular/core'; if (!__core_private__['ViewUtils']) { - __core_private__['ViewUtils'] = __core_private__['view_utils']; + __core_private__['ViewUtils'] = __core_private__['view_utils']; } if (__compiler__ && __compiler__.SelectorMatcher && __compiler__.CssSelector) { - (__compiler__).__compiler_private__ = { - SelectorMatcher: __compiler__.SelectorMatcher, - CssSelector: __compiler__.CssSelector - } + (__compiler__).__compiler_private__ = { + SelectorMatcher: __compiler__.SelectorMatcher, + CssSelector: __compiler__.CssSelector + } } diff --git a/src/__workaround.node.ts b/src/__workaround.node.ts index ed39c8d319..61e1f665de 100644 --- a/src/__workaround.node.ts +++ b/src/__workaround.node.ts @@ -9,25 +9,25 @@ import { __platform_browser_private__ } from '@angular/platform-browser'; import { __core_private__ } from '@angular/core'; let patch = false; if (!__core_private__['ViewUtils']) { - patch = true; - __core_private__['ViewUtils'] = __core_private__['view_utils']; + patch = true; + __core_private__['ViewUtils'] = __core_private__['view_utils']; } if (__compiler__ && __compiler__.SelectorMatcher && __compiler__.CssSelector) { - patch = true; - (__compiler__).__compiler_private__ = { - SelectorMatcher: __compiler__.SelectorMatcher, - CssSelector: __compiler__.CssSelector - } + patch = true; + (__compiler__).__compiler_private__ = { + SelectorMatcher: __compiler__.SelectorMatcher, + CssSelector: __compiler__.CssSelector + } } if (patch) { - var __universal__ = require('angular2-platform-node/__private_imports__'); - __universal__.ViewUtils = __core_private__['view_utils']; - __universal__.CssSelector = __universal__.CssSelector || __compiler__.CssSelector; - __universal__.SelectorMatcher = __universal__.SelectorMatcher || __compiler__.SelectorMatcher; + var __universal__ = require('angular2-platform-node/__private_imports__'); + __universal__.ViewUtils = __core_private__['view_utils']; + __universal__.CssSelector = __universal__.CssSelector || __compiler__.CssSelector; + __universal__.SelectorMatcher = __universal__.SelectorMatcher || __compiler__.SelectorMatcher; } // Fix Material Support diff --git a/src/angular2-meta.ts b/src/angular2-meta.ts index f961d9e4fe..dcce3c2cb5 100644 --- a/src/angular2-meta.ts +++ b/src/angular2-meta.ts @@ -6,9 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -import {Injectable} from '@angular/core'; +import { Injectable } from '@angular/core'; // es6-modules are used here -import {DomAdapter, getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; +import { DomAdapter, getDOM } from '@angular/platform-browser/src/dom/dom_adapter'; /** * Represent meta element. @@ -69,7 +69,7 @@ export class Meta { * @param tags * @returns {HTMLMetaElement[]} */ - addTags(...tags: Array): HTMLMetaElement[] { + addTags(...tags: Array): HTMLMetaElement[] { const presentTags = this._flattenArray(tags); if (presentTags.length === 0) return []; return presentTags.map((tag: MetaDefinition) => this._addInternal(tag)); diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 8951b4881e..f73ec3d908 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -5,7 +5,7 @@ import { Component, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/ encapsulation: ViewEncapsulation.Emulated, selector: 'ds-app', templateUrl: './app.component.html', - styleUrls: [ './app.component.scss' ] + styleUrls: ['./app.component.scss'] }) export class AppComponent { } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 515d51c6b4..8defafd570 100755 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -8,7 +8,7 @@ import { AppComponent } from './app.component'; @NgModule({ - declarations: [ AppComponent ], + declarations: [AppComponent], imports: [ SharedModule, HomeModule, diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts index 1f71493173..71d5be23ff 100644 --- a/src/app/home/home.component.ts +++ b/src/app/home/home.component.ts @@ -4,7 +4,7 @@ import { Component, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/ changeDetection: ChangeDetectionStrategy.Default, encapsulation: ViewEncapsulation.Emulated, selector: 'ds-home', - styleUrls: [ './home.component.css' ], + styleUrls: ['./home.component.css'], templateUrl: './home.component.html' }) export class HomeComponent { diff --git a/src/app/shared/api.service.ts b/src/app/shared/api.service.ts index b2228729b7..5487bd5a36 100644 --- a/src/app/shared/api.service.ts +++ b/src/app/shared/api.service.ts @@ -11,9 +11,9 @@ export class ApiService { } - /** - * whatever domain/feature method name - */ + /** + * whatever domain/feature method name + */ get(url: string, options?: any) { return this._http.get(url, options) .map(res => res.json()) diff --git a/src/app/shared/cache.service.ts b/src/app/shared/cache.service.ts index 87780632e5..1268c90410 100644 --- a/src/app/shared/cache.service.ts +++ b/src/app/shared/cache.service.ts @@ -4,7 +4,7 @@ import { Inject, Injectable, isDevMode } from '@angular/core'; export class CacheService { static KEY = 'CacheService'; - constructor(@Inject('LRU') public _cache: Map) { + constructor( @Inject('LRU') public _cache: Map) { } diff --git a/src/app/shared/model/model.service.ts b/src/app/shared/model/model.service.ts index 7d44a2b223..251a31542f 100644 --- a/src/app/shared/model/model.service.ts +++ b/src/app/shared/model/model.service.ts @@ -23,14 +23,14 @@ export function hashCodeString(str: string): string { // domain/feature service @Injectable() export class ModelService { - // This is only one example of one Model depending on your domain + // This is only one example of one Model depending on your domain constructor(public _api: ApiService, public _cache: CacheService) { } - /** - * whatever domain/feature method name - */ + /** + * whatever domain/feature method name + */ get(url) { // you want to return the cache if there is a response in it. // This would cache the first response so if your API isn't idempotent diff --git a/src/assets/logo.png b/src/assets/logo.png deleted file mode 100644 index afea237f93a9c9370901fe74e1ef5e1368381a48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22394 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ǂch#VK?6)9rMSNwvq+pK@=8d0NQv{9_cOvOp5aKbfD_G?x=LPx z7aCELNkEcZ#4EOe8JQbmOR4m(T<~?4hYLqNx`X77BOZEqN{aGvS4z{^Kr<$FL*<;ZI*&17D)fAS~a(S!@%uK@Vk z0^ZqNcS|`pq9DciydnfWSg?i=RKrAA0~PY+I-1sF_F?k|(7bGk93(7%KE>8yfMAqj zmC7g0t1I3tSqWC&{;oz5Kj_E;tuwmg+&&G5-^F#|+Id4RsVjdNGBtllJ&l$1q`VQF(l_16wm9kvyf`JYgwZKT4spy);=}9LAMtQQTgdm@E&;W^X)kL7g@5 zqfL#rq=_#-j?BJLg(2#_Fi9oR&JPpG&%!eNJ(Z`V1r)rd-x-RH5g!I4R8i_~&m7KcnU!YYXr9N^_;a^c7_^wk$ydM#&z& zH)NqSO}F*S^gwxs(XUfhvjw0fl_@&DU2oKW=^bmVL2QIoTnhJpbDuz_2yp0;qypP9 zOxE{_`W3LttI z2&sNDkpb-+`a30XY*}F*B9`0|UUf^>vFt*Tr5*klL?SX}0~VN8Xi+)^tqChSRg2wGNVW^h) z>^m**O~Lc`Q^LQ7chM|wBX8GDxIg$jVMnYiXx&x@6`}5roM=e9$6~y8A4P@3H0bb* zsFv@l)M&2goXMAqjx?7j$$=7wl?&7~WDv(%XAz}#NEk}M*Cx;0r&gXO2lfXJ^@?F( z;_U;q!?1^_AUvbBS+))a5?$z02}er1vfL9XC}Aa^P!H(h&)zE*6>Q6zj_8=6jIE%1 zr)4Ry<^0OUgpm3gY4qLTaPEjnRjw_h$}!(BG4mXdSkTsknr*dkdrlD{|IAIhg{a`R z1mf5cSEB1$vZE9q^L%R8Pwiuc^#l};9M=GpbHmdSn*DtAi9tzHET>VNUj7CVw|5QsUPe&GwrN*GCR^@cIC9Y+$44vuM+Ft=x9B;uBLVsH>~Ik(OBqx@Rcg`yWxS| zkaOip1OHZ5EIJ?hb(_7&$2DfJFtEorm7~bZ=B#|DLoc%3;j`V+h`f|~*Y@zzb$l(m z`8#$_SrwpQ210t#4X$f^?ZMWpH3(*=C8v9!_0zUz)%5J>gxV6&Y{B_d;9V)VCPPB6 zb8gHonQv+bUP_UxiSKTjO-0b6lQv6hJ)F>0rk@a#P&O+*JF8q|ImX?4) zofOQkKmKU;?nBZV|56Ttb)HECv+(n!zg&fg#JrSpM1=pFzxJ8o-1wBnMka1ASK7v9fDnNQtwnT%!%sunE-Jp-##McJy?-$V{&T7!tNtMJvf*Rg< zC|KN2m4w@{2M5_IM^7a>(RmsUT-W#Iz38{THi;nxy$>_u()Kf$qY1R{wy!zgk%eaC zTBW*j<4YnzOBSv>E!v(im_OGIhX|2f`%n@8H`5e`pB@dT z8pC$1DZ|Z*s$+_O_ky!5ABT867^z`QZkl&Hs>!k|c9^5AzIKZa`02I)^fm3~2diP# zzxL7#F-ej5P*J@S|05|bRWHPz*2iBRcRWnEO=o)0g-i~Y-6nbm+l+j-4&N=W z>3!9ezA-g-L{rVZOPh3;_K0y5qIMm6kG^d$x9T6R{>YwiWTt$QGo~qZgEhE4TUFgr zyZpn2nvap>UBa#S_$ETI42f#r)1gQ)2WeYd$^_+!AFdR!Mv^l3g|G+wdR@3TSf2^$7YuYazR}Ld9x&sgD)LAG3JaDI_$;8b1nQnlug_6IKTbMl@te-BEV??Tinj7iKLUhRZpi2>nW~+Z73 zDIgJUVUEZ?uwJ%$X^!!Lfm5)%x|d4$yw%}Zlk7>BsP3;=4qV2xd5Rgqq>h*B?19wh zzlq(W#X`2GiHg*EL04tAMg+&iGLzhjj)A;D4+`d2>|K%Q*4nL*9dfghJnGN}_TzcT z%r7fep(eG0`{7#B0DD$ICp50@^<7&=m2byq*J}7WCayiIFIwTq&rO#6_@+xUcFp>CQ#_5LnT-C3CzykNsWc@$dWPZZnNG-)fgyUD3`wizDy za*R3Yi^#)gobV%n9q+`#K>kLZ(v)V>l>*LUne|HctOg~lO?}(`{f*J}f*e8DKSp{k zFCXV=Cx{ykcw?sr`!LdvUT$YoZ5dIQ?-@%Mw);Aq-sOZj4!>h<^Zl0S6w6Vw z-K|q`o07eKl>Y(?^9y2->mb$!dZ7~m9X^3-mRwQMex&}T@jJ6`p^bO?%v0jI_FMARAXFv4DVpk+ z34CZ=e{wjarTk(43-ZcoCqkt#@zF=g&$CU^Tt3`=IK@}XTsraT<&i|dN7Z%B=2>S? zO8I)K7w#Qe3@5}#haR;ZejN2gexKbWI`BDtrG*Y|(4&wxIu(nq$=}~B+He1b7`14# z?dDL4ZbUBydXO-FoTT*i{l327O`pqK^JIF^jZjI(%2w93`p!Mv@MMsUzKWHM(ftMv zW1ThWoc&5M6^b-PIr$m3wtC7WFwdprQxnDT{*_p{C=Dp%?SqR+h3IsA4+GnTUc{3> z`_dk~l1RV$d06VvT8Q%?r{|fr^i}abqjQX}N59rv#oWfV>>w;Iqa8cqnCW)q$YI|E z<%&EG=y0EIiJU5s*m!CDf zp=%g9!zvr6bN&)7=hc_rO46zEVq*RfH(BWaSxU(i%4Lwde`EX4-dS6>aYRv^E${E; zz=2yvUprcUX<6r!Ydw3p0YXtFm>Hn$!ds^ymCBNn&`{CI#^Ua$l_TfvK_^U1FE39E z)#H<;vWL&Q)(I}uC=Dp-Pi)!EhVm%icGZ0-b-c~OXFvsV*`g%@$@QJ9KW2YYW9OlB zOYFaO2?R()2y!3eabI#JW_ul`JeZ)r2T!{2vf6B6FYSLnHr1TWq~?@wa~tfy;2BXj zhxgHI(k>6&5yKT46jc;;ILuyNhUnnoc7$`ZUL?FRN=X%m<({A3bYWfNWUgfGqEO>D zy^TV0)v1^kt`*@5Sr9eVUTJ??NtKhnx$w)u@7I;%Bn|5{^TDiPiA~7jl!e~uQTwRe z-1eE`8jshXIp=pEL)v-60qvlY2sAqMo;9p~Zr*dx?!nHVZ2$ay54V~KWK);MrtMw5 z>5cW4ZRWXGS!!GH_O2X(&27fT)4>`OA}@P^#lCPN203F$W3_-%i)(_FE$-g^ zeRO@|J@t>sLbaNibr0cFUMt1DRF?f*H(?Y1j!z4kHz?LTKUwA~?gpMWS^a*wdF8d} zWnn&Sat~t8b_390{p~v1w-0Yo*lZ3xXcawvn#`T@IVycX+U03jc>bGTvY&gNAzQRK zixbJawhRtPT;54YGuVY=Ew&KZcJ3d{AWU&UE?%UWM};8 zqw#GVw!yS13eiK-l%brPM-c~~ug}5%4m@96cw)J2@0e-Pvg=a#-0dEKCc$Uutd_1` zCgu;x?BtOMd%G`bXw#GXj|Y8f-_0!^6sPGV59!Y}J1;+Hx8N{n&m4$p^7Ho|nCXvr zm)_Rj<>&{kwgnO`6|h)QiuoS>XKcjm%)-X?ph!YE<*LwM_HVd!Xj-Hh&qvW|E-YgC zGmdK(x9t9w3qH7UOu1;YmYci5bE*`Jw@9|6K^e`w*`a8^$3LYi-^Y7|>Va z7a`xbx6ZB`e>JsZqakjl`S+R4w;u{xj%)+|ABb^`vWBICqAbszIQa z)~5zb`@H$MCvVs1dIJLalz9tBkwmrQ5I3zy`P-2QQ0t(O27BBF|38YPXv!wyzfk|GAp>SMFRMjb+K1O-?Y+ zuFoqNi2zziP6+-jI}R>gXrCVF(_dc*6%DS++jkqflIv#ds3+hfb;)u``#p5EIxiDw z_>h9mpyMY^63wJnE$kz$cdqY~D>H(k*Hgcfc>^8|o}K(j7<$sc(Nz#VJptWI_e)Tn zEPUUoY6z<_JeS@$3;6C4${vqfrhRc#GQm5GIy$Pbl)owFY1f`SNfS(U#Bn`>j3WDL z#9?oF;wqXrdbvBd+WrTrVR}<~w%-PpOYoW`bLHb9oVzMn#Rx_h{_TpaSw_-}S=DpV zE8F>B!bE=pGF-eQ9`RqSO(l!Zv7BUWi-xINyPJd%JYn?KS-G=P6sOXE*1-(s=w-1X;g;sor^5~c#ndU?H zyg7ed!*={MtoXZ50k%4=<=A8{jRgsmD=;PN}by= z<(w43f+Kg)btI=ilk6q1UZ!|rp9MP8YlfFy6mR)I*X*ZaOAbH67bfr1Dy1lvUjP2nF2!4#PY~r8M zVh){2R3f1@xwp^orb^3H{ni)}I9ls9gJN)noW*a{Jzv1xn9z77!x9+mO_2M0wCarj z)I?AttD(nj863ddp7v)Spf*?k!*6T=bWDI>U_Ornr2 zOtCdKdzF#$-w43*`()CBOfrggB2J|De7)0UT?ldUx3^*VCF=p7y+96L`Bnhh!N*L0 z*Xxz;+|j6+-)FYgXx^?H-y7aePSIF2H0$BXh(GRC`xdtf^dgmtuBjClpB+areao3T zd0(ukTHZo<_a{rE^mAAhP^1s&N$XhMH{S}%NKn6MHQzvi_gZ=m~Bo|9N|-W3ZOf(){FaM)BL*DotNLU_kK4qQ!MU1&bq~LES9IwMs}84=1?Q6aKVN)(C!fnkJ~%dlI0jAs(qIhCP0jM2p3ET2JJzm{|me~)xMP;xG8`H*9o_b1Gh-tE^Jj?uOW z&rkAGK5aPP+gvtQ9uBC<1H&ZezC|zZ!N>;zQrzHDj_hyiRF>e>z=7=J_BNb1+v+iclo zN=;dQ10;QU`e0+EBM;U1(xBVc@J-;k?AyAQ7X~h3$uHV`{N!8r1E1H@SXDlX3aYT? z;x`Efk@5o{;KeF6PDVGL=O>e?-=U=3t(#I*31lAgt`91Uig(I5jb~&7r$67+;&b|< zdLW;g)q!lg!49=f+kvNu7&IFOR=#Hq1_h9_n%T!A*H#{u92=1C7K^ABG*$-s`R&Wh zw2ps9rV_y&19A0HshJ(fUx3ONiyX3I$BhEt11=Kw;@E$Z`g=`%&$8DlPp-?DBDt#j z6MJ z8NGvjW1pmJ`d7T?+LoE?LQ^@Pd%GU)h}RQw8&!N6BfN zBcHqln^&{9DkWMLI=WyLSoYnkyBg5P#Nf=LYF-BVR71p;0&l+mo#TmlHxbK;3oSdU z*?=9cmg@Q1z@g^V!A`1}lD(%sssz-O2oo)ZG^;ldV=dTDXR$t~@vxh==D^=Z=01yW zYZKWCR*#M1!^eGnFXB7}o6bXn0)HCFHohpI@kl8lC$Ah;wFzVu$ zvtId@iY~n?mVkvYaQy0rILozcvGt~0veMlVXu6mNoL~L31~lwl2r99l$Aj%gJg&2u zb5EUD>nEAH)`P*ONyhl*{o(#)kB>9W{-`sYOF5tYx6>^9i6S1dDahA~!1&qkXo32E zS7vPp*-+wvsl4p*U{JOB_N44G^57N|rDL{8W>&fL)cNlAL5u6cn<-++>Xxtv%@lgh zpj_rqsbA;HWmYBr+i{WN4J63Yn^3GVYh}q_Ombz>vmnxZWFdEviVN3FahxbYk)tuX zw(QvDu-El(bji*F4c;uT`-lLqK|2rWQoZ4gBVYt<48b>+nF2C7twbkPzb3RceUXp+ zYT+n+FC)&t-zuECp09Sm{Ily|PI7C9StyU8hdWRJ$B~b=R2rn zPYK!R<=sf!?eFem+cViQ8+^96tz_p1OQ2a0R%|Pq26YxlFERSq(9*5D+OQ`APrxyD zrOU(@IB~(s4ESm+v{9E74l?~@s-xXEV9tgH-B}Isi$zMH|``uSXctPN}#g1lPL%p+0r~Tf$=Cm%XLNgA^!wIIJR*{_V z>)(8M`=Mbg4E9~(hnUz{^%(7n0`e9(Jyp3RI@no}jIt7gQ9abCe-c@b8!Z8cOJh3( zrMw_G`DXHyt^P3#7u(qd@f8b;S_J)F0PVQXx_D|pdDy-)t;4-hx9irUkZmUPd4XXz zY&B)&8V}$eQM~+6u#pxcDS-n_2SKXA=sfv?tDJOT;eEO zQ)650Mc4lCKww`^oh}8wmcK3{AR>ED`C>d; z7{9n}pU)=u+o->(o#Ic{osD@EA!_1`P~&mNCa!D5WgbB3+4z?~!-^WB#{ zA?lB#KDfnMz684vyH=C9ZHb7)Zu)!l_8Wl*ADe}YB_5c~OQfQ7>A>|1+c1)EvxHKp zFS$*QzdP5ApEbTem#ztGA1G}49J@gzd$vQ6@hk6~v><^H4n2J@N@beG7@QJ08#oli zo$=yrHr(VozR!CCmqYpUF*%oL<7z5tozNg#aGXCmKa7_B4yqW9{4VW;72H4rY>*N=ivW8PHcEhqj+> zxC_t}+b-3N+=G$he>8lV>EBK0X`{bVD`fGKdL}Y6@0_53%o_ew>?VW5R^ao~+4Okv z)H7WY0c6lMa1V&(o?~AsQcrow^T8}jwm01vS$~y59HK6Y$%Q}AdTcS5@!6-IA01F7 z+=6G|cEpeL#Lu|>3WqWga^7aSXLKgTy_&)bQhI^~wIqzZ2?|ZgYf5Bb9`2_MZ zPcAF*xJ|!-K3acUku0er>#}^_@OJH8u!Lfn3Yhz3CofDujr{?9eS?B4^#frG5!AHg zVv|poU{saLXBbOv#$8bH7E50i@()-kByc|5?V)#7m=^;VX}-D76X-&0!|Ii8kI^lr z+bZ)mB|wJSrd-ROS;I5MrC(k8Se>r>`0x^ee!ntT|)?Ni7dF3v?s1-jSFrF1`7GwdwgoV3v0|x ztY(L9DSNtHlW)1W1jV(BrMN!$@W0EJjHldIpn_ zyWRjSIZBcST8#wvM?)b5Ekxk!CvX}pcLp;$t%Da@%!*HoCBoaylc`T)a%T=!!D6bo zj6CEW5(|aIu9!4WjH9~w_Ao;_z-eXYk@HZe+xa~j{AB;iN_2tFV(RZha1FARe;8Q{ z%&S2_?rX;vn_m`mGA@phcNnKinlrn=*g1dR7N>j5A1t)f9SlCJriJeIDS%sJ1ct8T zRS~$lOuMK9(^@BXrg+m;;6nVwfA*N?0$4JS+9*h~)&SiK^3}g{KClk^pXA-pz4m;{ z3gN!}CNAwJCB9F44fE9bu;taon+-MB@7GM#6~Vwnsspgcnb6Qm)mHIm3NOT!MKyMB zEBm14-&Vd|{mbpGHDyqpLd!4qlNU(ah_6pl2pB-U!Kci{G;ip7f9~kaiRMcvyu22xanp;XMCC>-=x3EgsrOJs|>)rG>LVD1!wJkUe`RjagY^tP?++ z%Mm6p_SWqH5$n(a4JE+zT5Msz>yus|zOtCTxcgWsDZNkXjWqDLfzH5D{I}39;Hmt1^?jQeNo+TsS62JoK*C^(JFVwFA|dPuZI#4iJC<(|AuMI&L;TKFD_mlQ3Ap;Yp)-j@e&eTPA#i#jgsAMs&oQ@w7A<8~0(tHuB#yR^5v;hD7O+l-*nU zT?3V*E-k8638v_Y+ncF^X<rL3>zAQuyGpk~7oi zyhA-`!j4AVRxx(rHyiwPoNgJ^*Zg_{yj{NN&>0! zNgo`4MY?tY<7}!|7qv(mepmjzKe-Q>*l!S0qUDd;m38FQO2KzruZt-xat{h{6DRhx^a1* z1qy5OMel4HdY7bJ$zT*v4a_tNQGwSZ;cQ}^*pu;IEr7_mqr_FO30l6}2G0tMld`4T zu4%Jv6xqYPf8_vW{dJbsB>v}#8-#FTV!edGeNl5Uh#)c+aoOb2cE7Ru19G>cD~tZw zlG{|?V?YS57UIMu8~&z}{OXrsn7_A6dYLvgNj`uPg|mBf-)*y=S0P+&gs@}NQeX$B z^h>)oos%PKI70GjZ?s?o|X|1(MiK;MRiH0W6&kJkFvx4N)n$JXBb(@5u zBWRo++dKgIGjs5VQLU{*o%{_3RLZ;GPSN}Li7dRFZ&J%l%6Bonen2C@X#UWb0NU4t(g(;e`9|uf5GQWUbd) z_$ugrd3sE%odB={l=+)YADj?CRv4}+ixc`a>p_oK%AcQffDknKgGjDpm;l!r#7WEc zYeLLn2^;a4pzUTp-eSA?k0NK>&|v;(HFnZfQ8veeNVw%wWIMO=ac^8W9<1x22;c3e zS1x;ZeRmHeg_GwP$>xXP>thv_$QA;(6?`Iqt?gC)2mq>Z>!OE)P?Kf0e8;K7PP-FS zuGcAStN!K>=_5B=?b2+}0e3yT7HbU*)nH>>FF+{jl_fowOmJB9@erRbK1)$*8_f^; z`q$=GvxRShdj$aeF{s1M!rAE!w>p2e6+RXBO0-Gg{?+cs!4M4G|GQP|N$K&;OyQqFgs80-e1jN+Y9&p#kBav z^+t~2c4PQ11$9G0Hm0A{rqwvfB@!~M6kT`xaE2%li4JyQd%a5<&<~f7hR$UBo&#hJ zRc#3mfSbbS8orp^y$2X3w!TWK#S_sH4{}q|awHwc^F5&!wW2a<^S6O_LZ2q(q`D7y z5kmI~M-@Xd=BvUUHjHX+dTV};O0aAxgG;R%IW%C*=#&RFveFJ_76TRK7dN$nVOb-O z5%*LDPHvJru_3<-5|A+MCm?CDQyVhabaIp@d(?S(bpGM7SQ-kXd-|}Q4cFLS1fSlR zxJXrcG#Doi%$b|pv#A@PuOm;sS$;EZX;#*J#^9Wo6E;nbZ-kU*vOUxWwhPIbc%1S7 zY|Z3*E7Wtb;MDHJv2LSuO4~ts=X%8e1hgJd> zg6?N`Jy=H-57dWIB60sWe$LoZl+*Vm*b6AL)C33!ddO}!ziq#zNLCtUz0Ggot_^#G zY9iTgl3B7p-Y<~pQ2mFpbiZl2VMWo&I#_>8lts7z3Usm+3Wu4OV(};$*mWbWLYxrT z`bBQmOa-^}?}B#SmHMRynuO*lDgNGNxrJ}WMAbLvO2z3SU4iWpsj9DKnWe<*g}o-K zk?_uP zGH5F&e{MfRvYP%9tEr$jU5_kiJA2B+BFH)Ml>{Mpdsc1ZMqSQbuG*F8a|m#sm|9_- zE~%lB0xf+)*=XGn8;%af1y6D!i$aZmXIq{(OGN-qo3`39annNL3^RSrltykT@O~qk z&O4l&ZB;Bz*tp5=aOYbNcOg;T4zgcJue>n11O)Pj))UBGec+@k+a*H3o%fmYMz_8L zz<^kL*C)g$3^kt(JzmUfDMgF+0{rD&b=h>jNZ-LRam zYll)u{!+@o7)Wz)BAchGU|M_iN^chXZ$kEx|wkW_N0p9qnz@E^-3IHW7F8D`~R1k!W)ej4SSW zn^4nyu8GT=*qRz3pV|q%dY-ur*NE*6*<24x9_ZsetI~KAjFOkqCmn2K=C;0*^}*r* z+)chnj9I*FD?jWnyv*8>vZ>HFnQ10ESzwemU5v{e#*{xZUyN@}fl|>QZ^B72>R0H} z&jQ}B@-xeY^b-GpAzrHBMo0C`+(rCmbim6+LUJSml#^*DwR-SsoU1?l^I$|MJ3C+i z32_M3cI)CwOSX6G`@YnjBm$ztqZe~Lu~W~MiY0R8iU!s9P0-HlKvEH{qWTOW!W%)Z z9WM@4crWYqR*!X#liu_lVUGx}FX*F{(qOF?68abAX39fjmF#ixQ1>Kg2iaNPeV#d@ zD1pKDWc+(JPl3iZ8pTfc&(fE`=o(Iy<=-`253)BLHel4(y~-?Zs(jMJG|}K4R(Q>_ zSqOES?lssZ8>z8qr9s_%Y90kI9q|U<@+o|&&QV~(NXv&ZApAHgmt>MUAELtn!=V4e zOE5z2+%z|wJe)xu+Lhfe;dD2^BT}5NH9O3{__A~ay)vs#AGI!o1B)< zf2)p|dg^l?fZLqNF_D1)=b4&dAWO)0ku3@0pX@2r2m?#j@sx^eBm|t_6DgZEWR;oG z2Gw-4y|li7%zTMo5n$n=-U1mC3?vNucb6gBLJ>8sWqCi8Jj{m!8jenZr6}NSHWD+a z^^J)QGquVJP!|;LUmH{O=5HuC67us?3PUYAwz6o9hir3DCOUJ3NT_5QY?1m@r>x6v z1O;7w@+8LSGY23qJq(%b_Sy(}_2E^fEG3UVJp{)E0EHu$; z0?m7dxYrFS3i2ro5LfhI;C=CCdq$=PQskm%55DE&73)*fEWp>@aPhaBcq5)?`~+bh zTwCqC&1u2b7Rq`X2$fA0Im{Q~n%<0b|KiZjL+$7qB=&PUC>5bCf6XOk@#^XEiCJ5? zB;Z@E)Lbx#L|+6YhKz-o@O%t4Rv#BIZCs?j@24ZrpQj1qMUr8W z=mkn+I|t#QGZAA8mQofudf9K?OSY`tuKgW8D_go9mH5&SJ%dyXLb$77)NC^NJCF4# z(7G6#GM2Pj+1?C7SsQmFeeHg6rX}TRf5a||IRuu!Q)URf + DSpace @@ -10,6 +11,7 @@ + @@ -18,4 +20,5 @@ + diff --git a/src/node.module.ts b/src/node.module.ts index c7a8ad6296..49ce6b3d3b 100755 --- a/src/node.module.ts +++ b/src/node.module.ts @@ -25,7 +25,7 @@ export function getResponse() { export const UNIVERSAL_KEY = 'UNIVERSAL_CACHE'; @NgModule({ - bootstrap: [ AppComponent ], + bootstrap: [AppComponent], imports: [ // MaterialModule.forRoot() should be included first UniversalModule, // BrowserModule, HttpModule, and JsonpModule are included @@ -63,9 +63,9 @@ export class MainModule { universalCache[CacheService.KEY] = JSON.stringify(this.cache.dehydrate()); } - /** - * Clear the cache after it's rendered - */ + /** + * Clear the cache after it's rendered + */ universalAfterDehydrate = () => { // comment out if LRU provided at platform level to be shared between each user this.cache.clear(); diff --git a/src/server.aot.ts b/src/server.aot.ts index 8f81f7cfc3..c7e62a929c 100644 --- a/src/server.aot.ts +++ b/src/server.aot.ts @@ -55,11 +55,11 @@ app.set('json spaces', 2); app.use(cookieParser('Angular 2 Universal')); app.use(bodyParser.json()); -app.use(interceptor((req, res)=>({ +app.use(interceptor((req, res) => ({ // don't compress responses with this request header isInterceptable: () => (!req.headers['x-no-compression']), - intercept: ( body, send ) => { - const encodings = new Set(accepts(req).encodings()); + intercept: (body, send) => { + const encodings = new Set(accepts(req).encodings()); const bodyBuffer = new Buffer(body); // url specific key for response cache const key = '__response__' + req.originalUrl || req.url; @@ -71,12 +71,12 @@ app.use(interceptor((req, res)=>({ // brotli res.setHeader('Content-Encoding', 'br'); output = compressSync(bodyBuffer); - mcache.put(key, {output, encoding: 'br'}); + mcache.put(key, { output, encoding: 'br' }); } else if (encodings.has('gzip')) { // gzip res.setHeader('Content-Encoding', 'gzip'); output = gzipSync(bodyBuffer); - mcache.put(key, {output, encoding: 'gzip'}); + mcache.put(key, { output, encoding: 'gzip' }); } } else { const { output, encoding } = mcache.get(key); @@ -87,7 +87,7 @@ app.use(interceptor((req, res)=>({ } }))); -const accessLogStream = fs.createWriteStream(ROOT + '/morgan.log', {flags: 'a'}) +const accessLogStream = fs.createWriteStream(ROOT + '/morgan.log', { flags: 'a' }) app.use(morgan('common', { skip: (req, res) => res.statusCode < 400, @@ -100,8 +100,8 @@ function cacheControl(req, res, next) { next(); } // Serve static files -app.use('/assets', cacheControl, express.static(path.join(__dirname, 'assets'), {maxAge: 30})); -app.use(cacheControl, express.static(path.join(ROOT, 'dist/client'), {index: false})); +app.use('/assets', cacheControl, express.static(path.join(__dirname, 'assets'), { maxAge: 30 })); +app.use(cacheControl, express.static(path.join(ROOT, 'dist/client'), { index: false })); // ///////////////////////// @@ -120,7 +120,7 @@ function ngApp(req, res) { preboot: false, baseUrl: '/', requestUrl: req.originalUrl, - originUrl: `http://localhost:${ app.get('port') }` + originUrl: `http://localhost:${app.get('port')}` }); } diff --git a/src/server.ts b/src/server.ts index 351a82f768..f6393a391c 100644 --- a/src/server.ts +++ b/src/server.ts @@ -57,8 +57,8 @@ function cacheControl(req, res, next) { next(); } // Serve static files -app.use('/assets', cacheControl, express.static(path.join(__dirname, 'assets'), {maxAge: 30})); -app.use(cacheControl, express.static(path.join(ROOT, 'dist/client'), {index: false})); +app.use('/assets', cacheControl, express.static(path.join(__dirname, 'assets'), { maxAge: 30 })); +app.use(cacheControl, express.static(path.join(ROOT, 'dist/client'), { index: false })); // ///////////////////////// @@ -77,7 +77,7 @@ function ngApp(req, res) { preboot: false, baseUrl: '/', requestUrl: req.originalUrl, - originUrl: `http://localhost:${ app.get('port') }` + originUrl: `http://localhost:${app.get('port')}` }); } diff --git a/src/typings.d.ts b/src/typings.d.ts index dd39e59907..e3ce18864e 100644 --- a/src/typings.d.ts +++ b/src/typings.d.ts @@ -39,7 +39,7 @@ interface SystemJS { // Extra variables that live on Global that will be replaced by webpack DefinePlugin declare var ENV: string; declare var HMR: boolean; -declare var Zone: {current: any}; +declare var Zone: { current: any }; interface GlobalEnvironment { ENV; HMR; @@ -68,6 +68,6 @@ interface WebpackRequire { } // Extend typings -interface NodeRequire extends WebpackRequire {} -interface NodeModule extends WebpackModule {} -interface Global extends GlobalEnvironment {} +interface NodeRequire extends WebpackRequire { } +interface NodeModule extends WebpackModule { } +interface Global extends GlobalEnvironment { } diff --git a/tsconfig.aot.json b/tsconfig.aot.json index 99eb05bc49..468a6d392d 100644 --- a/tsconfig.aot.json +++ b/tsconfig.aot.json @@ -24,5 +24,7 @@ }, "compileOnSave": false, "buildOnSave": false, - "atom": { "rewriteTsconfig": false } + "atom": { + "rewriteTsconfig": false + } } diff --git a/tsconfig.json b/tsconfig.json index 38cb58017b..c10735a758 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,5 +23,7 @@ }, "compileOnSave": false, "buildOnSave": false, - "atom": { "rewriteTsconfig": false } + "atom": { + "rewriteTsconfig": false + } } diff --git a/tslint.json b/tslint.json index c84aa07ebb..6b00e6bcf5 100644 --- a/tslint.json +++ b/tslint.json @@ -6,13 +6,13 @@ "directive-selector": [ true, "attribute", - "dspace", + "ds", "camelCase" ], "component-selector": [ true, "element", - "dspace", + "ds", "kebab-case" ], "use-input-property-decorator": true, @@ -27,7 +27,7 @@ "pipe-naming": [ true, "camelCase", - "dspace" + "ds" ], "component-class-suffix": true, "directive-class-suffix": true, diff --git a/webpack.prod.config.ts b/webpack.prod.config.ts index a0f1b66304..7516b4da39 100644 --- a/webpack.prod.config.ts +++ b/webpack.prod.config.ts @@ -4,7 +4,7 @@ const clone = require('js.clone'); const webpackMerge = require('webpack-merge'); const V8LazyParseWebpackPlugin = require('v8-lazy-parse-webpack-plugin'); const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; -import webpackConfig, { root, includeClientPackages } from './webpack.config'; +import webpackConfig, { root, includeClientPackages } from './webpack.config'; // const CompressionPlugin = require('compression-webpack-plugin'); @@ -171,8 +171,8 @@ export const serverConfig = { export default [ // Client - webpackMerge(webpackConfig[0], clone(commonConfig), clientConfig, {plugins: webpackConfig[0].plugins.concat(commonPlugins, clientPlugins) }), + webpackMerge(webpackConfig[0], clone(commonConfig), clientConfig, { plugins: webpackConfig[0].plugins.concat(commonPlugins, clientPlugins) }), // Server - webpackMerge(webpackConfig[1], clone(commonConfig), serverConfig, {plugins: webpackConfig[1].plugins.concat(commonPlugins, serverPlugins) }) + webpackMerge(webpackConfig[1], clone(commonConfig), serverConfig, { plugins: webpackConfig[1].plugins.concat(commonPlugins, serverPlugins) }) ]; From ce6c707ff644742886c5f26f2d6e8cfb67a93301 Mon Sep 17 00:00:00 2001 From: William Welling Date: Fri, 2 Dec 2016 07:48:39 -0600 Subject: [PATCH 6/6] Updated package.json --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 9bc80b07ac..5314784c33 100644 --- a/package.json +++ b/package.json @@ -56,11 +56,11 @@ "ng2-translate": "~4.0.1", "preboot": "~4.5.2", "rxjs": "5.0.0-beta.12", - "webfontloader": "^1.6.26", + "webfontloader": "^1.6.27", "zone.js": "~0.6.26" }, "devDependencies": { - "@ngtools/webpack": "~1.1.7", + "@ngtools/webpack": "1.1.7", "@types/body-parser": "0.0.33", "@types/compression": "0.0.33", "@types/cookie-parser": "^1.3.30", @@ -85,14 +85,14 @@ "json-loader": "^0.5.4", "memory-cache": "^0.1.6", "node-sass": "^3.13.0", - "nodemon": "^1.10.0", + "nodemon": "^1.11.0", "raw-loader": "^0.5.1", "reflect-metadata": "0.1.8", "rimraf": "^2.5.4", "sass-loader": "^4.0.2", "string-replace-loader": "^1.0.5", "ts-helpers": "^1.1.2", - "ts-node": "^1.3.0", + "ts-node": "^1.7.0", "tslint": "4.0.2", "tslint-loader": "3.2.1", "typescript": "2.0.10",