diff --git a/.drone.yml b/.drone.yml index 67ebd66..f1073e1 100644 --- a/.drone.yml +++ b/.drone.yml @@ -29,6 +29,37 @@ trigger: event: - push +--- +kind: pipeline +type: docker +name: linux-arm64 + +platform: + os: linux + arch: arm64 + +steps: + - name: build + image: node:alpine + commands: + - npm install + - npm run build:ssr + - name: docker + image: plugins/docker + settings: + auto_tag: true + auto_tag_suffix: linux-arm64 + repo: samuelph/universal-statuspage + username: + from_secret: USERNAME + password: + from_secret: PASSWORD + when: + branch: + - master + event: + - push + --- kind: pipeline type: docker @@ -54,11 +85,12 @@ steps: from_secret: USERNAME password: from_secret: PASSWORD - when: - branch: - - master - event: - - push + +trigger: + branch: + - master + event: + - push --- kind: pipeline @@ -67,7 +99,7 @@ name: manifest platform: os: linux - arch: arm + arch: arm64 steps: - name: publish @@ -79,6 +111,7 @@ steps: template: samuelph/universal-statuspage:OS-ARCH platforms: - linux/amd64 + - linux/arm64 - linux/arm username: from_secret: USERNAME @@ -87,6 +120,7 @@ steps: depends_on: - linux-amd64 + - linux-arm64 - linux-arm trigger: diff --git a/Dockerfile b/Dockerfile index ce59e31..24e1261 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:14.11.0-alpine +FROM node:14.14.0-alpine COPY dist/universal-statuspage /universal-statuspage diff --git a/angular.json b/angular.json index a9c5904..a458a21 100644 --- a/angular.json +++ b/angular.json @@ -46,7 +46,6 @@ "optimization": true, "outputHashing": "all", "sourceMap": false, - "extractCss": true, "namedChunks": false, "extractLicenses": true, "vendorChunk": false, diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json index 6b87cc4..c92199c 100644 --- a/e2e/tsconfig.json +++ b/e2e/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../tsconfig.base.json", + "extends": "../tsconfig.json", "compilerOptions": { "outDir": "../out-tsc/e2e", "module": "commonjs", diff --git a/package.json b/package.json index 78e2c9c..ce81dc9 100644 --- a/package.json +++ b/package.json @@ -15,48 +15,48 @@ }, "private": true, "dependencies": { - "@angular/animations": "~10.0.4", - "@angular/cdk": "^10.0.2", - "@angular/common": "~10.0.4", - "@angular/compiler": "~10.0.4", - "@angular/core": "~10.0.4", - "@angular/forms": "~10.0.4", - "@angular/material": "^10.0.2", - "@angular/platform-browser": "~10.0.4", - "@angular/platform-browser-dynamic": "~10.0.4", - "@angular/platform-server": "~10.0.4", - "@angular/router": "~10.0.4", - "@fortawesome/fontawesome-free": "^5.14.0", - "@nguniversal/express-engine": "^10.1.0", - "bootstrap": "^4.5.2", + "@angular/animations": "~11.0.2", + "@angular/cdk": "^11.0.1", + "@angular/common": "~11.0.2", + "@angular/compiler": "~11.0.2", + "@angular/core": "~11.0.2", + "@angular/forms": "~11.0.2", + "@angular/material": "^11.0.1", + "@angular/platform-browser": "~11.0.2", + "@angular/platform-browser-dynamic": "~11.0.2", + "@angular/platform-server": "~11.0.2", + "@angular/router": "~11.0.2", + "@fortawesome/fontawesome-free": "^5.15.1", + "@nguniversal/express-engine": "^11.0.0", + "bootstrap": "^4.5.3", "express": "^4.17.1", "jsonpath-plus": "^4.0.0", "roboto-fontface": "^0.10.0", - "rxjs": "~6.6.0", + "rxjs": "~6.6.3", "tslib": "^2.0.0", "zone.js": "~0.10.2" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.1000.3", - "@angular/cli": "~10.0.3", - "@angular/compiler-cli": "~10.0.4", - "@angular/language-service": "~10.0.4", - "@nguniversal/builders": "^10.1.0", + "@angular-devkit/build-angular": "~0.1100.2", + "@angular/cli": "~11.0.2", + "@angular/compiler-cli": "~11.0.2", + "@angular/language-service": "~11.0.2", + "@nguniversal/builders": "^11.0.0", "@types/express": "^4.17.8", "@types/node": "^14.0.23", - "@types/jasmine": "~3.5.11", + "@types/jasmine": "~3.6.0", "@types/jasminewd2": "~2.0.3", "codelyzer": "^6.0.0", - "jasmine-core": "~3.5.0", + "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", "karma": "~5.1.0", "karma-chrome-launcher": "~3.1.0", "karma-coverage-istanbul-reporter": "~3.0.2", - "karma-jasmine": "~3.3.0", + "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", "protractor": "~7.0.0", "ts-node": "~8.10.2", "tslint": "~6.1.0", - "typescript": "~3.9.7" + "typescript": "~4.0.5" } } diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 5891c31..a240e16 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -9,8 +9,9 @@ const routes: Routes = [{ @NgModule({ imports: [RouterModule.forRoot(routes, { - initialNavigation: 'enabled' - })], + initialNavigation: 'enabled', + relativeLinkResolution: 'legacy' +})], exports: [RouterModule] }) export class AppRoutingModule { diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 5d69a33..994ccc9 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,9 +1,9 @@ -import { TestBed, async } from '@angular/core/testing'; +import { TestBed, waitForAsync } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { AppComponent } from './app.component'; describe('AppComponent', () => { - beforeEach(async(() => { + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ RouterTestingModule diff --git a/src/app/status/status.component.spec.ts b/src/app/status/status.component.spec.ts index ddf4f67..0fed327 100644 --- a/src/app/status/status.component.spec.ts +++ b/src/app/status/status.component.spec.ts @@ -1,4 +1,4 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { StatusComponent } from './status.component'; @@ -6,7 +6,7 @@ describe('StatusComponent', () => { let component: StatusComponent; let fixture: ComponentFixture; - beforeEach(async(() => { + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [ StatusComponent ] }) diff --git a/src/main.status.ts b/src/main.status.ts index 8b466bd..db41deb 100644 --- a/src/main.status.ts +++ b/src/main.status.ts @@ -1,5 +1,5 @@ import {json, Router} from 'express'; -import {CurrentStatus, State} from './app/_data/data'; +import {CurrentStatus, Service, State} from './app/_data/data'; import {existsSync, readFileSync, writeFileSync} from 'fs'; import {join} from 'path'; import {JSONPath} from 'jsonpath-plus'; @@ -83,7 +83,53 @@ api.post('/update/health', (req, res) => { }); api.get('/status', (req, res) => { - return res.json(cache); + return res.json(cache); +}); + +api.get('/badge', (req, res) => { + const serviceId = req.query.service as string; + if (!serviceId) { + return res.json({ + "schemaVersion": 1, + "label": "sp-status", + "message": "service not provided", + "isError": true + }); + } + const service = cache.groups + .map(g => g.services).reduce((x, y) => x.concat(y), []) + .find(s => s.id === serviceId); + if (!service) { + return res.json({ + "schemaVersion": 1, + "label": "sp-status", + "message": "service not found", + "isError": true + }); + } + const label = req.query.label || service.name; + let message; + let color; + switch (service.state) { + case 'operational': + message = req.query.operational || service.state; + color = '#7ed321'; + break; + case 'outage': + message = req.query.outage || service.state; + color = '#ff6f6f'; + break; + case 'maintenance': + message = req.query.maintenance || service.state; + color = '#f7ca18'; + break; + } + return res.json({ + "schemaVersion": 1, + "label": label, + "message": message, + "color": color + }); }); api.get('/info', (req, res) => { diff --git a/tsconfig.app.json b/tsconfig.app.json index 44795bd..f758d98 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -1,5 +1,5 @@ { - "extends": "./tsconfig.base.json", + "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/app", "types": [] diff --git a/tsconfig.base.json b/tsconfig.base.json deleted file mode 100644 index ac05639..0000000 --- a/tsconfig.base.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "module": "es2020", - "moduleResolution": "node", - "importHelpers": true, - "target": "es2015", - "lib": [ - "es2018", - "dom" - ] - }, - "angularCompilerOptions": { - "fullTemplateTypeCheck": true, - "strictInjectionParameters": true - } -} diff --git a/tsconfig.json b/tsconfig.json index e574583..ac05639 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,23 @@ -/* - This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. - It is not intended to be used to perform a compilation. - - To learn more about this file see: https://angular.io/config/solution-tsconfig. -*/ { - "files": [], - "references": [ - { - "path": "./tsconfig.app.json" - }, - { - "path": "./tsconfig.spec.json" - }, - { - "path": "./tsconfig.server.json" - } - ] -} \ No newline at end of file + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "es2020", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json index 1db2e6e..6400fde 100644 --- a/tsconfig.spec.json +++ b/tsconfig.spec.json @@ -1,5 +1,5 @@ { - "extends": "./tsconfig.base.json", + "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/spec", "types": [