From 45fad8586af659ba2b9055ecc89844cd7ca73784 Mon Sep 17 00:00:00 2001 From: Cameron Cordes Date: Sat, 18 Apr 2020 08:08:34 -0400 Subject: [PATCH 1/7] Add simple Jenkinsfile --- Jenkinsfile | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..70e5c20 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,10 @@ +pipeline { + agent { docker { image 'node:13.10-alpine' } } + stages { + stage('build') { + steps { + sh 'npm --version' + } + } + } +} -- 2.49.1 From d19d96a7fd99326e8910f1557165d88b5d4a9fcd Mon Sep 17 00:00:00 2001 From: Cameron Cordes Date: Sat, 18 Apr 2020 09:26:52 -0400 Subject: [PATCH 2/7] Add more proper setup and build steps --- Jenkinsfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 70e5c20..37569bc 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,9 +1,13 @@ pipeline { agent { docker { image 'node:13.10-alpine' } } stages { + stage('setup') { + sh npm install + sh export PATH=$PATH:node_modules/.bin + } stage('build') { steps { - sh 'npm --version' + sh 'ng build --prod' } } } -- 2.49.1 From 2841be7a51d363250cceb9c46908b754fab0fd76 Mon Sep 17 00:00:00 2001 From: Cameron Cordes Date: Sat, 18 Apr 2020 09:32:11 -0400 Subject: [PATCH 3/7] Add missing quotes --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 37569bc..e1ec39d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,8 +2,8 @@ pipeline { agent { docker { image 'node:13.10-alpine' } } stages { stage('setup') { - sh npm install - sh export PATH=$PATH:node_modules/.bin + sh 'npm install' + sh 'export PATH=$PATH:node_modules/.bin' } stage('build') { steps { -- 2.49.1 From 127cbb2635901e47439b997d991e53e6c2fff960 Mon Sep 17 00:00:00 2001 From: Cameron Cordes Date: Sat, 18 Apr 2020 09:34:32 -0400 Subject: [PATCH 4/7] Missing steps block --- Jenkinsfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index e1ec39d..0c13e9b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,8 +2,10 @@ pipeline { agent { docker { image 'node:13.10-alpine' } } stages { stage('setup') { - sh 'npm install' - sh 'export PATH=$PATH:node_modules/.bin' + steps { + sh 'npm install' + sh 'set PATH=$PATH:$(pwd)/node_modules/.bin' + } } stage('build') { steps { -- 2.49.1 From bfbf08be63e96afb65051c2a9b6d3427d9e24bac Mon Sep 17 00:00:00 2001 From: Cameron Cordes Date: Sat, 18 Apr 2020 12:50:20 -0400 Subject: [PATCH 5/7] Add Lint build stage --- Jenkinsfile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0c13e9b..48c50a8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -4,12 +4,16 @@ pipeline { stage('setup') { steps { sh 'npm install' - sh 'set PATH=$PATH:$(pwd)/node_modules/.bin' } } stage('build') { steps { - sh 'ng build --prod' + sh 'node_modules/.bin/ng build --prod' + } + } + stage('lint') { + steps { + sh 'node_modules/.bin/ng lint' } } } -- 2.49.1 From 4220d721ecb952f3684d15cad1756b7482c32b0c Mon Sep 17 00:00:00 2001 From: Cameron Cordes Date: Sat, 18 Apr 2020 12:57:24 -0400 Subject: [PATCH 6/7] Add Codelyzer to fix linting --- package-lock.json | 117 +++++++++++++++++++++++++++++++++++++--------- package.json | 1 + 2 files changed, 96 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index df7d2e7..5e12a1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2251,6 +2251,11 @@ "picomatch": "^2.0.4" } }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==" + }, "append-transform": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", @@ -2274,6 +2279,15 @@ "sprintf-js": "~1.0.2" } }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -2393,6 +2407,11 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + }, "async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", @@ -2471,6 +2490,14 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "requires": { + "ast-types-flow": "0.0.7" + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -3312,6 +3339,29 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "codelyzer": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", + "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", + "requires": { + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + } + } + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -3372,8 +3422,7 @@ "commander": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" }, "commondir": { "version": "1.0.1", @@ -3792,6 +3841,16 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, + "css-selector-tokenizer": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", + "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2", + "regexpu-core": "^4.6.0" + } + }, "css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -3816,11 +3875,18 @@ "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", "dev": true }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "requires": { + "through": "X.X.X" + } + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { "version": "4.1.10", @@ -3943,6 +4009,11 @@ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -4912,6 +4983,11 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -9574,14 +9650,12 @@ "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" }, "regenerate-unicode-properties": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, "requires": { "regenerate": "^1.4.0" } @@ -9626,7 +9700,6 @@ "version": "4.7.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "dev": true, "requires": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.2.0", @@ -9639,14 +9712,12 @@ "regjsgen": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", - "dev": true + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" }, "regjsparser": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, "requires": { "jsesc": "~0.5.0" }, @@ -9654,8 +9725,7 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" } } }, @@ -9987,6 +10057,14 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "requires": { + "semver": "^5.3.0" + } + }, "semver-intersect": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", @@ -10473,8 +10551,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-loader": { "version": "0.2.4", @@ -11573,14 +11650,12 @@ "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" }, "unicode-match-property-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^1.0.4", "unicode-property-aliases-ecmascript": "^1.0.4" @@ -11589,14 +11664,12 @@ "unicode-match-property-value-ecmascript": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" }, "unicode-property-aliases-ecmascript": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" }, "union-value": { "version": "1.0.1", diff --git a/package.json b/package.json index afa7943..bfd2650 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@angular/platform-browser-dynamic": "^9.0.5", "@angular/router": "^9.0.5", "angulartics2": "^8.3.0", + "codelyzer": "^5.2.2", "core-js": "^2.6.11", "json-schema-traverse": "^0.4.1", "rxjs": "~6.5.4", -- 2.49.1 From c465fc2401628b3c6caad21664e01f5fb7dc3b97 Mon Sep 17 00:00:00 2001 From: Cameron Cordes Date: Sat, 18 Apr 2020 13:11:24 -0400 Subject: [PATCH 7/7] Fix lint errors Mostly double quotes instead of singles and a few let's that could be const. --- src/app/app.component.spec.ts | 16 ++-- src/app/app.component.ts | 2 +- src/app/project-keyword.pipe.ts | 18 ++++- src/app/projects/project-item.ts | 4 +- src/app/projects/project.service.ts | 90 +++++++++++---------- src/app/projects/projects.component.spec.ts | 2 +- src/app/toolbar/toolbar.component.spec.ts | 14 ++-- 7 files changed, 80 insertions(+), 66 deletions(-) diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 7eb9d96..f5ebd70 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,13 +1,13 @@ import {async, TestBed} from '@angular/core/testing'; -import { InjectionToken } from "@angular/core"; +import { InjectionToken } from '@angular/core'; import {AppComponent} from './app.component'; -import {ToolbarComponent} from "./toolbar/toolbar.component"; -import {RouterTestingModule} from "@angular/router/testing"; -import { MatSidenavModule } from "@angular/material/sidenav"; -import { MatToolbarModule } from "@angular/material/toolbar"; -import {NoopAnimationsModule} from "@angular/platform-browser/animations"; -import { RouterlessTracking } from "angulartics2"; -import { Angulartics2Piwik } from "angulartics2/piwik"; +import {ToolbarComponent} from './toolbar/toolbar.component'; +import {RouterTestingModule} from '@angular/router/testing'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import { RouterlessTracking } from 'angulartics2'; +import { Angulartics2Piwik } from 'angulartics2/piwik'; describe('AppComponent', () => { let piwik: Angulartics2Piwik; diff --git a/src/app/app.component.ts b/src/app/app.component.ts index c6eacb8..629df7e 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -43,7 +43,7 @@ export const routerTransition = trigger('routerTransition', [ }) export class AppComponent { constructor(private matomo: Angulartics2Piwik) { - matomo.startTracking() + matomo.startTracking(); } getState(outlet: RouterOutlet) { diff --git a/src/app/project-keyword.pipe.ts b/src/app/project-keyword.pipe.ts index f8e6603..21ab0b0 100644 --- a/src/app/project-keyword.pipe.ts +++ b/src/app/project-keyword.pipe.ts @@ -5,14 +5,24 @@ import {Pipe, PipeTransform} from '@angular/core'; }) export class ProjectKeywordPipe implements PipeTransform { private keywords = [ - 'MySQL', 'Node', 'Express', 'RxJava', 'Dagger 2', 'Model View Presenter', 'Retrofit', 'Realm', 'Room', 'Model-View-View Model', 'SimpleStack' + 'MySQL', + 'Node', + 'Express', + 'RxJava', + 'Dagger 2', + 'Model View Presenter', + 'Retrofit', + 'Realm', + 'Room', + 'Model-View-View Model', + 'SimpleStack' ]; transform(value: String, args?: any): any { this.keywords.forEach(keyword => { - let keywordIndex = value.indexOf(keyword); - if (keywordIndex != -1) { - let boldKeyword = '' + value.substring(keywordIndex, keywordIndex + keyword.length) + ''; + const keywordIndex = value.indexOf(keyword); + if (keywordIndex !== -1) { + const boldKeyword = '' + value.substring(keywordIndex, keywordIndex + keyword.length) + ''; value = value.replace(keyword, boldKeyword); } }); diff --git a/src/app/projects/project-item.ts b/src/app/projects/project-item.ts index a79ec52..60125af 100644 --- a/src/app/projects/project-item.ts +++ b/src/app/projects/project-item.ts @@ -1,6 +1,6 @@ export class ProjectItem { title: String; applicationType: String; - description: String - imgLocation: String + description: String; + imgLocation: String; } diff --git a/src/app/projects/project.service.ts b/src/app/projects/project.service.ts index 454d69b..38015a8 100644 --- a/src/app/projects/project.service.ts +++ b/src/app/projects/project.service.ts @@ -1,5 +1,50 @@ import {Injectable} from '@angular/core'; -import {ProjectItem} from "./project-item"; +import {ProjectItem} from './project-item'; + +const projects = [ + { + title: 'Movies', + applicationType: 'Android Application (Kotlin)', + // tslint:disable-next-line:max-line-length + description: 'Movies is an Android application for viewing movie and TV show info using the TMDB API. Movies is a Single Activity application, leveraging Model-View-View Model, Dagger 2, RxJava and SimpleStack for navigation. There is a focus on caching and a pleasant user experience even on slower networks by combining both in-memory and disk caching for quick load times, especially after a show details have been viewed.', + imgLocation: '' + }, + { + title: 'Secure Notes', + applicationType: 'Android Application (Kotlin)', + // tslint:disable-next-line:max-line-length + description: 'Secure Notes is a simple note taking application with security in mind. There is a focus on clean' + + ' code, Model-View-View Model and loosely coupled components. I built this app to experiment with different' + + ' Android database libraries (Realm and Room), encryption and security, as well as a single Activity approach to' + + ' an Android app. (Under development).', + imgLocation: '../../assets/note-icon.png' + }, + { + title: 'CorpsTime', + applicationType: 'Android Application (Java and Kotlin)', + description: 'CorpsTime is an Android application to view news, scores and the schedule of Drum Corps International' + + ' competitions. CorpsTime uses the Model View Presenter pattern and libraries such as Dagger 2, Retrofit and RxJava.', + imgLocation: '../../assets/corpstime.png' + }, + { + title: 'CorpsTime Scraper and API', + applicationType: 'Express API powered by Node (Javascript)', + description: 'The CorpsTime scraper and API is the supporting code for the CorpsTime mobile application, written' + + ' in Javascript using Express, Node, and MySQL to gather and prepare data for the CorpsTime client. The scraper' + + ' runs nightly during the Drum Corps season to pull data from different websites and store and format it to be' + + ' later retrieved by the API. The API includes a handful of endpoints to get scores, different competing corps and' + + ' the upcoming events during the season.', + imgLocation: '' + }, + { + title: 'Android Hues', + applicationType: 'Android Application (Kotlin)', + // tslint:disable-next-line:max-line-length + description: 'Android Hues is an Android application to control your Phillips Hue lights at home. Hues uses RxJava,' + + ' Dagger 2 and the Phillips Hue SDK in order to control the color, brightness and power state of your lights.', + imgLocation: '../../assets/android-hues.png' + } +]; @Injectable({ providedIn: 'root' @@ -10,48 +55,7 @@ export class ProjectService { } getProjects(): Promise> { - return Promise.resolve(projects) + return Promise.resolve(projects); } } -const projects = [ - { - title: "Movies", - applicationType: "Android Application (Kotlin)", - description: "Movies is an Android application for viewing movie and TV show info using the TMDB API. Movies is a Single Activity application, leveraging Model-View-View Model, Dagger 2, RxJava and SimpleStack for navigation. There is a focus on caching and a pleasant user experience even on slower networks by combining both in-memory and disk caching for quick load times, especially after a show details have been viewed.", - imgLocation: "" - }, - { - title: "Secure Notes", - applicationType: "Android Application (Kotlin)", - description: "Secure Notes is a simple note taking application with security in mind. There is a focus on clean" + - " code, Model-View-View Model and loosely coupled components. I built this app to experiment with different" + - " Android database libraries (Realm and Room), encryption and security, as well as a single Activity approach to" + - " an Android app. (Under development).", - imgLocation: "../../assets/note-icon.png" - }, - { - title: "CorpsTime", - applicationType: "Android Application (Java and Kotlin)", - description: "CorpsTime is an Android application to view news, scores and the schedule of Drum Corps International" + - " competitions. CorpsTime uses the Model View Presenter pattern and libraries such as Dagger 2, Retrofit and RxJava.", - imgLocation: "../../assets/corpstime.png" - }, - { - title: "CorpsTime Scraper and API", - applicationType: "Express API powered by Node (Javascript)", - description: "The CorpsTime scraper and API is the supporting code for the CorpsTime mobile application, written" + - " in Javascript using Express, Node, and MySQL to gather and prepare data for the CorpsTime client. The scraper" + - " runs nightly during the Drum Corps season to pull data from different websites and store and format it to be" + - " later retrieved by the API. The API includes a handful of endpoints to get scores, different competing corps and" + - " the upcoming events during the season.", - imgLocation: "" - }, - { - title: "Android Hues", - applicationType: "Android Application (Kotlin)", - description: "Android Hues is an Android application to control your Phillips Hue lights at home. Hues uses RxJava," + - " Dagger 2 and the Phillips Hue SDK in order to control the color, brightness and power state of your lights.", - imgLocation: "../../assets/android-hues.png" - } -]; diff --git a/src/app/projects/projects.component.spec.ts b/src/app/projects/projects.component.spec.ts index 939349b..853ddb4 100644 --- a/src/app/projects/projects.component.spec.ts +++ b/src/app/projects/projects.component.spec.ts @@ -1,7 +1,7 @@ import {async, ComponentFixture, TestBed} from '@angular/core/testing'; import {ProjectsComponent} from './projects.component'; -import {ProjectKeywordPipe} from "../project-keyword.pipe"; +import {ProjectKeywordPipe} from '../project-keyword.pipe'; describe('ProjectsComponent', () => { let component: ProjectsComponent; diff --git a/src/app/toolbar/toolbar.component.spec.ts b/src/app/toolbar/toolbar.component.spec.ts index 1a1f4b9..ebbf1a1 100644 --- a/src/app/toolbar/toolbar.component.spec.ts +++ b/src/app/toolbar/toolbar.component.spec.ts @@ -1,10 +1,10 @@ import {async, ComponentFixture, TestBed} from '@angular/core/testing'; import {ToolbarComponent} from './toolbar.component'; -import { MatSidenavModule } from "@angular/material/sidenav"; -import { MatToolbarModule } from "@angular/material/toolbar"; -import {RouterTestingModule} from "@angular/router/testing"; -import {Component} from "@angular/core"; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import {RouterTestingModule} from '@angular/router/testing'; +import {Component} from '@angular/core'; @Component({template: ''}) class DummyComponent { @@ -36,12 +36,12 @@ describe('ToolbarComponent', () => { }); it('should contain a material toolbar', () => { - expect(fixture.debugElement.children[0].nativeElement.className).toBe("mat-drawer-container mat-sidenav-container") + expect(fixture.debugElement.children[0].nativeElement.className).toBe('mat-drawer-container mat-sidenav-container'); }); it('should contain 4 links, Home, Resume, Projects, Contact', () => { - let debugElements = fixture.debugElement.queryAll((element) => { - return element.nativeElement.className.indexOf("mat-toolbar") != -1; + const debugElements = fixture.debugElement.queryAll((element) => { + return element.nativeElement.className.indexOf('mat-toolbar') !== -1; }); expect(debugElements[0].children.length).toBe(4); -- 2.49.1