From 45b2ea245115978022aa09b157acc424949bb88d Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Fri, 12 Jul 2019 23:29:05 +0200 Subject: [PATCH 01/18] Prepare for Electron Deployment --- config.js | 0 e2e/protractor.conf.js | 32 - e2e/src/app.e2e-spec.ts | 23 - e2e/src/app.po.ts | 11 - e2e/tsconfig.json | 13 - karma.conf.js | 32 - main.js | 65 +- package-lock.json | 2198 ++++------------- package.json | 116 +- src/app/app.component.spec.ts | 31 - src/app/app.component.ts | 6 +- src/app/app.module.ts | 2 +- src/app/app.service.spec.ts | 12 - .../bottom-bar/bottom-bar.component.spec.ts | 25 - src/app/bottom-bar/bottom-bar.component.ts | 16 +- src/app/{config => }/config.service.ts | 8 +- src/app/config/config.service.spec.ts | 12 - .../display-layer-progress.service.spec.ts | 12 - src/app/display-layer-progress.service.ts | 36 +- src/app/job-status.service.spec.ts | 12 - src/app/job-status.service.ts | 61 +- .../job-status/job-status.component.spec.ts | 25 - src/app/job-status/job-status.component.ts | 6 +- .../layer-progress.component.spec.ts | 25 - .../layer-progress.component.ts | 10 +- src/app/printer-status.service.spec.ts | 12 - src/app/printer-status.service.ts | 48 +- .../printer-status.component.spec.ts | 25 - .../printer-status.component.ts | 16 +- tsconfig.spec.json | 18 - 30 files changed, 739 insertions(+), 2169 deletions(-) create mode 100644 config.js delete mode 100644 e2e/protractor.conf.js delete mode 100644 e2e/src/app.e2e-spec.ts delete mode 100644 e2e/src/app.po.ts delete mode 100644 e2e/tsconfig.json delete mode 100644 karma.conf.js delete mode 100644 src/app/app.component.spec.ts delete mode 100644 src/app/app.service.spec.ts delete mode 100644 src/app/bottom-bar/bottom-bar.component.spec.ts rename src/app/{config => }/config.service.ts (70%) delete mode 100644 src/app/config/config.service.spec.ts delete mode 100644 src/app/display-layer-progress.service.spec.ts delete mode 100644 src/app/job-status.service.spec.ts delete mode 100644 src/app/job-status/job-status.component.spec.ts delete mode 100644 src/app/layer-progress/layer-progress.component.spec.ts delete mode 100644 src/app/printer-status.service.spec.ts delete mode 100644 src/app/printer-status/printer-status.component.spec.ts delete mode 100644 tsconfig.spec.json diff --git a/config.js b/config.js new file mode 100644 index 000000000..e69de29bb diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js deleted file mode 100644 index 73e4e6806..000000000 --- a/e2e/protractor.conf.js +++ /dev/null @@ -1,32 +0,0 @@ -// @ts-check -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter } = require('jasmine-spec-reporter'); - -/** - * @type { import("protractor").Config } - */ -exports.config = { - allScriptsTimeout: 11000, - specs: [ - './src/**/*.e2e-spec.ts' - ], - capabilities: { - 'browserName': 'chrome' - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function() {} - }, - onPrepare() { - require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.json') - }); - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); - } -}; \ No newline at end of file diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts deleted file mode 100644 index c61d97665..000000000 --- a/e2e/src/app.e2e-spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { AppPage } from './app.po'; -import { browser, logging } from 'protractor'; - -describe('workspace-project App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getTitleText()).toEqual('Welcome to OctoPrintDash!'); - }); - - afterEach(async () => { - // Assert that there are no errors emitted from the browser - const logs = await browser.manage().logs().get(logging.Type.BROWSER); - expect(logs).not.toContain(jasmine.objectContaining({ - level: logging.Level.SEVERE, - } as logging.Entry)); - }); -}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts deleted file mode 100644 index 5776aa9eb..000000000 --- a/e2e/src/app.po.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { browser, by, element } from 'protractor'; - -export class AppPage { - navigateTo() { - return browser.get(browser.baseUrl) as Promise; - } - - getTitleText() { - return element(by.css('app-root h1')).getText() as Promise; - } -} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json deleted file mode 100644 index e8d0b3c5d..000000000 --- a/e2e/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/e2e", - "module": "commonjs", - "target": "es6", - "types": [ - "jasmine", - "jasminewd2", - "node" - ] - } -} diff --git a/karma.conf.js b/karma.conf.js deleted file mode 100644 index 64e8775b9..000000000 --- a/karma.conf.js +++ /dev/null @@ -1,32 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma') - ], - client: { - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, './coverage/OctoPrintDash'), - reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true - }); -}; diff --git a/main.js b/main.js index 8559e1afe..24c885952 100644 --- a/main.js +++ b/main.js @@ -1,60 +1,67 @@ const { - app, - BrowserWindow + app, + BrowserWindow } = require("electron"); +const url = require('url') +const path = require('path') const args = process.argv.slice(1); -const serve = args.some(val => val === '--serve'); +const dev = args.some(val => val === '--serve'); const big = args.some(val => val === '--big-screen') + let window; function createWindow() { - if(!big) { + if (!big) { window = new BrowserWindow({ - width: serve ? 1000 : 480, - height: 320, - frame: false, - fullscreen: false + width: dev ? 1000 : 480, + height: 320, + frame: false, + fullscreen: false }) } else { window = new BrowserWindow({ - width: serve ? 1400 : 800, + width: dev ? 1400 : 800, height: 480, frame: false, fullscreen: false - }) + }) } - if (serve) { - require('electron-reload')(__dirname, { - electron: require(`${__dirname}/node_modules/electron`) - }); - window.loadURL('http://localhost:4200'); - } else { - window.loadFile('index.html') - } + if (dev) { + require('electron-reload')(__dirname, { + electron: require(`${__dirname}/node_modules/electron`) + }); + window.loadURL('http://localhost:4200'); + } else { + window.loadURL(url.format({ + pathname: path.join(__dirname, 'dist/OctoPrintDash/index.html'), + protocol: 'file:', + slashes: true + })); + } - if (serve) window.webContents.openDevTools(); -// window.webContents.openDevTools(); + if (dev) window.webContents.openDevTools(); + // window.webContents.openDevTools(); - window.on('closed', () => { - window = null; - }); + window.on('closed', () => { + window = null; + }); } app.on('ready', createWindow) app.on("window-all-closed", () => { - if (process.platform !== "darwin") { - app.quit(); - } + if (process.platform !== "darwin") { + app.quit(); + } }); app.on("activate", () => { - if (window === null) { - createWindow(); - } + if (window === null) { + createWindow(); + } }); diff --git a/package-lock.json b/package-lock.json index 638bae4c4..8edf7cebf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,71 +15,133 @@ } }, "@angular-devkit/build-angular": { - "version": "0.800.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.800.6.tgz", - "integrity": "sha512-b6WPGN8PReRizeTe5sR3XS2sqTqfCeFIDXI4sPy3T3XdmO1dB/UP8trsHXifuNTNSVIID4X0hDwXuz36Lk+4Jw==", + "version": "0.801.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.801.1.tgz", + "integrity": "sha512-t0A0KX++PX74xh113fiSb7g2Vo0P8aJQ0DODHANrgP3Tg21yskx8PhGeY7Lp/11irtfrk3LCDfQYLCgPAsNJFg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.800.6", - "@angular-devkit/build-optimizer": "0.800.6", - "@angular-devkit/build-webpack": "0.800.6", - "@angular-devkit/core": "8.0.6", - "@ngtools/webpack": "8.0.6", + "@angular-devkit/architect": "0.801.1", + "@angular-devkit/build-optimizer": "0.801.1", + "@angular-devkit/build-webpack": "0.801.1", + "@angular-devkit/core": "8.1.1", + "@ngtools/webpack": "8.1.1", "ajv": "6.10.0", - "autoprefixer": "9.5.1", - "browserslist": "4.5.5", - "caniuse-lite": "1.0.30000974", + "autoprefixer": "9.6.0", + "browserslist": "4.6.3", + "caniuse-lite": "1.0.30000979", "circular-dependency-plugin": "5.0.2", "clean-css": "4.2.1", - "copy-webpack-plugin": "5.0.2", - "core-js": "3.0.1", - "file-loader": "3.0.1", - "glob": "7.1.3", + "copy-webpack-plugin": "5.0.3", + "core-js": "3.1.4", + "file-loader": "4.0.0", + "glob": "7.1.4", "istanbul-instrumenter-loader": "3.0.1", "karma-source-map-support": "1.4.0", "less": "3.9.0", - "less-loader": "4.1.0", + "less-loader": "5.0.0", "license-webpack-plugin": "2.1.1", "loader-utils": "1.2.3", - "mini-css-extract-plugin": "0.6.0", + "mini-css-extract-plugin": "0.7.0", "minimatch": "3.0.4", - "open": "6.2.0", + "open": "6.4.0", "parse5": "4.0.0", - "postcss": "7.0.14", + "postcss": "7.0.17", "postcss-import": "12.0.1", "postcss-loader": "3.0.0", "raw-loader": "1.0.0", "rxjs": "6.4.0", - "sass": "1.19.0", + "sass": "1.22.2", "sass-loader": "7.1.0", - "semver": "6.0.0", + "semver": "6.2.0", "source-map-loader": "0.2.4", "source-map-support": "0.5.12", "speed-measure-webpack-plugin": "1.3.1", - "stats-webpack-plugin": "0.7.0", "style-loader": "0.23.1", "stylus": "0.54.5", "stylus-loader": "3.0.2", - "terser-webpack-plugin": "1.2.3", + "terser-webpack-plugin": "1.3.0", "tree-kill": "1.2.1", - "webpack": "4.30.0", - "webpack-dev-middleware": "3.6.2", - "webpack-dev-server": "3.3.1", + "webpack": "4.35.2", + "webpack-dev-middleware": "3.7.0", + "webpack-dev-server": "3.7.2", "webpack-merge": "4.2.1", "webpack-sources": "1.3.0", "webpack-subresource-integrity": "1.1.0-rc.6", "worker-plugin": "3.1.0" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.801.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.801.1.tgz", + "integrity": "sha512-Y+4kDpZeh+uIr179gbkpRcyeLizd94sC608TM8XQLM2+sgUB9PoW/KBotuED9Rjlvui4yURQm4UU8LnCsNqWSQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.1", + "rxjs": "6.4.0" + } + }, + "@angular-devkit/core": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.1.1.tgz", + "integrity": "sha512-Wq/6HOkT3gSOQRiSmHijzy/bzEqzI44Ho4S/NIZ192M/m28f46Neu2LV9juniQKnAAZ8RmHnXecxq3KjvCRkNg==", + "dev": true, + "requires": { + "ajv": "6.10.0", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "dev": true + } } }, "@angular-devkit/build-optimizer": { - "version": "0.800.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.800.6.tgz", - "integrity": "sha512-f8u9c5VA+bxbYREKX6EY8QsbIT8ziDRHlhJ1n6H2nUTaQi+THtbPfrDsf3S3aVACfkkY+LEGGl135XEPr5PoxA==", + "version": "0.801.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.801.1.tgz", + "integrity": "sha512-/pB1PMJO5K4qSpBsXSNOjol4LO1w64WWEeqOIGZUnva0OSLkPiLCvuLNtfMl8am2FkodbsRORDGuCKOzVP8j8Q==", "dev": true, "requires": { "loader-utils": "1.2.3", "source-map": "0.5.6", - "typescript": "3.4.4", + "typescript": "3.4.5", "webpack-sources": "1.3.0" }, "dependencies": { @@ -88,25 +150,53 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", "dev": true - }, - "typescript": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.4.tgz", - "integrity": "sha512-xt5RsIRCEaf6+j9AyOBgvVuAec0i92rgCaS3S+UVf5Z/vF2Hvtsw08wtUTJqp4djwznoAgjSxeCcU4r+CcDBJA==", - "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.800.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.800.6.tgz", - "integrity": "sha512-FwNGa99dxL9dACv/eLTP6u50tlPLG01yqp/JFAgxS0OmDkEMjSBLNgS8b8qhTo8XMhMsMWzb8yIUwV1PcSj6qg==", + "version": "0.801.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.801.1.tgz", + "integrity": "sha512-3siH/wqWjvxciniggTu2QrrLLHj1yZ81HTnRx/t8W3Qk06MTq31F7WAB3XLAE4j0W2CJJBxQq08M39uKpsXzSA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.800.6", - "@angular-devkit/core": "8.0.6", + "@angular-devkit/architect": "0.801.1", + "@angular-devkit/core": "8.1.1", "rxjs": "6.4.0", "webpack-merge": "4.2.1" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.801.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.801.1.tgz", + "integrity": "sha512-Y+4kDpZeh+uIr179gbkpRcyeLizd94sC608TM8XQLM2+sgUB9PoW/KBotuED9Rjlvui4yURQm4UU8LnCsNqWSQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.1", + "rxjs": "6.4.0" + } + }, + "@angular-devkit/core": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.1.1.tgz", + "integrity": "sha512-Wq/6HOkT3gSOQRiSmHijzy/bzEqzI44Ho4S/NIZ192M/m28f46Neu2LV9juniQKnAAZ8RmHnXecxq3KjvCRkNg==", + "dev": true, + "requires": { + "ajv": "6.10.0", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + } + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + } } }, "@angular-devkit/core": { @@ -199,9 +289,9 @@ } }, "@angular/compiler-cli": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.0.3.tgz", - "integrity": "sha512-6nckvBnnp1YnrxwCB8UKvhHAMcUa1WvGjbYMEqhgiBreiRT4ub+tKVPNzrRtQFPpcXtY1wlgOWqYHWhHRtcLlg==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.1.1.tgz", + "integrity": "sha512-nGN+AqNgi4qsh+4c2Tmtg7/v/mG62sDkjPttra1pUPI6cJS9Y4bA+PBEIW1UsR5OcD85qvNK4vliw2YdLtaeuw==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -223,6 +313,26 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -338,179 +448,43 @@ "tslib": "^1.9.0" } }, - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - } - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "@ngtools/webpack": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.1.1.tgz", + "integrity": "sha512-BUIXvRr0Ra8nyQGgKGNhEjWpqvfcLfha5yY2OdgWe6Ogw7BDgpImiTaCFHf6Y8KmbgbbFA8vhcnfGWc5saA9Ig==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" + "@angular-devkit/core": "8.1.1", + "enhanced-resolve": "4.1.0", + "rxjs": "6.4.0", + "tree-kill": "1.2.1", + "webpack-sources": "1.3.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "@angular-devkit/core": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.1.1.tgz", + "integrity": "sha512-Wq/6HOkT3gSOQRiSmHijzy/bzEqzI44Ho4S/NIZ192M/m28f46Neu2LV9juniQKnAAZ8RmHnXecxq3KjvCRkNg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ajv": "6.10.0", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } } } }, - "@ngtools/webpack": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.0.6.tgz", - "integrity": "sha512-ulu+5lLt4RjmcCXbmaGCjqjuOWt18DVek/Sq4HFE9E7zP+n7HercsU6h+9PrtaZThj9NB0B7A+afRB5aAQN/bQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "8.0.6", - "enhanced-resolve": "4.1.0", - "rxjs": "6.4.0", - "tree-kill": "1.2.1", - "webpack-sources": "1.3.0" - } - }, "@schematics/angular": { "version": "8.0.6", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.0.6.tgz", @@ -554,21 +528,6 @@ "@types/node": "*" } }, - "@types/jasmine": { - "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.13.tgz", - "integrity": "sha512-iczmLoIiVymaD1TIr2UctxjFkNEslVE/QtNAUmpDsD71cZfZBAsPCUv1Y+8AwsfA8bLx2ccr7d95T9w/UAirlQ==", - "dev": true - }, - "@types/jasminewd2": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", - "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", - "dev": true, - "requires": { - "@types/jasmine": "*" - } - }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -581,12 +540,6 @@ "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", "dev": true }, - "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", - "dev": true - }, "@types/source-list-map": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", @@ -827,9 +780,9 @@ } }, "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", + "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", "dev": true }, "acorn-dynamic-import": { @@ -838,18 +791,6 @@ "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", "dev": true }, - "adm-zip": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", - "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", - "dev": true - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -887,9 +828,9 @@ "dev": true }, "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, "amdefine": { @@ -963,15 +904,6 @@ "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", "dev": true }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -1066,12 +998,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -1164,12 +1090,6 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1183,16 +1103,17 @@ "dev": true }, "autoprefixer": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.5.1.tgz", - "integrity": "sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", + "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", "dev": true, "requires": { - "browserslist": "^4.5.4", - "caniuse-lite": "^1.0.30000957", + "browserslist": "^4.6.1", + "caniuse-lite": "^1.0.30000971", + "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.14", + "postcss": "^7.0.16", "postcss-value-parser": "^3.3.1" } }, @@ -1354,12 +1275,6 @@ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1421,24 +1336,12 @@ } } }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -1454,15 +1357,6 @@ "tweetnacl": "^0.14.3" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -1475,21 +1369,6 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, - "blocking-proxy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", - "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "bluebird": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", @@ -1665,23 +1544,14 @@ } }, "browserslist": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.5.tgz", - "integrity": "sha512-0QFO1r/2c792Ohkit5XI8Cm8pDtZxgNl2H6HU4mHrpYz7314pEYcsAVVatM0l/YmxPnEzh9VygXouj4gkFUTKA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000960", - "electron-to-chromium": "^1.3.124", - "node-releases": "^1.1.14" - } - }, - "browserstack": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.2.tgz", - "integrity": "sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", "dev": true, "requires": { - "https-proxy-agent": "^2.2.1" + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" } }, "buffer": { @@ -1695,28 +1565,6 @@ "isarray": "^1.0.0" } }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1832,12 +1680,6 @@ "caller-callsite": "^2.0.0" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, "callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", @@ -1869,9 +1711,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000974", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz", - "integrity": "sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww==", + "version": "1.0.30000979", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000979.tgz", + "integrity": "sha512-gcu45yfq3B7Y+WB05fOMfr0EiSlq+1u+m6rPHyJli/Wy3PVQNGaU7VA4bZE5qw+AU2UVOBR/N5g1bzADUqdvFw==", "dev": true }, "canonical-path": { @@ -1915,47 +1757,128 @@ "dev": true }, "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", + "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", + "anymatch": "^3.0.1", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", + "readdirp": "^3.1.1" + }, + "dependencies": { + "anymatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.3.tgz", + "integrity": "sha512-c6IvoeBECQlMVuYUjSwimnhmztImpErfxJzWZhIQinIvQWoGOnB0dLIgifbPHQt5heS6mNlaZG16f06H3C8t1g==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "readdirp": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.1.tgz", + "integrity": "sha512-XXdSXZrQuvqoETj50+JAitxz1UPdt5dupjT6T5nVB+WvjMv2XKYj+s7hPeAVCXvmJrL36O4YYyWlIC3an2ePiQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, @@ -2134,12 +2057,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2161,30 +2078,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "compare-versions": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.0.tgz", - "integrity": "sha512-hX+4kt2Rcwu+x1U0SsEFCn1quURjEjPEGH/cPBlpME/IidGimAdwfMU+B+xDr7et/KTR7VH2+ZqWGerv4NGs2w==", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "compressible": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", @@ -2227,18 +2126,6 @@ "typedarray": "^0.0.6" } }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - } - }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", @@ -2317,28 +2204,29 @@ "dev": true }, "copy-webpack-plugin": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.2.tgz", - "integrity": "sha512-7nC7EynPrnBTtBwwbG1aTqrfNS1aTb9eEjSmQDqFtKAsJrR3uDb+pCDIFT2LzhW+SgGJxQcYzThrmXzzZ720uw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-PlZRs9CUMnAVylZq+vg2Juew662jWtwOXOqH4lbQD9ZFhRG9R7tVStOgHt21CBGVq7k5yIJaz8TXDLSjV+Lj8Q==", "dev": true, "requires": { - "cacache": "^11.3.1", - "find-cache-dir": "^2.0.0", + "cacache": "^11.3.2", + "find-cache-dir": "^2.1.0", "glob-parent": "^3.1.0", "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", "minimatch": "^3.0.4", "normalize-path": "^3.0.0", - "p-limit": "^2.1.0", - "serialize-javascript": "^1.4.0", + "p-limit": "^2.2.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", "webpack-log": "^2.0.0" } }, "core-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz", - "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz", + "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==", "dev": true }, "core-util-is": { @@ -2477,12 +2365,6 @@ "array-find-index": "^1.0.1" } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, "cyclist": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", @@ -2504,12 +2386,6 @@ "assert-plus": "^1.0.0" } }, - "date-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.0.0.tgz", - "integrity": "sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA==", - "dev": true - }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -2565,15 +2441,6 @@ "ip-regex": "^2.1.0" } }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -2729,12 +2596,6 @@ "wrappy": "1" } }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -2786,18 +2647,6 @@ "buffer-indexof": "^1.0.0" } }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -2909,12 +2758,34 @@ "dev": true, "requires": { "chokidar": "^2.0.4" + }, + "dependencies": { + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + } } }, "electron-to-chromium": { - "version": "1.3.185", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.185.tgz", - "integrity": "sha512-h2iW0AHIwix8ifNJg/RkXhQjUDqBME8TvX8qQQMvvF2Tb6F2KnO6febvI+JqI9CdZOWnl90CPxdBRWGDrdk9UA==", + "version": "1.3.191", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.191.tgz", + "integrity": "sha512-jasjtY5RUy/TOyiUYM2fb4BDaPZfm6CXRFeJDMfFsXYADGxUN49RBqtgB7EL2RmJXeIRUk9lM1U6A5yk2YJMPQ==", "dev": true }, "elliptic": { @@ -2968,86 +2839,6 @@ "once": "^1.4.0" } }, - "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" - }, - "dependencies": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, "enhanced-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", @@ -3059,12 +2850,6 @@ "tapable": "^1.0.0" } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, "env-paths": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", @@ -3244,12 +3029,6 @@ "strip-eof": "^1.0.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -3510,25 +3289,15 @@ } }, "file-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", - "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.0.0.tgz", + "integrity": "sha512-roAbL6IdSGczwfXxhMi6Zq+jD4IfUpL0jWHD7fvmjdOVb7xBfdRUHe4LpBgO23VtVK5AW1OlWZo0p34Jvx3iWg==", "dev": true, "requires": { - "loader-utils": "^1.0.2", + "loader-utils": "^1.2.2", "schema-utils": "^1.0.0" } }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -3587,12 +3356,6 @@ "locate-path": "^3.0.0" } }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true - }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -3692,26 +3455,6 @@ "readable-stream": "^2.0.0" } }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "^1.0.0" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "fs-minipass": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", @@ -4410,26 +4153,6 @@ "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", "dev": true }, - "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -4464,29 +4187,6 @@ "ansi-regex": "^2.0.0" } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -4771,12 +4471,6 @@ "dev": true, "optional": true }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", @@ -4830,12 +4524,6 @@ "repeating": "^2.0.0" } }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5100,9 +4788,9 @@ } }, "is-path-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", - "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, "is-path-in-cwd": { @@ -5198,15 +4886,6 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } - }, "isemail": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", @@ -5234,50 +4913,6 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul-api": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", - "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "compare-versions": "^3.4.0", - "fileset": "^2.0.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "minimatch": "^3.0.4", - "once": "^1.4.0" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - } - } - }, "istanbul-instrumenter-loader": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", @@ -5331,15 +4966,6 @@ "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", "dev": true }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, "istanbul-lib-instrument": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", @@ -5363,120 +4989,10 @@ } } }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", - "dev": true, - "requires": { - "handlebars": "^4.1.2" - } - }, - "jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", - "dev": true, - "requires": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "dependencies": { - "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", - "dev": true - } - } - }, - "jasmine-core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", - "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", - "dev": true - }, - "jasmine-spec-reporter": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", - "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", - "dev": true, - "requires": { - "colors": "1.1.2" - } - }, - "jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", - "dev": true - }, - "joi": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", - "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", + "joi": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", + "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", "dev": true, "requires": { "hoek": "5.x.x", @@ -5584,108 +5100,6 @@ "verror": "1.10.0" } }, - "jszip": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", - "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "karma": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", - "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", - "dev": true, - "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", - "braces": "^2.3.2", - "chokidar": "^2.0.3", - "colors": "^1.1.0", - "connect": "^3.6.0", - "core-js": "^2.2.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "flatted": "^2.0.0", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^4.17.11", - "log4js": "^4.0.0", - "mime": "^2.3.1", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", - "socket.io": "2.1.1", - "source-map": "^0.6.1", - "tmp": "0.0.33", - "useragent": "2.3.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", - "dev": true - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "karma-chrome-launcher": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", - "dev": true, - "requires": { - "fs-access": "^1.0.0", - "which": "^1.2.1" - } - }, - "karma-coverage-istanbul-reporter": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.5.tgz", - "integrity": "sha512-yPvAlKtY3y+rKKWbOo0CzBMVTvJEeMOgbMXuVv3yWvS8YtYKC98AU9vFF0mVBZ2RP1E9SgS90+PT6Kf14P3S4w==", - "dev": true, - "requires": { - "istanbul-api": "^2.1.1", - "minimatch": "^3.0.4" - } - }, - "karma-jasmine": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", - "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", - "dev": true, - "requires": { - "jasmine-core": "^3.3" - } - }, - "karma-jasmine-html-reporter": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.4.2.tgz", - "integrity": "sha512-7g0gPj8+9JepCNJR9WjDyQ2RkZ375jpdurYQyAYv8PorUCadepl8vrD6LmMqOGcM17cnrynBawQYZHaumgDjBw==", - "dev": true - }, "karma-source-map-support": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", @@ -5743,22 +5157,14 @@ } }, "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", "dev": true, "requires": { "clone": "^2.1.1", "loader-utils": "^1.1.0", - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "pify": "^4.0.1" } }, "license-webpack-plugin": { @@ -5771,15 +5177,6 @@ "webpack-sources": "^1.2.0" } }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -5864,36 +5261,6 @@ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", "dev": true }, - "log4js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.4.0.tgz", - "integrity": "sha512-xwRvmxFsq8Hb7YeS+XKfvCrsH114bXex6mIwJ2+KmYVi23pB3+hlzyGq1JPycSFTJWNLhD/7PCtM0RfPy6/2yg==", - "dev": true, - "requires": { - "date-format": "^2.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.0", - "rfdc": "^1.1.4", - "streamroller": "^1.0.5" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "loglevel": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", @@ -6149,13 +5516,13 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz", - "integrity": "sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz", + "integrity": "sha512-RQIw6+7utTYn8DBGsf/LpRgZCJMpZt+kuawJ/fju0KiOL6nAaTBNmCJwS7HtwSCXfS47gCkmtBFS7HdsquhdxQ==", "dev": true, "requires": { "loader-utils": "^1.1.0", - "normalize-url": "^2.0.1", + "normalize-url": "1.9.1", "schema-utils": "^1.0.0", "webpack-sources": "^1.1.0" } @@ -6472,14 +5839,15 @@ "dev": true }, "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" } }, "npm-bundled": { @@ -6623,12 +5991,6 @@ "throttleit": "0.0.2" } }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -6653,12 +6015,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -6779,24 +6135,6 @@ "is-wsl": "^1.1.0" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, "original": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", @@ -6887,6 +6225,23 @@ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + } + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -6983,24 +6338,6 @@ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -7103,6 +6440,12 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true + }, "pidtree": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", @@ -7140,9 +6483,9 @@ } }, "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", + "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==", "dev": true, "requires": { "async": "^1.5.2", @@ -7165,9 +6508,9 @@ "dev": true }, "postcss": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", - "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -7224,9 +6567,9 @@ "dev": true }, "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, "pretty-bytes": { @@ -7299,203 +6642,48 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", - "dev": true, - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - } - }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, - "protractor": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", - "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", - "dev": true, - "requires": { - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "optimist": "~0.6.0", - "q": "1.4.1", - "saucelabs": "^1.5.0", - "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.0.6" - }, - "dependencies": { - "@types/selenium-webdriver": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", - "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "webdriver-manager": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.5.tgz", - "integrity": "sha512-f1apDjMpZ8SHlXtXGzqBxOjV+WQcDRz5PN7pWScgjXS7vhUIFcM3V89Shetf4A04n8DDR2MxiVQq6JproFcRZw==", - "dev": true, - "requires": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" + "dev": true, + "requires": { + "object-keys": "~0.4.0" } } } }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -7512,12 +6700,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", @@ -7577,18 +6759,6 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -7596,12 +6766,11 @@ "dev": true }, "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "dev": true, "requires": { - "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" } @@ -8039,12 +7208,6 @@ "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", "dev": true }, - "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", - "dev": true - }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -8118,12 +7281,12 @@ "dev": true }, "sass": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.19.0.tgz", - "integrity": "sha512-8kzKCgxCzh8/zEn3AuRwzLWVSSFj8omkiGwqdJdeOufjM+I88dXxu9LYJ/Gw4rRTHXesN0r1AixBuqM6yLQUJw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.2.tgz", + "integrity": "sha512-enuQuy/CbfrZLA2vOy9tB7CK7pP5bZllnMbr5nPGWCFelwt0EMUVGC11gsv9rybkWc8pp/NKVY/c5+AKyjbnXg==", "dev": true, "requires": { - "chokidar": "^2.0.0" + "chokidar": ">=2.0.0 <4.0.0" } }, "sass-loader": { @@ -8154,15 +7317,6 @@ } } }, - "saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", - "dev": true, - "requires": { - "https-proxy-agent": "^2.2.1" - } - }, "sax": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", @@ -8186,29 +7340,6 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, - "selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "requires": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "dependencies": { - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, "selfsigned": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", @@ -8352,12 +7483,6 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -8622,110 +7747,6 @@ } } }, - "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", - "dev": true, - "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", - "dev": true - }, - "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, "sockjs": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", @@ -8808,9 +7829,9 @@ } }, "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { "is-plain-obj": "^1.0.0" @@ -9062,15 +8083,6 @@ } } }, - "stats-webpack-plugin": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz", - "integrity": "sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ==", - "dev": true, - "requires": { - "lodash": "^4.17.4" - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -9116,36 +8128,6 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, - "streamroller": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.5.tgz", - "integrity": "sha512-iGVaMcyF5PcUY0cPbW3xFQUXnr9O4RZXNBBjhuLZgrjLO4XCLLGfx4T2sGqygSeylUjwgWRsnNbT9aV0Zb8AYw==", - "dev": true, - "requires": { - "async": "^2.6.2", - "date-format": "^2.0.0", - "debug": "^3.2.6", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -9341,14 +8323,14 @@ } }, "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz", + "integrity": "sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==", "dev": true, "requires": { - "commander": "^2.19.0", + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.10" + "source-map-support": "~0.5.12" }, "dependencies": { "source-map": { @@ -9360,19 +8342,21 @@ } }, "terser-webpack-plugin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz", - "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", "dev": true, "requires": { - "cacache": "^11.0.2", + "cacache": "^11.3.2", "find-cache-dir": "^2.0.0", + "is-wsl": "^1.1.0", + "loader-utils": "^1.2.3", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", + "serialize-javascript": "^1.7.0", "source-map": "^0.6.1", - "terser": "^3.16.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" + "terser": "^4.0.0", + "webpack-sources": "^1.3.0", + "worker-farm": "^1.7.0" }, "dependencies": { "source-map": { @@ -9429,12 +8413,6 @@ "os-tmpdir": "~1.0.2" } }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -9650,32 +8628,6 @@ "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", "dev": true }, - "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -9841,34 +8793,6 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -9946,12 +8870,6 @@ "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", "dev": true }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, "wait-on": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.2.0.tgz", @@ -9982,6 +8900,28 @@ "chokidar": "^2.0.2", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" + }, + "dependencies": { + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + } } }, "wbuf": { @@ -9993,28 +8933,10 @@ "minimalistic-assert": "^1.0.0" } }, - "webdriver-js-extender": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", - "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", - "dev": true, - "requires": { - "@types/selenium-webdriver": "^3.0.0", - "selenium-webdriver": "^3.0.1" - }, - "dependencies": { - "@types/selenium-webdriver": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", - "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", - "dev": true - } - } - }, "webpack": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.30.0.tgz", - "integrity": "sha512-4hgvO2YbAFUhyTdlR4FNyt2+YaYBYHavyzjCMbZzgglo02rlKi/pcsEzwCuCpsn1ryzIl1cq/u8ArIKu8JBYMg==", + "version": "4.35.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.2.tgz", + "integrity": "sha512-TZAmorNymV4q66gAM/h90cEjG+N3627Q2MnkSgKlX/z3DlNVKUtqy57lz1WmZU2+FUZwzM+qm7cGaO95PyrX5A==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -10071,14 +8993,14 @@ } }, "webpack-dev-middleware": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.6.2.tgz", - "integrity": "sha512-A47I5SX60IkHrMmZUlB0ZKSWi29TZTcPz7cha1Z75yYOsgWh/1AcPmQEbC8ZIbU3A1ytSv1PMU0PyPz2Lmz2jg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", "dev": true, "requires": { "memory-fs": "^0.4.1", - "mime": "^2.3.1", - "range-parser": "^1.0.3", + "mime": "^2.4.2", + "range-parser": "^1.2.1", "webpack-log": "^2.0.0" }, "dependencies": { @@ -10091,31 +9013,32 @@ } }, "webpack-dev-server": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.3.1.tgz", - "integrity": "sha512-jY09LikOyGZrxVTXK0mgIq9y2IhCoJ05848dKZqX1gAGLU1YDqgpOT71+W53JH/wI4v6ky4hm+KvSyW14JEs5A==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz", + "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==", "dev": true, "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.1.5", + "chokidar": "^2.1.6", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "debug": "^4.1.1", - "del": "^4.1.0", - "express": "^4.16.4", + "del": "^4.1.1", + "express": "^4.17.1", "html-entities": "^1.2.1", "http-proxy-middleware": "^0.19.1", "import-local": "^2.0.0", - "internal-ip": "^4.2.0", + "internal-ip": "^4.3.0", "ip": "^1.1.5", "killable": "^1.0.1", - "loglevel": "^1.6.1", + "loglevel": "^1.6.3", "opn": "^5.5.0", + "p-retry": "^3.0.1", "portfinder": "^1.0.20", "schema-utils": "^1.0.0", "selfsigned": "^1.10.4", - "semver": "^6.0.0", + "semver": "^6.1.1", "serve-index": "^1.9.1", "sockjs": "0.3.19", "sockjs-client": "1.3.0", @@ -10123,11 +9046,31 @@ "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.6.2", + "webpack-dev-middleware": "^3.7.0", "webpack-log": "^2.0.0", "yargs": "12.0.5" }, "dependencies": { + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -10142,6 +9085,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true + }, + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "dev": true } } }, @@ -10229,12 +9178,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -10291,47 +9234,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - }, - "dependencies": { - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - } - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -10389,12 +9291,6 @@ "fd-slicer": "~1.0.1" } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", diff --git a/package.json b/package.json index a73ce53aa..9d9116720 100644 --- a/package.json +++ b/package.json @@ -1,65 +1,55 @@ { - "name": "octo-print-dash", - "version": "0.5.0", - "license": "Apache 2.0", - "author": { - "name": "Timon Gaebelein", - "email": "timon.gaebelein@icloud.com" - }, - "main": "main.js", - "scripts": { - "ng": "ng", - "start": "npm-run-all -p ng:serve electron:serve", - "start:big": "npm-run-all -p ng:serve electron:serve:big", - "build": "ng build --prod && electron .", - "test": "ng test", - "lint": "ng lint", - "e2e": "ng e2e", - "electron": "electron .", - "electron:serve": "wait-on http-get://localhost:4200/ && electron . --serve", - "electron:serve:big": "wait-on http-get://localhost:4200/ && electron . --serve --big", - "electron:build": "electron-builder build --linux", - "ng:serve": "ng serve", - "ng:build": "ng build --prod" - }, - "private": true, - "dependencies": { - "@angular/animations": "~8.0.0", - "@angular/common": "~8.0.0", - "@angular/compiler": "~8.0.0", - "@angular/core": "~8.0.0", - "@angular/forms": "~8.0.0", - "@angular/platform-browser": "~8.0.0", - "@angular/platform-browser-dynamic": "~8.0.0", - "@angular/router": "~8.0.0", - "angular-svg-round-progressbar": "^3.0.1", - "rxjs": "~6.4.0", - "tslib": "^1.9.0", - "zone.js": "~0.9.1" - }, - "devDependencies": { - "@angular-devkit/build-angular": "~0.800.0", - "@angular/cli": "~8.0.0", - "@angular/compiler-cli": "~8.0.0", - "@angular/language-service": "~8.0.0", - "@types/jasmine": "~3.3.8", - "@types/jasminewd2": "~2.0.3", - "@types/node": "~8.9.4", - "codelyzer": "^5.0.0", - "electron": "^5.0.6", - "electron-reload": "^1.4.0", - "jasmine-core": "~3.4.0", - "jasmine-spec-reporter": "~4.2.1", - "karma": "~4.1.0", - "karma-chrome-launcher": "~2.2.0", - "karma-coverage-istanbul-reporter": "~2.0.1", - "karma-jasmine": "~2.0.1", - "karma-jasmine-html-reporter": "^1.4.0", - "npm-run-all": "^4.1.5", - "protractor": "~5.4.0", - "ts-node": "~7.0.0", - "tslint": "~5.15.0", - "typescript": "~3.4.3", - "wait-on": "^3.2.0" - } + "name": "octo-print-dash", + "version": "0.5.0", + "license": "Apache 2.0", + "author": { + "name": "Timon Gaebelein", + "email": "timon.gaebelein@icloud.com" + }, + "main": "main.js", + "scripts": { + "ng": "ng", + "start": "npm-run-all -p ng:serve electron:serve", + "start:big": "npm-run-all -p ng:serve electron:serve:big", + "build": "ng build --prod && electron .", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e", + "electron": "electron .", + "electron:serve": "wait-on http-get://localhost:4200/ && electron . --serve", + "electron:serve:big": "wait-on http-get://localhost:4200/ && electron . --serve --big", + "electron:build": "electron-builder build --linux", + "ng:serve": "ng serve", + "ng:build": "ng build --prod" + }, + "private": true, + "dependencies": { + "@angular/animations": "~8.0.0", + "@angular/common": "~8.0.0", + "@angular/compiler": "~8.0.0", + "@angular/core": "~8.0.0", + "@angular/forms": "~8.0.0", + "@angular/platform-browser": "~8.0.0", + "@angular/platform-browser-dynamic": "~8.0.0", + "@angular/router": "~8.0.0", + "angular-svg-round-progressbar": "^3.0.1", + "rxjs": "~6.4.0", + "tslib": "^1.9.0", + "zone.js": "~0.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^0.801.1", + "@angular/cli": "~8.0.0", + "@angular/compiler-cli": "^8.1.1", + "@angular/language-service": "~8.0.0", + "@types/node": "~8.9.4", + "codelyzer": "^5.0.0", + "electron": "^5.0.6", + "electron-reload": "^1.4.0", + "npm-run-all": "^4.1.5", + "ts-node": "~7.0.0", + "tslint": "~5.15.0", + "typescript": "~3.4.3", + "wait-on": "^3.2.0" + } } diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts deleted file mode 100644 index 6728fb82d..000000000 --- a/src/app/app.component.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { TestBed, async } from '@angular/core/testing'; -import { AppComponent } from './app.component'; - -describe('AppComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ - AppComponent - ], - }).compileComponents(); - })); - - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; - expect(app).toBeTruthy(); - }); - - it(`should have as title 'OctoPrintDash'`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; - expect(app.title).toEqual('OctoPrintDash'); - }); - - it('should render title in a h1 tag', () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.debugElement.nativeElement; - expect(compiled.querySelector('h1').textContent).toContain('Welcome to OctoPrintDash!'); - }); -}); diff --git a/src/app/app.component.ts b/src/app/app.component.ts index ef246747a..99996c842 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,8 +1,5 @@ import { Component } from '@angular/core'; -import { AppService } from './app.service'; -import { Config, ConfigService } from './config/config.service'; -import { timer, from } from 'rxjs' -import { map } from 'rxjs/operators' +import { ConfigService } from './config.service'; @Component({ selector: 'app-root', @@ -14,4 +11,3 @@ export class AppComponent { constructor(public configService: ConfigService) { } } - diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 07bc8eb07..8bc783500 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -8,7 +8,7 @@ import { BottomBarComponent } from './bottom-bar/bottom-bar.component'; import { PrinterStatusComponent } from './printer-status/printer-status.component'; import { JobStatusComponent } from './job-status/job-status.component'; import { AppService } from './app.service'; -import { ConfigService } from './config/config.service'; +import { ConfigService } from './config.service'; import { LayerProgressComponent } from './layer-progress/layer-progress.component'; @NgModule({ diff --git a/src/app/app.service.spec.ts b/src/app/app.service.spec.ts deleted file mode 100644 index 9bdcf24cb..000000000 --- a/src/app/app.service.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { AppService } from './app.service'; - -describe('AppService', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: AppService = TestBed.get(AppService); - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/bottom-bar/bottom-bar.component.spec.ts b/src/app/bottom-bar/bottom-bar.component.spec.ts deleted file mode 100644 index d9a4363a5..000000000 --- a/src/app/bottom-bar/bottom-bar.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { BottomBarComponent } from './bottom-bar.component'; - -describe('BottomBarComponent', () => { - let component: BottomBarComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ BottomBarComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(BottomBarComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/bottom-bar/bottom-bar.component.ts b/src/app/bottom-bar/bottom-bar.component.ts index c7b7d673e..2f39c4f11 100644 --- a/src/app/bottom-bar/bottom-bar.component.ts +++ b/src/app/bottom-bar/bottom-bar.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { ConfigService } from '../config/config.service'; +import { ConfigService } from '../config.service'; import { PrinterStatusService, PrinterStatusAPI } from '../printer-status.service'; @Component({ @@ -13,20 +13,20 @@ export class BottomBarComponent implements OnInit { enclosureTemperature: number; - constructor(private _printerStatusService: PrinterStatusService, private _configService: ConfigService) { - this._printerStatusService.getObservable().subscribe((printerStatus: PrinterStatusAPI) => this.printer.status = printerStatus.status) + constructor(private printerStatusService: PrinterStatusService, private configService: ConfigService) { + this.printerStatusService.getObservable().subscribe((printerStatus: PrinterStatusAPI) => this.printer.status = printerStatus.status); } ngOnInit() { - this.enclosureTemperature = 22.5; //TODO + this.enclosureTemperature = 22.5; // TODO this.printer = { - name: this._configService.config.printer.name, - status: "connecting ..." - } + name: this.configService.config.printer.name, + status: 'connecting ...' + }; } } interface Printer { name: string; status: string; -} \ No newline at end of file +} diff --git a/src/app/config/config.service.ts b/src/app/config.service.ts similarity index 70% rename from src/app/config/config.service.ts rename to src/app/config.service.ts index a2302b68a..bebdfb604 100644 --- a/src/app/config/config.service.ts +++ b/src/app/config.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; -import { environment } from '../../environments/environment'; +import { environment } from '../environments/environment'; @Injectable({ providedIn: 'root' @@ -8,8 +8,8 @@ import { environment } from '../../environments/environment'; export class ConfigService { public config: Config; - constructor(private _http: HttpClient) { - this._http.get(environment.config).subscribe((config: Config) => this.config = config) + constructor(private http: HttpClient) { + this.http.get(environment.config).subscribe((config: Config) => this.config = config); } } @@ -32,4 +32,4 @@ interface Printer { interface Filament { thickness: number; density: number; -} \ No newline at end of file +} diff --git a/src/app/config/config.service.spec.ts b/src/app/config/config.service.spec.ts deleted file mode 100644 index c8fff3dd4..000000000 --- a/src/app/config/config.service.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ConfigService } from './config.service'; - -describe('ConfigService', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: ConfigService = TestBed.get(ConfigService); - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/display-layer-progress.service.spec.ts b/src/app/display-layer-progress.service.spec.ts deleted file mode 100644 index 5c15051f6..000000000 --- a/src/app/display-layer-progress.service.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { DisplayLayerProgressService } from './display-layer-progress.service'; - -describe('DisplayLayerProgressService', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: DisplayLayerProgressService = TestBed.get(DisplayLayerProgressService); - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/display-layer-progress.service.ts b/src/app/display-layer-progress.service.ts index 6fc238329..2dc07244a 100644 --- a/src/app/display-layer-progress.service.ts +++ b/src/app/display-layer-progress.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { Observable, Observer, timer } from 'rxjs'; import { HttpHeaders, HttpErrorResponse, HttpClient } from '@angular/common/http'; -import { ConfigService } from './config/config.service'; +import { ConfigService } from './config.service'; import { share } from 'rxjs/operators'; @Injectable({ @@ -9,35 +9,35 @@ import { share } from 'rxjs/operators'; }) export class DisplayLayerProgressService { - observable: Observable + observable: Observable; - constructor(private _configService: ConfigService, private _http: HttpClient) { - this.observable = Observable.create((observer: Observer) => { - timer(750, this._configService.config.octoprint.apiInterval).subscribe(_ => { - if (this._configService.config) { + constructor(private configService: ConfigService, private http: HttpClient) { + this.observable = new Observable((observer: Observer) => { + timer(750, this.configService.config.octoprint.apiInterval).subscribe(_ => { + if (this.configService.config) { const httpHeaders = { headers: new HttpHeaders({ - 'x-api-key': this._configService.config.octoprint.accessToken + 'x-api-key': this.configService.config.octoprint.accessToken }) - } - this._http.get(this._configService.config.octoprint.url + "plugin/DisplayLayerProgress", httpHeaders).subscribe( + }; + this.http.get(this.configService.config.octoprint.url + 'plugin/DisplayLayerProgress', httpHeaders).subscribe( (data: JSON) => { observer.next({ - current: data["layer"]["current"] === "-" ? 0 : data["layer"]["current"], - total: data["layer"]["total"] === "-" ? 0 : data["layer"]["total"], - fanSpeed: data["fanSpeed"] === "-" ? 0 : data["fanSpeed"] + current: data['layer']['current'] === '-' ? 0 : data['layer']['current'], + total: data['layer']['total'] === '-' ? 0 : data['layer']['total'], + fanSpeed: data['fanSpeed'] === '-' ? 0 : data['fanSpeed'] }) }, (error: HttpErrorResponse) => { - console.error("Can't retrieve layerProgress! " + error.message) - }) + console.error('Can\'t retrieve layerProgress! ' + error.message); + }); } - }) - }).pipe(share()) + }); + }).pipe(share()); } - public getObservable(): Observable { - return this.observable + public getObservable(): Observable { + return this.observable; } } diff --git a/src/app/job-status.service.spec.ts b/src/app/job-status.service.spec.ts deleted file mode 100644 index 8b1736cb2..000000000 --- a/src/app/job-status.service.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { JobStatusService } from './job-status.service'; - -describe('JobStatusService', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: JobStatusService = TestBed.get(JobStatusService); - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/job-status.service.ts b/src/app/job-status.service.ts index cf8b1d576..1d93f2c2d 100644 --- a/src/app/job-status.service.ts +++ b/src/app/job-status.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { Observable, Observer, timer } from 'rxjs'; -import { ConfigService } from './config/config.service'; +import { ConfigService } from './config.service'; import { HttpHeaders, HttpClient, HttpErrorResponse } from '@angular/common/http'; import { share } from 'rxjs/operators'; @@ -9,58 +9,59 @@ import { share } from 'rxjs/operators'; }) export class JobStatusService { - observable: Observable + observable: Observable; - constructor(private _configService: ConfigService, private _http: HttpClient) { - this.observable = Observable.create((observer: Observer) => { - timer(1000, this._configService.config.octoprint.apiInterval).subscribe(_ => { - if (this._configService.config) { + constructor(private configService: ConfigService, private http: HttpClient) { + this.observable = new Observable((observer: Observer) => { + timer(1000, this.configService.config.octoprint.apiInterval).subscribe(_ => { + if (this.configService.config) { const httpHeaders = { headers: new HttpHeaders({ - 'x-api-key': this._configService.config.octoprint.accessToken + 'x-api-key': this.configService.config.octoprint.accessToken }) - } - this._http.get(this._configService.config.octoprint.url + "job", httpHeaders).subscribe( + }; + this.http.get(this.configService.config.octoprint.url + 'job', httpHeaders).subscribe( (data: JSON) => { let job: Job = null; - if (data["state"] == "Printing") { + if (data['state'] === 'Printing') { job = { - filename: data["job"]["file"]["display"].replace(".gcode", ""), - progress: Math.round((data["progress"]["filepos"] / data["job"]["file"]["size"]) * 100), - filamentAmount: this.filamentLengthToAmount(data["job"]["filament"]["tool0"]["length"]), + filename: data['job']['file']['display'].replace('.gcode', ''), + progress: Math.round((data['progress']['filepos'] / data['job']['file']['size']) * 100), + filamentAmount: this.filamentLengthToAmount(data['job']['filament']['tool0']['length']), timeLeft: { - value: this.timeConvert(data["progress"]["printTimeLeft"]), - unit: "h" + value: this.timeConvert(data['progress']['printTimeLeft']), + unit: 'h' }, timePrinted: { - value: this.timeConvert(data["progress"]["printTime"]), - unit: "h" + value: this.timeConvert(data['progress']['printTime']), + unit: 'h' }, - } + }; } observer.next(job); }, (error: HttpErrorResponse) => { - console.log("Can't retrieve jobs! " + error.message) - }) + console.log('Can\'t retrieve jobs! ' + error.message); + }); } - }) - }).pipe(share()) + }); + }).pipe(share()); } - public getObservable(): Observable { - return this.observable + public getObservable(): Observable { + return this.observable; } private timeConvert(input: number): string { - let hours = (input / 60 / 60); - let rhours = Math.floor(hours); - let minutes = (hours - rhours) * 60; - let rminutes = Math.round(minutes); - return rhours + ":" + ("0" + rminutes).slice(-2) + const hours = (input / 60 / 60); + const rhours = Math.floor(hours); + const minutes = (hours - rhours) * 60; + const rminutes = Math.round(minutes); + return rhours + ':' + ('0' + rminutes).slice(-2); } private filamentLengthToAmount(filamentLength: number): number { - return Math.round((Math.PI * (this._configService.config.filament.thickness / 2) * filamentLength) * this._configService.config.filament.density / 100) / 10 + return Math.round((Math.PI * (this.configService.config.filament.thickness / 2) * filamentLength) + * this.configService.config.filament.density / 100) / 10; } } diff --git a/src/app/job-status/job-status.component.spec.ts b/src/app/job-status/job-status.component.spec.ts deleted file mode 100644 index 0ea532358..000000000 --- a/src/app/job-status/job-status.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { JobStatusComponent } from './job-status.component'; - -describe('JobStatusComponent', () => { - let component: JobStatusComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ JobStatusComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(JobStatusComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/job-status/job-status.component.ts b/src/app/job-status/job-status.component.ts index 6771a7648..2f5e5d69a 100644 --- a/src/app/job-status/job-status.component.ts +++ b/src/app/job-status/job-status.component.ts @@ -10,9 +10,9 @@ import { JobStatusService, Job } from '../job-status.service'; export class JobStatusComponent implements OnInit { job: Job; - constructor(private _jobStatusService: JobStatusService) { } + constructor(private jobStatusService: JobStatusService) { } ngOnInit() { - this._jobStatusService.getObservable().subscribe((job: Job) => this.job = job); + this.jobStatusService.getObservable().subscribe((job: Job) => this.job = job); } -} \ No newline at end of file +} diff --git a/src/app/layer-progress/layer-progress.component.spec.ts b/src/app/layer-progress/layer-progress.component.spec.ts deleted file mode 100644 index ff975f96f..000000000 --- a/src/app/layer-progress/layer-progress.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { LayerProgressComponent } from './layer-progress.component'; - -describe('LayerProgressComponent', () => { - let component: LayerProgressComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ LayerProgressComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(LayerProgressComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/layer-progress/layer-progress.component.ts b/src/app/layer-progress/layer-progress.component.ts index 3bd7a5dde..50d3028d0 100644 --- a/src/app/layer-progress/layer-progress.component.ts +++ b/src/app/layer-progress/layer-progress.component.ts @@ -8,14 +8,14 @@ import { DisplayLayerProgressService, DisplayLayerProgressAPI } from '../display }) export class LayerProgressComponent implements OnInit { - layerProgress: LayerProgress + layerProgress: LayerProgress; - constructor(private _displayLayerProgressService: DisplayLayerProgressService) { + constructor(private displayLayerProgressService: DisplayLayerProgressService) { this.layerProgress = { current: 0, total: 0 - } - this._displayLayerProgressService.getObservable().subscribe((layerProgress: DisplayLayerProgressAPI) => { + }; + this.displayLayerProgressService.getObservable().subscribe((layerProgress: DisplayLayerProgressAPI) => { this.layerProgress.current = layerProgress.current; this.layerProgress.total = layerProgress.total; }); @@ -29,4 +29,4 @@ export class LayerProgressComponent implements OnInit { export interface LayerProgress { current: number; total: number; -} \ No newline at end of file +} diff --git a/src/app/printer-status.service.spec.ts b/src/app/printer-status.service.spec.ts deleted file mode 100644 index ff5ce3e1e..000000000 --- a/src/app/printer-status.service.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { PrinterStatusService } from './printer-status.service'; - -describe('PrinterStatusService', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: PrinterStatusService = TestBed.get(PrinterStatusService); - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/printer-status.service.ts b/src/app/printer-status.service.ts index 381ed14cc..2d2bfbbe9 100644 --- a/src/app/printer-status.service.ts +++ b/src/app/printer-status.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http'; -import { ConfigService } from './config/config.service'; +import { ConfigService } from './config.service'; import { Observable, Observer, timer } from 'rxjs'; import { share } from 'rxjs/operators'; @@ -9,31 +9,31 @@ import { share } from 'rxjs/operators'; }) export class PrinterStatusService { - observable: Observable; + observable: Observable; - constructor(private _http: HttpClient, private _configService: ConfigService) { - this.observable = Observable.create((observer: Observer) => { - timer(500, this._configService.config.octoprint.apiInterval).subscribe(_ => { - if (this._configService.config) { + constructor(private http: HttpClient, private configService: ConfigService) { + this.observable = new Observable((observer: Observer) => { + timer(500, this.configService.config.octoprint.apiInterval).subscribe(_ => { + if (this.configService.config) { const httpHeaders = { headers: new HttpHeaders({ - 'x-api-key': this._configService.config.octoprint.accessToken + 'x-api-key': this.configService.config.octoprint.accessToken }) - } - this._http.get(this._configService.config.octoprint.url + "printer", httpHeaders).subscribe( + }; + this.http.get(this.configService.config.octoprint.url + 'printer', httpHeaders).subscribe( (data: JSON) => { const printerStatus: PrinterStatusAPI = { - status: data["state"]["text"].toLowerCase(), + status: data['state']['text'].toLowerCase(), nozzle: { - current: Math.round(data["temperature"]["tool0"]["actual"]), - set: Math.round(data["temperature"]["tool0"]["target"]) + current: Math.round(data['temperature']['tool0']['actual']), + set: Math.round(data['temperature']['tool0']['target']) }, heatbed: { - current: Math.round(data["temperature"]["bed"]["actual"]), - set: Math.round(data["temperature"]["bed"]["target"]) + current: Math.round(data['temperature']['bed']['actual']), + set: Math.round(data['temperature']['bed']['target']) } - } - observer.next(printerStatus) + }; + observer.next(printerStatus); }, (error: HttpErrorResponse) => { const printerStatus: PrinterStatusAPI = { status: `error (${error.status})`, @@ -45,16 +45,16 @@ export class PrinterStatusService { current: 0, set: 0 } - } - observer.next(printerStatus) - }) + }; + observer.next(printerStatus); + }); } - }) - }).pipe(share()) + }); + }).pipe(share()); } - getObservable(): Observable { - return this.observable + getObservable(): Observable { + return this.observable; } } @@ -67,4 +67,4 @@ export interface PrinterStatusAPI { export interface PrinterValue { current: number; set: number; -} \ No newline at end of file +} diff --git a/src/app/printer-status/printer-status.component.spec.ts b/src/app/printer-status/printer-status.component.spec.ts deleted file mode 100644 index 23d16504b..000000000 --- a/src/app/printer-status/printer-status.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PrinterStatusComponent } from './printer-status.component'; - -describe('PrinterStatusComponent', () => { - let component: PrinterStatusComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ PrinterStatusComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(PrinterStatusComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/printer-status/printer-status.component.ts b/src/app/printer-status/printer-status.component.ts index 8d10e684f..3f7aae242 100644 --- a/src/app/printer-status/printer-status.component.ts +++ b/src/app/printer-status/printer-status.component.ts @@ -9,9 +9,9 @@ import { DisplayLayerProgressService, DisplayLayerProgressAPI } from '../display }) export class PrinterStatusComponent implements OnInit { - printerStatus: PrinterStatus + printerStatus: PrinterStatus; - constructor(private _printerStatusService: PrinterStatusService, private _displayLayerProgressService: DisplayLayerProgressService) { + constructor(private printerStatusService: PrinterStatusService, private displayLayerProgressService: DisplayLayerProgressService) { this.printerStatus = { nozzle: { current: 0, @@ -23,14 +23,14 @@ export class PrinterStatusComponent implements OnInit { }, fan: 0 }; - this._printerStatusService.getObservable().subscribe((printerStatus: PrinterStatusAPI) => { + this.printerStatusService.getObservable().subscribe((printerStatus: PrinterStatusAPI) => { this.printerStatus.nozzle = printerStatus.nozzle; this.printerStatus.heatbed = printerStatus.heatbed; - }) + }); - this._displayLayerProgressService.getObservable().subscribe((layerProgress: DisplayLayerProgressAPI) => { - this.printerStatus.fan = layerProgress.fanSpeed - }) + this.displayLayerProgressService.getObservable().subscribe((layerProgress: DisplayLayerProgressAPI) => { + this.printerStatus.fan = layerProgress.fanSpeed; + }); } ngOnInit() { } @@ -41,4 +41,4 @@ export interface PrinterStatus { nozzle: PrinterValue; heatbed: PrinterValue; fan: number; -} \ No newline at end of file +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json deleted file mode 100644 index 6400fde7d..000000000 --- a/tsconfig.spec.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/spec", - "types": [ - "jasmine", - "node" - ] - }, - "files": [ - "src/test.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.spec.ts", - "src/**/*.d.ts" - ] -} From be4cbad5d78e02e43fa5a061b583a5eef35a79c1 Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Sat, 13 Jul 2019 00:36:03 +0200 Subject: [PATCH 02/18] IPC working --- angular.json | 233 +++++++++---------- main.js | 35 ++- src/app/bottom-bar/bottom-bar.component.html | 2 +- src/app/config.service.ts | 20 +- src/environments/environment.prod.ts | 2 +- src/environments/environment.ts | 2 +- 6 files changed, 161 insertions(+), 133 deletions(-) diff --git a/angular.json b/angular.json index 8a5eb7dd0..cebbfbf94 100644 --- a/angular.json +++ b/angular.json @@ -1,123 +1,120 @@ { - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "OctoPrintDash": { - "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "style": "scss" - } - }, - "root": "", - "sourceRoot": "src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "dist/OctoPrintDash", - "index": "src/index.html", - "main": "src/main.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.app.json", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "src/styles.scss" - ], - "scripts": [] - }, - "configurations": { - "production": { - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "OctoPrintDash": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "extractCss": true, - "namedChunks": false, - "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "budgets": [ - { - "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [{ + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + }], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [{ + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "OctoPrintDash:build" + }, + "configurations": { + "production": { + "browserTarget": "OctoPrintDash:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "OctoPrintDash:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.scss" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "OctoPrintDash:serve" + }, + "configurations": { + "production": { + "devServerTarget": "OctoPrintDash:serve:production" + } + } } - ] - } - } - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "OctoPrintDash:build" - }, - "configurations": { - "production": { - "browserTarget": "OctoPrintDash:build:production" - } - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "OctoPrintDash:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "src/test.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.spec.json", - "karmaConfig": "karma.conf.js", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "src/styles.scss" - ], - "scripts": [] - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "tsconfig.app.json", - "tsconfig.spec.json", - "e2e/tsconfig.json" - ], - "exclude": [ - "**/node_modules/**" - ] - } - }, - "e2e": { - "builder": "@angular-devkit/build-angular:protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "OctoPrintDash:serve" - }, - "configurations": { - "production": { - "devServerTarget": "OctoPrintDash:serve:production" } - } } - } - }}, - "defaultProject": "OctoPrintDash" -} \ No newline at end of file + }, + "defaultProject": "OctoPrintDash" +} diff --git a/main.js b/main.js index 24c885952..d68b58bfb 100644 --- a/main.js +++ b/main.js @@ -4,6 +4,7 @@ const { } = require("electron"); const url = require('url') const path = require('path') +const ipcMain = require('electron').ipcMain const args = process.argv.slice(1); const dev = args.some(val => val === '--serve'); @@ -14,19 +15,27 @@ let window; function createWindow() { + setupIPC(); + if (!big) { window = new BrowserWindow({ - width: dev ? 1000 : 480, - height: 320, - frame: false, - fullscreen: false + width: dev ? 1000 : 1000, + height: dev ? 342 : 320, + frame: dev ? true : false, + fullscreen: dev ? false : true, + webPreferences: { + nodeIntegration: true + } }) } else { window = new BrowserWindow({ width: dev ? 1400 : 800, - height: 480, - frame: false, - fullscreen: false + height: dev ? 502 : 480, + frame: dev ? true : false, + fullscreen: dev ? false : true, + webPreferences: { + nodeIntegration: true + } }) } @@ -37,19 +46,25 @@ function createWindow() { window.loadURL('http://localhost:4200'); } else { window.loadURL(url.format({ - pathname: path.join(__dirname, 'dist/OctoPrintDash/index.html'), + pathname: path.join(__dirname, 'dist/index.html'), protocol: 'file:', slashes: true })); } - if (dev) window.webContents.openDevTools(); - // window.webContents.openDevTools(); + // if (dev) window.webContents.openDevTools(); + window.webContents.openDevTools(); window.on('closed', () => { window = null; }); +} +function setupIPC() { + ipcMain.on("config", (event, arg) => { + console.log("Received config request"); + event.returnValue = "test123"; + }) } app.on('ready', createWindow) diff --git a/src/app/bottom-bar/bottom-bar.component.html b/src/app/bottom-bar/bottom-bar.component.html index 5c3c264c6..8e81ce927 100644 --- a/src/app/bottom-bar/bottom-bar.component.html +++ b/src/app/bottom-bar/bottom-bar.component.html @@ -1,6 +1,6 @@ - + diff --git a/src/app/config.service.ts b/src/app/config.service.ts index bebdfb604..8c3ebdfad 100644 --- a/src/app/config.service.ts +++ b/src/app/config.service.ts @@ -1,15 +1,31 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { environment } from '../environments/environment'; +import { IpcRenderer, IpcMessageEvent } from 'electron'; + +declare global { + interface Window { require: any; } +} @Injectable({ providedIn: 'root' }) export class ConfigService { public config: Config; + private ipc: IpcRenderer | undefined; constructor(private http: HttpClient) { - this.http.get(environment.config).subscribe((config: Config) => this.config = config); + if (window.require) { + try { + this.ipc = window.require('electron').ipcRenderer; + console.log(this.ipc.sendSync('config', 'abc')); + } catch (e) { + throw e; + } + } else { + console.warn('Can\'t load IPC, config may not be up to date! (non-electron version)'); + this.http.get(environment.config).subscribe((config: Config) => this.config = config); + } } } @@ -32,4 +48,4 @@ interface Printer { interface Filament { thickness: number; density: number; -} +} \ No newline at end of file diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index bf045171e..35734d1d1 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - config: "assets/config.json" + config: 'assets/config.json' }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 80ed091eb..1b79cbb2b 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -4,7 +4,7 @@ export const environment = { production: false, - config: "assets/config.testing.json" + config: 'assets/config.testing.json' }; /* From 043af848d2c72ab0d8ad8f8728c0d1704586596b Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Sat, 13 Jul 2019 01:50:01 +0200 Subject: [PATCH 03/18] Electron Storage working, Config Validation works, still some work to do --- main.js | 10 - package-lock.json | 180 ++++++++++++++++-- package.json | 3 + src/app/app.component.html | 16 +- src/app/app.module.ts | 6 +- src/app/bottom-bar/bottom-bar.component.html | 2 +- src/app/config.service.ts | 116 +++++++++-- .../invalid-config.component.html | 1 + .../invalid-config.component.scss | 0 .../invalid-config.component.ts | 15 ++ src/app/job-status.service.ts | 2 +- src/app/no-config/no-config.component.html | 1 + src/app/no-config/no-config.component.scss | 0 src/app/no-config/no-config.component.spec.ts | 25 +++ src/app/no-config/no-config.component.ts | 15 ++ tsconfig.json | 37 ++-- tslint.json | 180 +++++++++--------- 17 files changed, 459 insertions(+), 150 deletions(-) create mode 100644 src/app/invalid-config/invalid-config.component.html create mode 100644 src/app/invalid-config/invalid-config.component.scss create mode 100644 src/app/invalid-config/invalid-config.component.ts create mode 100644 src/app/no-config/no-config.component.html create mode 100644 src/app/no-config/no-config.component.scss create mode 100644 src/app/no-config/no-config.component.spec.ts create mode 100644 src/app/no-config/no-config.component.ts diff --git a/main.js b/main.js index d68b58bfb..3b402dbd3 100644 --- a/main.js +++ b/main.js @@ -4,7 +4,6 @@ const { } = require("electron"); const url = require('url') const path = require('path') -const ipcMain = require('electron').ipcMain const args = process.argv.slice(1); const dev = args.some(val => val === '--serve'); @@ -14,9 +13,6 @@ const big = args.some(val => val === '--big-screen') let window; function createWindow() { - - setupIPC(); - if (!big) { window = new BrowserWindow({ width: dev ? 1000 : 1000, @@ -60,12 +56,6 @@ function createWindow() { }); } -function setupIPC() { - ipcMain.on("config", (event, arg) => { - console.log("Received config request"); - event.returnValue = "test123"; - }) -} app.on('ready', createWindow) diff --git a/package-lock.json b/package-lock.json index 8edf7cebf..92d20a938 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,6 +93,18 @@ "source-map": "0.7.3" } }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -186,6 +198,20 @@ "magic-string": "0.25.3", "rxjs": "6.4.0", "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } } }, "magic-string": { @@ -210,6 +236,20 @@ "magic-string": "0.25.2", "rxjs": "6.4.0", "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } } }, "@angular-devkit/schematics": { @@ -472,6 +512,20 @@ "magic-string": "0.25.3", "rxjs": "6.4.0", "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } } }, "magic-string": { @@ -511,6 +565,15 @@ "semver-intersect": "1.4.0" } }, + "@types/ajv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/ajv/-/ajv-1.0.0.tgz", + "integrity": "sha1-T7JEB0Ly9sMOf7B5e4OfxvaWaCo=", + "dev": true, + "requires": { + "ajv": "*" + } + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -810,10 +873,9 @@ } }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz", + "integrity": "sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -2126,6 +2188,38 @@ "typedarray": "^0.0.6" } }, + "conf": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-5.0.0.tgz", + "integrity": "sha512-lRNyt+iRD4plYaOSVTxu1zPWpaH0EOxgFIR1l3mpC/DGZ7XzhoGFMKmbl54LAgXcSu6knqWgOwdINkqm58N85A==", + "dev": true, + "requires": { + "ajv": "^6.10.0", + "dot-prop": "^5.0.0", + "env-paths": "^2.2.0", + "json-schema-typed": "^7.0.0", + "make-dir": "^3.0.0", + "pkg-up": "^3.0.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + } + } + }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", @@ -2653,6 +2747,15 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "dot-prop": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.1.0.tgz", + "integrity": "sha512-n1oC6NBF+KM9oVXtjmen4Yo7HyAVWV2UUl50dCYJdw2924K6dX9bf9TTTWaKtYlRn0FEtxG27KS80ayVLixxJA==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -2782,6 +2885,16 @@ } } }, + "electron-store": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-4.0.0.tgz", + "integrity": "sha512-qgkDetwB9bz+ZA7mNCQGm6zLJOMT4yBkTZ7f16M9iS0GcI/bOeOeFkLkIaJddTtPca7MOiaUM1imMjFqUfQgSA==", + "dev": true, + "requires": { + "conf": "^5.0.0", + "type-fest": "^0.5.2" + } + }, "electron-to-chromium": { "version": "1.3.191", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.191.tgz", @@ -3240,14 +3353,12 @@ "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fastparse": { "version": "1.1.2", @@ -4787,6 +4898,12 @@ } } }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -5043,7 +5160,12 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-schema-typed": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.0.tgz", + "integrity": "sha512-ikVqF4dlAgRvAb3MDAgDQRtB/GIC8+iq+z5bczPh9bUT7bAZCdGfGCypJHBquzZNoxebql1UgPxWbImnvkSuJg==", "dev": true }, "json-stringify-safe": { @@ -6482,6 +6604,15 @@ "find-up": "^3.0.0" } }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "portfinder": { "version": "1.0.21", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", @@ -6756,8 +6887,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { "version": "6.5.2", @@ -8606,6 +8736,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -8622,6 +8758,15 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "3.4.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", @@ -8748,7 +8893,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -9234,6 +9378,18 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write-file-atomic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.0.tgz", + "integrity": "sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index 9d9116720..1b7d3f393 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@angular/platform-browser": "~8.0.0", "@angular/platform-browser-dynamic": "~8.0.0", "@angular/router": "~8.0.0", + "ajv": "^6.10.1", "angular-svg-round-progressbar": "^3.0.1", "rxjs": "~6.4.0", "tslib": "^1.9.0", @@ -42,10 +43,12 @@ "@angular/cli": "~8.0.0", "@angular/compiler-cli": "^8.1.1", "@angular/language-service": "~8.0.0", + "@types/ajv": "^1.0.0", "@types/node": "~8.9.4", "codelyzer": "^5.0.0", "electron": "^5.0.6", "electron-reload": "^1.4.0", + "electron-store": "^4.0.0", "npm-run-all": "^4.1.5", "ts-node": "~7.0.0", "tslint": "~5.15.0", diff --git a/src/app/app.component.html b/src/app/app.component.html index ef43037f0..71049995c 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,6 +1,14 @@
- - - - +
+ + + + +
+
+ +
+
+
+
\ No newline at end of file diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 8bc783500..13d7785e7 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -10,6 +10,8 @@ import { JobStatusComponent } from './job-status/job-status.component'; import { AppService } from './app.service'; import { ConfigService } from './config.service'; import { LayerProgressComponent } from './layer-progress/layer-progress.component'; +import { InvalidConfigComponent } from './invalid-config/invalid-config.component'; +import { NoConfigComponent } from './no-config/no-config.component'; @NgModule({ declarations: [ @@ -17,7 +19,9 @@ import { LayerProgressComponent } from './layer-progress/layer-progress.componen BottomBarComponent, PrinterStatusComponent, JobStatusComponent, - LayerProgressComponent + LayerProgressComponent, + InvalidConfigComponent, + NoConfigComponent ], imports: [ BrowserModule, diff --git a/src/app/bottom-bar/bottom-bar.component.html b/src/app/bottom-bar/bottom-bar.component.html index 8e81ce927..5c3c264c6 100644 --- a/src/app/bottom-bar/bottom-bar.component.html +++ b/src/app/bottom-bar/bottom-bar.component.html @@ -1,6 +1,6 @@
{{ printer.name }} {{ printer.name }} {{ enclosureTemperature }}°C {{ printer.status }}
- + diff --git a/src/app/config.service.ts b/src/app/config.service.ts index 8c3ebdfad..1941a5eb8 100644 --- a/src/app/config.service.ts +++ b/src/app/config.service.ts @@ -1,10 +1,13 @@ -import { Injectable } from '@angular/core'; +import { Injectable, Input } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { environment } from '../environments/environment'; -import { IpcRenderer, IpcMessageEvent } from 'electron'; +import * as Ajv from 'ajv'; declare global { - interface Window { require: any; } + interface Window { + require: any; + process: any; + } } @Injectable({ @@ -12,21 +15,29 @@ declare global { }) export class ConfigService { public config: Config; - private ipc: IpcRenderer | undefined; + private store: any | undefined; + private validator: Ajv.ValidateFunction; + public valid: boolean; constructor(private http: HttpClient) { - if (window.require) { - try { - this.ipc = window.require('electron').ipcRenderer; - console.log(this.ipc.sendSync('config', 'abc')); - } catch (e) { - throw e; - } + if (window && window.process && window.process.type) { + const ajv = new Ajv({ allErrors: true }); + this.validator = ajv.compile(schema); + const Store = window.require('electron-store'); + this.store = new Store(); + // this.store.set('config', 'abc'); + // this.store.delete('config'); + this.config = this.store.get('config'); + this.valid = this.validate(); } else { - console.warn('Can\'t load IPC, config may not be up to date! (non-electron version)'); + console.warn('Detected non-electron environment. Fallback to assets/config.json. Any changes are non-persistent!'); this.http.get(environment.config).subscribe((config: Config) => this.config = config); } } + + private validate(): boolean { + return this.validator(this.config) ? true : false; + } } export interface Config { @@ -48,4 +59,83 @@ interface Printer { interface Filament { thickness: number; density: number; -} \ No newline at end of file +} + +const schema = { + definitions: {}, + $id: 'http://example.com/root.json', + type: 'object', + title: 'The Root Schema', + required: [ + 'octoprint', + 'printer', + 'filament' + ], + properties: { + octoprint: { + $id: '#/properties/octoprint', + type: 'object', + title: 'The Octoprint Schema', + required: [ + 'url', + 'accessToken', + 'apiInterval' + ], + properties: { + url: { + $id: '#/properties/octoprint/properties/url', + type: 'string', + title: 'The Url Schema', + default: 'http://localhost:5000/api/' + }, + accessToken: { + $id: '#/properties/octoprint/properties/accessToken', + type: 'string', + title: 'The Accesstoken Schema' + }, + apiInterval: { + $id: '#/properties/octoprint/properties/apiInterval', + type: 'integer', + title: 'The Apiinterval Schema', + default: 2000 + } + } + }, + printer: { + $id: '#/properties/printer', + type: 'object', + title: 'The Printer Schema', + required: [ + 'name' + ], + properties: { + name: { + $id: '#/properties/printer/properties/name', + type: 'string', + title: 'The Name Schema' + } + } + }, + filament: { + $id: '#/properties/filament', + type: 'object', + title: 'The Filament Schema', + required: [ + 'thickness', + 'density' + ], + properties: { + thickness: { + $id: '#/properties/filament/properties/thickness', + type: 'number', + title: 'The Thickness Schema' + }, + density: { + $id: '#/properties/filament/properties/density', + type: 'number', + title: 'The Density Schema' + } + } + } + } +}; diff --git a/src/app/invalid-config/invalid-config.component.html b/src/app/invalid-config/invalid-config.component.html new file mode 100644 index 000000000..a5619cabb --- /dev/null +++ b/src/app/invalid-config/invalid-config.component.html @@ -0,0 +1 @@ +INVALID CONFIG \ No newline at end of file diff --git a/src/app/invalid-config/invalid-config.component.scss b/src/app/invalid-config/invalid-config.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/invalid-config/invalid-config.component.ts b/src/app/invalid-config/invalid-config.component.ts new file mode 100644 index 000000000..18ae092e7 --- /dev/null +++ b/src/app/invalid-config/invalid-config.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-invalid-config', + templateUrl: './invalid-config.component.html', + styleUrls: ['./invalid-config.component.scss'] +}) +export class InvalidConfigComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/job-status.service.ts b/src/app/job-status.service.ts index 1d93f2c2d..cd728fdff 100644 --- a/src/app/job-status.service.ts +++ b/src/app/job-status.service.ts @@ -40,7 +40,7 @@ export class JobStatusService { } observer.next(job); }, (error: HttpErrorResponse) => { - console.log('Can\'t retrieve jobs! ' + error.message); + console.error('Can\'t retrieve jobs! ' + error.message); }); } }); diff --git a/src/app/no-config/no-config.component.html b/src/app/no-config/no-config.component.html new file mode 100644 index 000000000..876436e4c --- /dev/null +++ b/src/app/no-config/no-config.component.html @@ -0,0 +1 @@ +NO CONFIG \ No newline at end of file diff --git a/src/app/no-config/no-config.component.scss b/src/app/no-config/no-config.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/no-config/no-config.component.spec.ts b/src/app/no-config/no-config.component.spec.ts new file mode 100644 index 000000000..b6701bdb2 --- /dev/null +++ b/src/app/no-config/no-config.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NoConfigComponent } from './no-config.component'; + +describe('NoConfigComponent', () => { + let component: NoConfigComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NoConfigComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NoConfigComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/no-config/no-config.component.ts b/src/app/no-config/no-config.component.ts new file mode 100644 index 000000000..a087d7c7d --- /dev/null +++ b/src/app/no-config/no-config.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-no-config', + templateUrl: './no-config.component.html', + styleUrls: ['./no-config.component.scss'] +}) +export class NoConfigComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/tsconfig.json b/tsconfig.json index b3acac1f3..349a15f7c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,21 @@ { - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist", - "sourceMap": true, - "declaration": false, - "module": "commonjs", - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "importHelpers": true, - "target": "es5", - "typeRoots": [ - "node_modules/@types" - ], - "types": [], - "lib": ["es2018", "dom"], - } + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist", + "sourceMap": true, + "declaration": false, + "module": "commonjs", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "types": [], + "lib": ["es2018", "dom"], + "esModuleInterop": true, + } } diff --git a/tslint.json b/tslint.json index 188bd78d3..fcb585ef7 100644 --- a/tslint.json +++ b/tslint.json @@ -1,92 +1,92 @@ { - "extends": "tslint:recommended", - "rules": { - "array-type": false, - "arrow-parens": false, - "deprecation": { - "severity": "warn" + "extends": "tslint:recommended", + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warn" + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-use-before-declare": false, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true }, - "component-class-suffix": true, - "contextual-lifecycle": true, - "directive-class-suffix": true, - "directive-selector": [ - true, - "attribute", - "app", - "camelCase" - ], - "component-selector": [ - true, - "element", - "app", - "kebab-case" - ], - "import-blacklist": [ - true, - "rxjs/Rx" - ], - "interface-name": false, - "max-classes-per-file": false, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-consecutive-blank-lines": false, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-empty": false, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-non-null-assertion": true, - "no-redundant-jsdoc": true, - "no-switch-case-fall-through": true, - "no-use-before-declare": true, - "no-var-requires": false, - "object-literal-key-quotes": [ - true, - "as-needed" - ], - "object-literal-sort-keys": false, - "ordered-imports": false, - "quotemark": [ - true, - "single" - ], - "trailing-comma": false, - "no-conflicting-lifecycle": true, - "no-host-metadata-property": true, - "no-input-rename": true, - "no-inputs-metadata-property": true, - "no-output-native": true, - "no-output-on-prefix": true, - "no-output-rename": true, - "no-outputs-metadata-property": true, - "template-banana-in-box": true, - "template-no-negated-async": true, - "use-lifecycle-interface": true, - "use-pipe-transform-interface": true - }, - "rulesDirectory": [ - "codelyzer" - ] -} \ No newline at end of file + "rulesDirectory": [ + "codelyzer" + ] +} From ce5bffb7c0d1542c2601a80d3d6fc4dde41f0577 Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Sat, 13 Jul 2019 22:44:32 +0200 Subject: [PATCH 04/18] Invalid configs are now detected + readable error is shown --- icons.txt | 1 + octoprint_dash.conf | 14 - package.json | 2 +- server/app.js | 12 - server/package-lock.json | 374 ------------------ server/package.json | 14 - src/app/config.service.ts | 26 +- .../invalid-config.component.html | 9 +- .../invalid-config.component.scss | 35 ++ .../invalid-config.component.ts | 7 +- .../printer-status.component.html | 2 +- src/assets/fan.svg | 23 +- src/assets/heat-bed.svg | 1 + src/assets/hot_bed.svg | 22 -- src/assets/invalid-config.svg | 1 + src/assets/nozzle.svg | 23 +- src/styles.scss | 2 +- 17 files changed, 78 insertions(+), 490 deletions(-) create mode 100644 icons.txt delete mode 100644 octoprint_dash.conf delete mode 100644 server/app.js delete mode 100644 server/package-lock.json delete mode 100644 server/package.json create mode 100644 src/assets/heat-bed.svg delete mode 100644 src/assets/hot_bed.svg create mode 100644 src/assets/invalid-config.svg diff --git a/icons.txt b/icons.txt new file mode 100644 index 000000000..2255f2676 --- /dev/null +++ b/icons.txt @@ -0,0 +1 @@ +"Invalid Code" by Arthur Shlain from thenounproject.com diff --git a/octoprint_dash.conf b/octoprint_dash.conf deleted file mode 100644 index ccefada04..000000000 --- a/octoprint_dash.conf +++ /dev/null @@ -1,14 +0,0 @@ -[Unit] -Description="OctoprintDash - a simple, beautiful UI to monitor Octoprint" -Author="Timon G." - -[Service] -ExecStart=/usr/local/bin/node /opt/OcotprintDash/app.js -Restart=always -RestartSec=10 -StandardOutput=syslog -StandardError=syslog -SyslogIdentifier=octoprint-dash - -[Install] -WantedBy=multi-user.target \ No newline at end of file diff --git a/package.json b/package.json index 1b7d3f393..49118e8bf 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "octo-print-dash", + "name": "octodash", "version": "0.5.0", "license": "Apache 2.0", "author": { diff --git a/server/app.js b/server/app.js deleted file mode 100644 index 9d3477da6..000000000 --- a/server/app.js +++ /dev/null @@ -1,12 +0,0 @@ -const express = require('express'); -const path = require('path'); - -const port = 8080; - -let app = express(); - -app.use(express.static(path.resolve(__dirname, 'web'))); - -app.listen(port, () => { - console.log('OctoprintDash listening on port ' + port) -}) \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json deleted file mode 100644 index 4e9e7e7fd..000000000 --- a/server/package-lock.json +++ /dev/null @@ -1,374 +0,0 @@ -{ - "name": "octoprint_dash_server", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - } - } -} diff --git a/server/package.json b/server/package.json deleted file mode 100644 index cfabb4672..000000000 --- a/server/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "octoprint_dash_server", - "version": "1.0.0", - "description": "", - "main": "app.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.17.1" - } -} diff --git a/src/app/config.service.ts b/src/app/config.service.ts index 1941a5eb8..9ae87607d 100644 --- a/src/app/config.service.ts +++ b/src/app/config.service.ts @@ -20,24 +20,40 @@ export class ConfigService { public valid: boolean; constructor(private http: HttpClient) { + const ajv = new Ajv({ allErrors: true }); + this.validator = ajv.compile(schema); if (window && window.process && window.process.type) { - const ajv = new Ajv({ allErrors: true }); - this.validator = ajv.compile(schema); const Store = window.require('electron-store'); this.store = new Store(); - // this.store.set('config', 'abc'); + this.store.set('config', { 'type': 'abv' }); // this.store.delete('config'); this.config = this.store.get('config'); this.valid = this.validate(); } else { console.warn('Detected non-electron environment. Fallback to assets/config.json. Any changes are non-persistent!'); - this.http.get(environment.config).subscribe((config: Config) => this.config = config); + this.http.get(environment.config).subscribe((config: Config) => { + this.config = config + this.valid = this.validate(); + }); } } - private validate(): boolean { + public validate(): boolean { return this.validator(this.config) ? true : false; } + + public getJSONError(): string[] { + console.log(this.validator.errors); + const errors = []; + this.validator.errors.forEach(error => { + if (error.keyword === 'type') { + errors.push(`${error.dataPath} ${error.message}`); + } else { + errors.push(`${error.dataPath === '' ? '.' : error.dataPath} ${error.message}`); + } + }); + return errors; + } } export interface Config { diff --git a/src/app/invalid-config/invalid-config.component.html b/src/app/invalid-config/invalid-config.component.html index a5619cabb..7edce2887 100644 --- a/src/app/invalid-config/invalid-config.component.html +++ b/src/app/invalid-config/invalid-config.component.html @@ -1 +1,8 @@ -INVALID CONFIG \ No newline at end of file +
+ + Your config is invalid! + Please correct the errors listed below! +
    +
  • {{ error }}
  • +
+
\ No newline at end of file diff --git a/src/app/invalid-config/invalid-config.component.scss b/src/app/invalid-config/invalid-config.component.scss index e69de29bb..19380d1c9 100644 --- a/src/app/invalid-config/invalid-config.component.scss +++ b/src/app/invalid-config/invalid-config.component.scss @@ -0,0 +1,35 @@ +.invalid-config__top-icon { + width: 16vw; + display: block; + margin-left: calc(50% - 8vw); + margin-top: -4vh; + margin-bottom: -8vh; +} + +.invalid-config__header { + display: block; + text-align: center; + font-size: 6vw; +} + +.invalid-config__sub-header { + text-align: center; + font-size: 3vw; + display: block; +} + +.invalid-config__error-list { + margin-left: 2vw; + font-size: 3.5vw; + margin-top: 5vh; + list-style-type: disc; + + & li { + margin-top: 2vh; + + &::before { + content: "-"; + margin-right: 2vw; + } + } +} diff --git a/src/app/invalid-config/invalid-config.component.ts b/src/app/invalid-config/invalid-config.component.ts index 18ae092e7..c78c989ef 100644 --- a/src/app/invalid-config/invalid-config.component.ts +++ b/src/app/invalid-config/invalid-config.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; +import { ConfigService } from '../config.service'; @Component({ selector: 'app-invalid-config', @@ -6,10 +7,14 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./invalid-config.component.scss'] }) export class InvalidConfigComponent implements OnInit { + errors: string[]; - constructor() { } + constructor(private configService: ConfigService) { + + } ngOnInit() { + this.errors = this.configService.getJSONError(); } } diff --git a/src/app/printer-status/printer-status.component.html b/src/app/printer-status/printer-status.component.html index f2eebe8e2..393c75bf8 100644 --- a/src/app/printer-status/printer-status.component.html +++ b/src/app/printer-status/printer-status.component.html @@ -10,7 +10,7 @@
{{ printer.name }} {{ printer.name }} {{ enclosureTemperature }}°C {{ printer.status }} - + {{ printerStatus.heatbed.current }}°C \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/heat-bed.svg b/src/assets/heat-bed.svg new file mode 100644 index 000000000..1295c1885 --- /dev/null +++ b/src/assets/heat-bed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/hot_bed.svg b/src/assets/hot_bed.svg deleted file mode 100644 index a2c7ead71..000000000 --- a/src/assets/hot_bed.svg +++ /dev/null @@ -1,22 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/invalid-config.svg b/src/assets/invalid-config.svg new file mode 100644 index 000000000..55f761fcd --- /dev/null +++ b/src/assets/invalid-config.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/nozzle.svg b/src/assets/nozzle.svg index 4854eed9f..00fdab800 100644 --- a/src/assets/nozzle.svg +++ b/src/assets/nozzle.svg @@ -1,22 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/styles.scss b/src/styles.scss index 7fee812d3..836c8a46c 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -26,4 +26,4 @@ app-root { background-color: #353b48; padding: .9vh .9vw; overflow: hidden; -} +} \ No newline at end of file From a7786ca2b95085766e69fc2f634ddd05fae26ca5 Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Sat, 13 Jul 2019 23:40:50 +0200 Subject: [PATCH 05/18] Welcome Screen finished --- icons.txt | 1 + src/app/app.component.ts | 2 +- src/app/app.module.ts | 6 +-- src/app/bottom-bar/bottom-bar.component.ts | 4 +- src/app/{ => config}/config.service.ts | 6 +-- .../invalid-config.component.html | 0 .../invalid-config.component.scss | 0 .../invalid-config.component.ts | 0 .../config/no-config/no-config.component.html | 15 ++++++++ .../config/no-config/no-config.component.scss | 38 +++++++++++++++++++ .../no-config/no-config.component.ts | 1 + src/app/display-layer-progress.service.ts | 2 +- src/app/job-status/job-status.component.ts | 2 +- .../{ => job-status}/job-status.service.ts | 2 +- src/app/no-config/no-config.component.html | 1 - src/app/no-config/no-config.component.scss | 0 src/app/no-config/no-config.component.spec.ts | 25 ------------ .../printer-status.component.ts | 2 +- .../printer-status.service.ts | 2 +- src/assets/3d-printer.svg | 3 ++ src/environments/environment.ts | 2 +- 21 files changed, 73 insertions(+), 41 deletions(-) rename src/app/{ => config}/config.service.ts (96%) rename src/app/{ => config}/invalid-config/invalid-config.component.html (100%) rename src/app/{ => config}/invalid-config/invalid-config.component.scss (100%) rename src/app/{ => config}/invalid-config/invalid-config.component.ts (100%) create mode 100644 src/app/config/no-config/no-config.component.html create mode 100644 src/app/config/no-config/no-config.component.scss rename src/app/{ => config}/no-config/no-config.component.ts (95%) rename src/app/{ => job-status}/job-status.service.ts (97%) delete mode 100644 src/app/no-config/no-config.component.html delete mode 100644 src/app/no-config/no-config.component.scss delete mode 100644 src/app/no-config/no-config.component.spec.ts rename src/app/{ => printer-status}/printer-status.service.ts (97%) create mode 100644 src/assets/3d-printer.svg diff --git a/icons.txt b/icons.txt index 2255f2676..061e2184f 100644 --- a/icons.txt +++ b/icons.txt @@ -1 +1,2 @@ "Invalid Code" by Arthur Shlain from thenounproject.com +"3D Printer" by azapron from thenounproject.com \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 99996c842..a0bc0bfca 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,5 +1,5 @@ import { Component } from '@angular/core'; -import { ConfigService } from './config.service'; +import { ConfigService } from './config/config.service'; @Component({ selector: 'app-root', diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 13d7785e7..ed468e4b3 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -8,10 +8,10 @@ import { BottomBarComponent } from './bottom-bar/bottom-bar.component'; import { PrinterStatusComponent } from './printer-status/printer-status.component'; import { JobStatusComponent } from './job-status/job-status.component'; import { AppService } from './app.service'; -import { ConfigService } from './config.service'; +import { ConfigService } from './config/config.service'; import { LayerProgressComponent } from './layer-progress/layer-progress.component'; -import { InvalidConfigComponent } from './invalid-config/invalid-config.component'; -import { NoConfigComponent } from './no-config/no-config.component'; +import { InvalidConfigComponent } from './config/invalid-config/invalid-config.component'; +import { NoConfigComponent } from './config/no-config/no-config.component'; @NgModule({ declarations: [ diff --git a/src/app/bottom-bar/bottom-bar.component.ts b/src/app/bottom-bar/bottom-bar.component.ts index 2f39c4f11..15ee0cd15 100644 --- a/src/app/bottom-bar/bottom-bar.component.ts +++ b/src/app/bottom-bar/bottom-bar.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; -import { ConfigService } from '../config.service'; -import { PrinterStatusService, PrinterStatusAPI } from '../printer-status.service'; +import { ConfigService } from '../config/config.service'; +import { PrinterStatusService, PrinterStatusAPI } from '../printer-status/printer-status.service'; @Component({ selector: 'app-bottom-bar', diff --git a/src/app/config.service.ts b/src/app/config/config.service.ts similarity index 96% rename from src/app/config.service.ts rename to src/app/config/config.service.ts index 9ae87607d..31f81aebf 100644 --- a/src/app/config.service.ts +++ b/src/app/config/config.service.ts @@ -1,6 +1,6 @@ import { Injectable, Input } from '@angular/core'; import { HttpClient } from '@angular/common/http'; -import { environment } from '../environments/environment'; +import { environment } from '../../environments/environment'; import * as Ajv from 'ajv'; declare global { @@ -25,14 +25,14 @@ export class ConfigService { if (window && window.process && window.process.type) { const Store = window.require('electron-store'); this.store = new Store(); - this.store.set('config', { 'type': 'abv' }); + // this.store.set('config', { 'type': 'abv' }); // this.store.delete('config'); this.config = this.store.get('config'); this.valid = this.validate(); } else { console.warn('Detected non-electron environment. Fallback to assets/config.json. Any changes are non-persistent!'); this.http.get(environment.config).subscribe((config: Config) => { - this.config = config + this.config = config; this.valid = this.validate(); }); } diff --git a/src/app/invalid-config/invalid-config.component.html b/src/app/config/invalid-config/invalid-config.component.html similarity index 100% rename from src/app/invalid-config/invalid-config.component.html rename to src/app/config/invalid-config/invalid-config.component.html diff --git a/src/app/invalid-config/invalid-config.component.scss b/src/app/config/invalid-config/invalid-config.component.scss similarity index 100% rename from src/app/invalid-config/invalid-config.component.scss rename to src/app/config/invalid-config/invalid-config.component.scss diff --git a/src/app/invalid-config/invalid-config.component.ts b/src/app/config/invalid-config/invalid-config.component.ts similarity index 100% rename from src/app/invalid-config/invalid-config.component.ts rename to src/app/config/invalid-config/invalid-config.component.ts diff --git a/src/app/config/no-config/no-config.component.html b/src/app/config/no-config/no-config.component.html new file mode 100644 index 000000000..91d84f2b9 --- /dev/null +++ b/src/app/config/no-config/no-config.component.html @@ -0,0 +1,15 @@ +
+
+
Hey there!
+
It looks like this is the first time starting OctoDash!
+ I'll help you setting up your config. If you encounter any issues please create an issue in + GitHub.

+ Thanks for choosing OctoDash :)
+
+ +
+
+
+ Page 2 +
+
\ No newline at end of file diff --git a/src/app/config/no-config/no-config.component.scss b/src/app/config/no-config/no-config.component.scss new file mode 100644 index 000000000..0a467b041 --- /dev/null +++ b/src/app/config/no-config/no-config.component.scss @@ -0,0 +1,38 @@ +.no-config__1-welcome { + display: block; + text-align: center; + font-size: 6vw; + margin-top: 6vh; + margin-bottom: 6vh; +} + +.no-config__1-welcome-text { + display: block; + text-align: center; + margin-left: 2vh; + margin-right: 3vh; + font-size: 3.6vw; +} + +.no-config__1-button_wrapper { + width: 100%; + text-align: center; + height: 32vh; +} + +.no-config__1-button { + background: #44bd32; + padding: 2vw 4vh; + border: none; + border-radius: 2vh; + margin-top: 12vh; + + &:focus { + box-shadow: 0 0 2vw 0 rgba(68, 189, 50, 1); + outline: 0; + } + + &:hover { + box-shadow: 0 0 2vw 0 rgba(68, 189, 50, 1); + } +} diff --git a/src/app/no-config/no-config.component.ts b/src/app/config/no-config/no-config.component.ts similarity index 95% rename from src/app/no-config/no-config.component.ts rename to src/app/config/no-config/no-config.component.ts index a087d7c7d..d85232259 100644 --- a/src/app/no-config/no-config.component.ts +++ b/src/app/config/no-config/no-config.component.ts @@ -6,6 +6,7 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./no-config.component.scss'] }) export class NoConfigComponent implements OnInit { + page = 1; constructor() { } diff --git a/src/app/display-layer-progress.service.ts b/src/app/display-layer-progress.service.ts index 2dc07244a..8d1933a3a 100644 --- a/src/app/display-layer-progress.service.ts +++ b/src/app/display-layer-progress.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { Observable, Observer, timer } from 'rxjs'; import { HttpHeaders, HttpErrorResponse, HttpClient } from '@angular/common/http'; -import { ConfigService } from './config.service'; +import { ConfigService } from './config/config.service'; import { share } from 'rxjs/operators'; @Injectable({ diff --git a/src/app/job-status/job-status.component.ts b/src/app/job-status/job-status.component.ts index 2f5e5d69a..3c8f9b155 100644 --- a/src/app/job-status/job-status.component.ts +++ b/src/app/job-status/job-status.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { JobStatusService, Job } from '../job-status.service'; +import { JobStatusService, Job } from './job-status.service'; @Component({ selector: 'app-job-status', diff --git a/src/app/job-status.service.ts b/src/app/job-status/job-status.service.ts similarity index 97% rename from src/app/job-status.service.ts rename to src/app/job-status/job-status.service.ts index cd728fdff..88ca9f939 100644 --- a/src/app/job-status.service.ts +++ b/src/app/job-status/job-status.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { Observable, Observer, timer } from 'rxjs'; -import { ConfigService } from './config.service'; +import { ConfigService } from '../config/config.service'; import { HttpHeaders, HttpClient, HttpErrorResponse } from '@angular/common/http'; import { share } from 'rxjs/operators'; diff --git a/src/app/no-config/no-config.component.html b/src/app/no-config/no-config.component.html deleted file mode 100644 index 876436e4c..000000000 --- a/src/app/no-config/no-config.component.html +++ /dev/null @@ -1 +0,0 @@ -NO CONFIG \ No newline at end of file diff --git a/src/app/no-config/no-config.component.scss b/src/app/no-config/no-config.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/no-config/no-config.component.spec.ts b/src/app/no-config/no-config.component.spec.ts deleted file mode 100644 index b6701bdb2..000000000 --- a/src/app/no-config/no-config.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { NoConfigComponent } from './no-config.component'; - -describe('NoConfigComponent', () => { - let component: NoConfigComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ NoConfigComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(NoConfigComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/printer-status/printer-status.component.ts b/src/app/printer-status/printer-status.component.ts index 3f7aae242..846163742 100644 --- a/src/app/printer-status/printer-status.component.ts +++ b/src/app/printer-status/printer-status.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { PrinterStatusService, PrinterStatusAPI, PrinterValue } from '../printer-status.service'; +import { PrinterStatusService, PrinterStatusAPI, PrinterValue } from './printer-status.service'; import { DisplayLayerProgressService, DisplayLayerProgressAPI } from '../display-layer-progress.service'; @Component({ diff --git a/src/app/printer-status.service.ts b/src/app/printer-status/printer-status.service.ts similarity index 97% rename from src/app/printer-status.service.ts rename to src/app/printer-status/printer-status.service.ts index 2d2bfbbe9..5780bec5d 100644 --- a/src/app/printer-status.service.ts +++ b/src/app/printer-status/printer-status.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http'; -import { ConfigService } from './config.service'; +import { ConfigService } from '../config/config.service'; import { Observable, Observer, timer } from 'rxjs'; import { share } from 'rxjs/operators'; diff --git a/src/assets/3d-printer.svg b/src/assets/3d-printer.svg new file mode 100644 index 000000000..a1a63bc4a --- /dev/null +++ b/src/assets/3d-printer.svg @@ -0,0 +1,3 @@ + + +p \ No newline at end of file diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 1b79cbb2b..0d7f26260 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -4,7 +4,7 @@ export const environment = { production: false, - config: 'assets/config.testing.json' + config: 'assets/config.testings.json' }; /* From 1da58144dd59ad6db52011599eb702d6e04886b1 Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Sun, 14 Jul 2019 01:17:29 +0200 Subject: [PATCH 06/18] Design second screen finished --- icons.txt | 3 +- .../config/no-config/no-config.component.html | 49 +++++- .../config/no-config/no-config.component.scss | 113 +++++++++++- .../config/no-config/no-config.component.ts | 16 ++ src/assets/3d-printer.svg | 3 - src/assets/back.svg | 4 + src/assets/next.svg | 4 + src/assets/reset.css | 161 ++++++++++++++---- 8 files changed, 299 insertions(+), 54 deletions(-) delete mode 100644 src/assets/3d-printer.svg create mode 100644 src/assets/back.svg create mode 100644 src/assets/next.svg diff --git a/icons.txt b/icons.txt index 061e2184f..cd1542de8 100644 --- a/icons.txt +++ b/icons.txt @@ -1,2 +1,3 @@ "Invalid Code" by Arthur Shlain from thenounproject.com -"3D Printer" by azapron from thenounproject.com \ No newline at end of file +"back" by Dwiky Setiawan from thenounproject.com +"next" by Dwiky Setiawan from thenounproject.com \ No newline at end of file diff --git a/src/app/config/no-config/no-config.component.html b/src/app/config/no-config/no-config.component.html index 91d84f2b9..eac773d62 100644 --- a/src/app/config/no-config/no-config.component.html +++ b/src/app/config/no-config/no-config.component.html @@ -1,15 +1,46 @@
-
-
Hey there!
-
It looks like this is the first time starting OctoDash!
+ + + + + + + + +
+ back + +
+
+
+
+ next +
+
+ Hey there! + + It looks like this is the first time starting OctoDash!
I'll help you setting up your config. If you encounter any issues please create an issue in GitHub.

- Thanks for choosing OctoDash :)
-
- -
+ Thanks for choosing OctoDash :) +
-
- Page 2 +
+ + First, tell me some facts about your printer and filament so I can personalize OctoDash. + +
+ + + + Filament + + + mm + + + + g/cm³ +
\ No newline at end of file diff --git a/src/app/config/no-config/no-config.component.scss b/src/app/config/no-config/no-config.component.scss index 0a467b041..2a47ba76c 100644 --- a/src/app/config/no-config/no-config.component.scss +++ b/src/app/config/no-config/no-config.component.scss @@ -1,12 +1,34 @@ -.no-config__1-welcome { - display: block; - text-align: center; - font-size: 6vw; - margin-top: 6vh; - margin-bottom: 6vh; +.no-config__progress { + width: 100%; + + & td { + width: 33.3%; + } +} + +.no-config__back { + padding: 4vh 2vw; +} + +.no-config__next { + padding: 4vh 2vw; + text-align: right; +} + +.no-config__back-icon { + width: 6vw; + vertical-align: -5vh; + margin-right: 1.4vw; } -.no-config__1-welcome-text { +.no-config__next-icon { + width: 6vw; + vertical-align: -5vh; + margin-left: 1.4vw; + margin-right: 1vw; +} + +.no-config__text { display: block; text-align: center; margin-left: 2vh; @@ -14,6 +36,73 @@ font-size: 3.6vw; } +.no-config__progress-td { + text-align: center; +} + +.no-config__progress-bar-wrapper { + background-color: #718093; + height: 4vh; + width: 20vw; + display: inline-block; + border-radius: 2vh; +} + +.no-config__progress-bar { + height: 4vh; + border-radius: 2vh; + background-color: #44bd32; + width: 0vw; +} + +.no-config__input { + background: transparent; + margin-top: 9vh; + padding: 1.5vw 3vh; + border: 2px solid #dcdde1; + border-radius: 2.5vw; + width: 55vw; + + &:focus { + outline: 0; + border: 2px solid #44bd32; + } +} + +.no-config__input-small { + width: 10vw; + text-align: right; + + &-suffix { + font-size: 3vw; + padding-left: 1vw; + } +} + +.no-config__input-label { + padding-right: 3vw; + + &-small { + padding-right: 2vw; + } +} + +.no-config__form { + display: block; + width: 100%; + text-align: center; +} + + +.no-config__1-welcome { + display: block; + text-align: center; + font-size: 6vw; + margin-top: 6vh; + margin-bottom: 6vh; + font-weight: 600; +} + .no-config__1-button_wrapper { width: 100%; text-align: center; @@ -36,3 +125,13 @@ box-shadow: 0 0 2vw 0 rgba(68, 189, 50, 1); } } + + +.no-config__2-filament-divider { + display: block; + text-align: left; + margin-left: 4.3vw; + margin-top: 7vh; + margin-bottom: -7vh; + font-weight: 600; +} diff --git a/src/app/config/no-config/no-config.component.ts b/src/app/config/no-config/no-config.component.ts index d85232259..43ba3c10c 100644 --- a/src/app/config/no-config/no-config.component.ts +++ b/src/app/config/no-config/no-config.component.ts @@ -7,10 +7,26 @@ import { Component, OnInit } from '@angular/core'; }) export class NoConfigComponent implements OnInit { page = 1; + totalPages = 3; constructor() { } ngOnInit() { + this.changeProgress() + } + + increasePage() { + this.page += 1; + this.changeProgress() + } + + decreasePage() { + this.page -= 1; + this.changeProgress() + } + + changeProgress() { + document.getElementById('progressBar').style.width = this.page * (20 / this.totalPages) + 'vw'; } } diff --git a/src/assets/3d-printer.svg b/src/assets/3d-printer.svg deleted file mode 100644 index a1a63bc4a..000000000 --- a/src/assets/3d-printer.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -p \ No newline at end of file diff --git a/src/assets/back.svg b/src/assets/back.svg new file mode 100644 index 000000000..fc489e949 --- /dev/null +++ b/src/assets/back.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/next.svg b/src/assets/next.svg new file mode 100644 index 000000000..9692a9fcc --- /dev/null +++ b/src/assets/next.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/reset.css b/src/assets/reset.css index df2998d1f..bd419a945 100644 --- a/src/assets/reset.css +++ b/src/assets/reset.css @@ -3,46 +3,139 @@ License: none (public domain) */ -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; } + /* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; } + body { - line-height: 1.2; + line-height: 1.2; } -ol, ul { - list-style: none; + +ol, +ul { + list-style: none; } -blockquote, q { - quotes: none; + +blockquote, +q { + quotes: none; } -blockquote:before, blockquote:after, -q:before, q:after { - content: ''; - content: none; + +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ''; + content: none; } + table { - border-collapse: collapse; - border-spacing: 0; -} \ No newline at end of file + border-collapse: collapse; + border-spacing: 0; +} + +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} From 8f3b4ab989953ce58262c58489a08e00d3cec1c5 Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Sun, 14 Jul 2019 01:28:18 +0200 Subject: [PATCH 07/18] Strapped Angular Model to the form --- src/app/app.module.ts | 4 +++- src/app/config/no-config/no-config.component.html | 9 ++++++--- src/app/config/no-config/no-config.component.scss | 2 +- src/app/config/no-config/no-config.component.ts | 4 ++++ src/index.html | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index ed468e4b3..299486ccb 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -2,6 +2,7 @@ import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { HttpClientModule } from '@angular/common/http'; import { RoundProgressModule, ROUND_PROGRESS_DEFAULTS } from 'angular-svg-round-progressbar'; +import { FormsModule } from '@angular/forms'; import { AppComponent } from './app.component'; import { BottomBarComponent } from './bottom-bar/bottom-bar.component'; @@ -26,7 +27,8 @@ import { NoConfigComponent } from './config/no-config/no-config.component'; imports: [ BrowserModule, HttpClientModule, - RoundProgressModule + RoundProgressModule, + FormsModule ], providers: [AppService, ConfigService], bootstrap: [AppComponent] diff --git a/src/app/config/no-config/no-config.component.html b/src/app/config/no-config/no-config.component.html index eac773d62..161fae16c 100644 --- a/src/app/config/no-config/no-config.component.html +++ b/src/app/config/no-config/no-config.component.html @@ -31,15 +31,18 @@
- + Filament - + mm - + g/cm³
diff --git a/src/app/config/no-config/no-config.component.scss b/src/app/config/no-config/no-config.component.scss index 2a47ba76c..a2960606d 100644 --- a/src/app/config/no-config/no-config.component.scss +++ b/src/app/config/no-config/no-config.component.scss @@ -98,7 +98,7 @@ display: block; text-align: center; font-size: 6vw; - margin-top: 6vh; + margin-top: 2vh; margin-bottom: 6vh; font-weight: 600; } diff --git a/src/app/config/no-config/no-config.component.ts b/src/app/config/no-config/no-config.component.ts index 43ba3c10c..4a45cf994 100644 --- a/src/app/config/no-config/no-config.component.ts +++ b/src/app/config/no-config/no-config.component.ts @@ -9,6 +9,10 @@ export class NoConfigComponent implements OnInit { page = 1; totalPages = 3; + printerName = ''; + filamentDiameter = 1.75; + filamentDensity = 1.25; + constructor() { } ngOnInit() { diff --git a/src/index.html b/src/index.html index 0c46f8b3c..6408b14aa 100644 --- a/src/index.html +++ b/src/index.html @@ -12,7 +12,7 @@ - + initializing ... From 5ceed5b894db748e24e33c2487bd49643df1a2b9 Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Sun, 14 Jul 2019 14:40:07 +0200 Subject: [PATCH 08/18] Add 2nd and 3rd screen. --- icons.txt | 3 +- .../config/no-config/no-config.component.html | 34 +++++++++++++++++++ .../config/no-config/no-config.component.scss | 32 +++++++++++++++++ .../config/no-config/no-config.component.ts | 13 ++++--- src/assets/checkmark.svg | 1 + 5 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 src/assets/checkmark.svg diff --git a/icons.txt b/icons.txt index cd1542de8..846bcadca 100644 --- a/icons.txt +++ b/icons.txt @@ -1,3 +1,4 @@ "Invalid Code" by Arthur Shlain from thenounproject.com "back" by Dwiky Setiawan from thenounproject.com -"next" by Dwiky Setiawan from thenounproject.com \ No newline at end of file +"next" by Dwiky Setiawan from thenounproject.com +"checkmark" by Muhammad Faizal Rahman Hakim from thenounproject.com \ No newline at end of file diff --git a/src/app/config/no-config/no-config.component.html b/src/app/config/no-config/no-config.component.html index 161fae16c..66b9ca56e 100644 --- a/src/app/config/no-config/no-config.component.html +++ b/src/app/config/no-config/no-config.component.html @@ -46,4 +46,38 @@ g/cm³
+
+ + Now I need to know something about your OctoPrint setup, so I can talk to your printer. + +
+ + + + + +
+
+
+ + And finally some information on how OctoDash should be setup. + +
+
+ + + Touchscreen +
+
+
+
+ + Great! I'll check everything. + + + Config is valid + +
\ No newline at end of file diff --git a/src/app/config/no-config/no-config.component.scss b/src/app/config/no-config/no-config.component.scss index a2960606d..109625e88 100644 --- a/src/app/config/no-config/no-config.component.scss +++ b/src/app/config/no-config/no-config.component.scss @@ -53,6 +53,7 @@ border-radius: 2vh; background-color: #44bd32; width: 0vw; + transition: width .7s ease-in-out; } .no-config__input { @@ -87,6 +88,37 @@ } } +.no-config__checkbox-container { + display: inline-block; + position: relative; + user-select: none; + padding-left: 6vw; + height: 4.5vw; + margin-top: 8vh; + cursor: pointer; +} + +.no-config__checkmark { + position: absolute; + top: 0; + left: 0; + height: 4vw; + width: 4vw; + background-color: transparent; + border: 2px solid #dcdde1; + border-radius: 1vw; +} + +.no-config__checkbox-checked { + background-color: #2196F3; + width: 2.4vw; + height: 2.4vw; + display: block; + margin-left: .8vw; + margin-top: .8vw; + border-radius: .7vw; +} + .no-config__form { display: block; width: 100%; diff --git a/src/app/config/no-config/no-config.component.ts b/src/app/config/no-config/no-config.component.ts index 4a45cf994..6d3358a53 100644 --- a/src/app/config/no-config/no-config.component.ts +++ b/src/app/config/no-config/no-config.component.ts @@ -6,27 +6,30 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./no-config.component.scss'] }) export class NoConfigComponent implements OnInit { - page = 1; - totalPages = 3; + page = 4; + totalPages = 4; printerName = ''; filamentDiameter = 1.75; filamentDensity = 1.25; + octoprintURL = 'http://localhost:5000'; + accessToken = ''; + touchscreen = true; constructor() { } ngOnInit() { - this.changeProgress() + this.changeProgress(); } increasePage() { this.page += 1; - this.changeProgress() + this.changeProgress(); } decreasePage() { this.page -= 1; - this.changeProgress() + this.changeProgress(); } changeProgress() { diff --git a/src/assets/checkmark.svg b/src/assets/checkmark.svg new file mode 100644 index 000000000..6435dd91e --- /dev/null +++ b/src/assets/checkmark.svg @@ -0,0 +1 @@ + \ No newline at end of file From 8d78c4a0e2f0ae6c340bc95ca5483a4a92671c5e Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Sun, 14 Jul 2019 23:08:22 +0200 Subject: [PATCH 09/18] Finish testing Octoprint connection + saving config --- icons.txt | 3 +- main.js | 2 + src/app/config/config.service.ts | 36 +++++++++- .../invalid-config.component.scss | 3 +- .../invalid-config.component.ts | 2 +- .../config/no-config/no-config.component.html | 29 ++++++-- .../config/no-config/no-config.component.scss | 24 +++++++ .../config/no-config/no-config.component.ts | 69 ++++++++++++++++++- src/assets/checkmark.svg | 2 +- src/assets/config.json | 3 +- src/assets/error.svg | 1 + src/index.html | 18 ++--- 12 files changed, 170 insertions(+), 22 deletions(-) create mode 100644 src/assets/error.svg diff --git a/icons.txt b/icons.txt index 846bcadca..2bf7442b6 100644 --- a/icons.txt +++ b/icons.txt @@ -1,4 +1,5 @@ "Invalid Code" by Arthur Shlain from thenounproject.com "back" by Dwiky Setiawan from thenounproject.com "next" by Dwiky Setiawan from thenounproject.com -"checkmark" by Muhammad Faizal Rahman Hakim from thenounproject.com \ No newline at end of file +"checkmark" by Muhammad Faizal Rahman Hakim from thenounproject.com +"delete" by Muhammad Faizal Rahman Hakim from thenounproject.com \ No newline at end of file diff --git a/main.js b/main.js index 3b402dbd3..9c8f08ad8 100644 --- a/main.js +++ b/main.js @@ -12,6 +12,8 @@ const big = args.some(val => val === '--big-screen') let window; +//FIXME automatic width and height in prod use + function createWindow() { if (!big) { window = new BrowserWindow({ diff --git a/src/app/config/config.service.ts b/src/app/config/config.service.ts index 31f81aebf..1f124e731 100644 --- a/src/app/config/config.service.ts +++ b/src/app/config/config.service.ts @@ -42,8 +42,11 @@ export class ConfigService { return this.validator(this.config) ? true : false; } - public getJSONError(): string[] { - console.log(this.validator.errors); + public validateGiven(config: Config): boolean { + return this.validator(config) ? true : false; + } + + public getErrors(): string[] { const errors = []; this.validator.errors.forEach(error => { if (error.keyword === 'type') { @@ -54,12 +57,41 @@ export class ConfigService { }); return errors; } + + public saveConfig(config?: Config): string { + if (!config) { + config = this.config; + } + if (window && window.process && window.process.type) { + this.store.set('config', config); + const configStored = this.store.get('config'); + if (this.validateGiven(configStored)) { + if (configStored === config) { + return null; + } else { + return ('Error while saving config!'); + } + } else { + return ('Saved config is invalid!'); + } + } else { + return ('Browser version doesn\'t support saving!'); + } + } + + public updateConfig() { + if (window && window.process && window.process.type) { + this.config = this.store.get('config'); + this.valid = this.validate(); + } + } } export interface Config { octoprint: Octoprint; printer: Printer; filament: Filament; + touchscreen: boolean; } interface Octoprint { diff --git a/src/app/config/invalid-config/invalid-config.component.scss b/src/app/config/invalid-config/invalid-config.component.scss index 19380d1c9..68151dce5 100644 --- a/src/app/config/invalid-config/invalid-config.component.scss +++ b/src/app/config/invalid-config/invalid-config.component.scss @@ -20,9 +20,10 @@ .invalid-config__error-list { margin-left: 2vw; - font-size: 3.5vw; + font-size: 3.6vw; margin-top: 5vh; list-style-type: disc; + font-family: 'Cousine', monospace; & li { margin-top: 2vh; diff --git a/src/app/config/invalid-config/invalid-config.component.ts b/src/app/config/invalid-config/invalid-config.component.ts index c78c989ef..cb279b0ef 100644 --- a/src/app/config/invalid-config/invalid-config.component.ts +++ b/src/app/config/invalid-config/invalid-config.component.ts @@ -14,7 +14,7 @@ export class InvalidConfigComponent implements OnInit { } ngOnInit() { - this.errors = this.configService.getJSONError(); + this.errors = this.configService.getErrors(); } } diff --git a/src/app/config/no-config/no-config.component.html b/src/app/config/no-config/no-config.component.html index 66b9ca56e..21a67d643 100644 --- a/src/app/config/no-config/no-config.component.html +++ b/src/app/config/no-config/no-config.component.html @@ -76,8 +76,29 @@ Great! I'll check everything. - - Config is valid - +
+ + + + Config Validation + + {{ error }} +
+ + + + Octoprint Connection + + {{ octoprintConnectionError }} +
+
+ + + + Saving Config + + {{ configSaved }} +
+
- \ No newline at end of file + diff --git a/src/app/config/no-config/no-config.component.scss b/src/app/config/no-config/no-config.component.scss index 109625e88..28d697430 100644 --- a/src/app/config/no-config/no-config.component.scss +++ b/src/app/config/no-config/no-config.component.scss @@ -167,3 +167,27 @@ margin-bottom: -7vh; font-weight: 600; } + +.no-config__4-check-wrapper { + width: 100%; + text-align: center; + padding-top: 10vh; +} + +.no-config__4-check { + display: block; + margin-bottom: 5vh; +} + +.no-config__4-check-icon { + width: 5vw; + vertical-align: -2.2vw; + margin-right: 2vw; +} + +.no-config__4-errors { + font-size: 3.6vw; + font-family: 'Cousine', monospace; + display: block; + margin-bottom: 4vh; +} diff --git a/src/app/config/no-config/no-config.component.ts b/src/app/config/no-config/no-config.component.ts index 6d3358a53..e34526018 100644 --- a/src/app/config/no-config/no-config.component.ts +++ b/src/app/config/no-config/no-config.component.ts @@ -1,4 +1,6 @@ import { Component, OnInit } from '@angular/core'; +import { Config, ConfigService } from '../config.service'; +import { HttpHeaders, HttpClient, HttpErrorResponse } from '@angular/common/http'; @Component({ selector: 'app-no-config', @@ -6,7 +8,7 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./no-config.component.scss'] }) export class NoConfigComponent implements OnInit { - page = 4; + page = 3; totalPages = 4; printerName = ''; @@ -16,14 +18,77 @@ export class NoConfigComponent implements OnInit { accessToken = ''; touchscreen = true; - constructor() { } + config: Config; + configErrors: string[]; + configValid: boolean; + configSaved: string; + octoprintConnection: boolean; + octoprintConnectionError: string; + + constructor(private configService: ConfigService, private http: HttpClient) { } ngOnInit() { this.changeProgress(); } + testOctoprintAPI() { + const httpHeaders = { + headers: new HttpHeaders({ + 'x-api-key': this.config.octoprint.accessToken + }) + }; + this.http.get(this.config.octoprint.url + 'version', httpHeaders).subscribe( + (data: JSON) => { + this.octoprintConnection = true; + this.saveConfig(); + }, + (error: HttpErrorResponse) => { + this.octoprintConnection = false; + this.octoprintConnectionError = error.message; + } + ); + return true; + } + + createConfig() { + this.config = { + octoprint: { + url: this.octoprintURL + '/api/', + accessToken: this.accessToken, + apiInterval: 1500 + }, + printer: { + name: this.printerName + }, + filament: { + density: this.filamentDensity, + thickness: this.filamentDiameter + }, + touchscreen: this.touchscreen + }; + this.validateConfig(); + return true; + } + + validateConfig() { + this.configValid = this.configService.validateGiven(this.config); + if (!this.configValid) { + this.configErrors = this.configService.getErrors(); + } else { + this.testOctoprintAPI(); + } + } + + saveConfig() { + this.configSaved = this.configService.saveConfig(this.config); + console.log(this.configSaved) + } + increasePage() { this.page += 1; + if (this.page === 4) { + this.createConfig(); + } this.changeProgress(); } diff --git a/src/assets/checkmark.svg b/src/assets/checkmark.svg index 6435dd91e..40e852e43 100644 --- a/src/assets/checkmark.svg +++ b/src/assets/checkmark.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/assets/config.json b/src/assets/config.json index 46e60fae6..d4bce8a2b 100644 --- a/src/assets/config.json +++ b/src/assets/config.json @@ -10,5 +10,6 @@ "filament": { "thickness": 0, "density": 0 - } + }, + "touchscreen": true } diff --git a/src/assets/error.svg b/src/assets/error.svg new file mode 100644 index 000000000..fc7dca7ba --- /dev/null +++ b/src/assets/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/index.html b/src/index.html index 6408b14aa..7597c86b5 100644 --- a/src/index.html +++ b/src/index.html @@ -2,18 +2,18 @@ - - OctoPrintDash - + + OctoPrintDash + - - - - + + + + - initializing ... + initializing ... - \ No newline at end of file + From b7b34e2dbdf2fe2f795b114ef3ebc396cb921611 Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Sun, 14 Jul 2019 23:34:02 +0200 Subject: [PATCH 10/18] Finish Setup Wizard --- src/app/config/config.service.ts | 8 +------- .../config/no-config/no-config.component.html | 7 +++++-- .../config/no-config/no-config.component.scss | 19 +++++++++---------- .../config/no-config/no-config.component.ts | 9 +++++++-- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/app/config/config.service.ts b/src/app/config/config.service.ts index 1f124e731..f6b441a9b 100644 --- a/src/app/config/config.service.ts +++ b/src/app/config/config.service.ts @@ -25,8 +25,6 @@ export class ConfigService { if (window && window.process && window.process.type) { const Store = window.require('electron-store'); this.store = new Store(); - // this.store.set('config', { 'type': 'abv' }); - // this.store.delete('config'); this.config = this.store.get('config'); this.valid = this.validate(); } else { @@ -66,11 +64,7 @@ export class ConfigService { this.store.set('config', config); const configStored = this.store.get('config'); if (this.validateGiven(configStored)) { - if (configStored === config) { - return null; - } else { - return ('Error while saving config!'); - } + return null; } else { return ('Saved config is invalid!'); } diff --git a/src/app/config/no-config/no-config.component.html b/src/app/config/no-config/no-config.component.html index 21a67d643..96c1bf567 100644 --- a/src/app/config/no-config/no-config.component.html +++ b/src/app/config/no-config/no-config.component.html @@ -79,14 +79,14 @@
- + Config Validation {{ error }}
- + Octoprint Connection {{ octoprintConnectionError }} @@ -99,6 +99,9 @@ {{ configSaved }}
+ done +
diff --git a/src/app/config/no-config/no-config.component.scss b/src/app/config/no-config/no-config.component.scss index 28d697430..8ef99c582 100644 --- a/src/app/config/no-config/no-config.component.scss +++ b/src/app/config/no-config/no-config.component.scss @@ -147,15 +147,6 @@ border: none; border-radius: 2vh; margin-top: 12vh; - - &:focus { - box-shadow: 0 0 2vw 0 rgba(68, 189, 50, 1); - outline: 0; - } - - &:hover { - box-shadow: 0 0 2vw 0 rgba(68, 189, 50, 1); - } } @@ -171,7 +162,7 @@ .no-config__4-check-wrapper { width: 100%; text-align: center; - padding-top: 10vh; + padding-top: 8vh; } .no-config__4-check { @@ -191,3 +182,11 @@ display: block; margin-bottom: 4vh; } + +.no-config__4-finish { + background-color: #44bd32; + display: inline-block; + padding: 1.4vh 2vw; + border-radius: 1vw; + box-shadow: 0 10px 19px -8px rgba(0, 0, 0, 0.75); +} diff --git a/src/app/config/no-config/no-config.component.ts b/src/app/config/no-config/no-config.component.ts index e34526018..75983611f 100644 --- a/src/app/config/no-config/no-config.component.ts +++ b/src/app/config/no-config/no-config.component.ts @@ -8,7 +8,7 @@ import { HttpHeaders, HttpClient, HttpErrorResponse } from '@angular/common/http styleUrls: ['./no-config.component.scss'] }) export class NoConfigComponent implements OnInit { - page = 3; + page = 0; totalPages = 4; printerName = ''; @@ -51,6 +51,8 @@ export class NoConfigComponent implements OnInit { } createConfig() { + this.configErrors = []; + this.octoprintConnectionError = null; this.config = { octoprint: { url: this.octoprintURL + '/api/', @@ -81,7 +83,10 @@ export class NoConfigComponent implements OnInit { saveConfig() { this.configSaved = this.configService.saveConfig(this.config); - console.log(this.configSaved) + } + + finishWizard() { + this.configService.updateConfig(); } increasePage() { From 4b6c207c020862284d91156a6be59b8a231fd137 Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Sun, 14 Jul 2019 23:53:23 +0200 Subject: [PATCH 11/18] Adjust Electron App --- main.js | 34 +++++++------------ src/app/config/config.service.ts | 2 +- .../invalid-config.component.html | 2 +- 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/main.js b/main.js index 9c8f08ad8..7254464a1 100644 --- a/main.js +++ b/main.js @@ -15,27 +15,19 @@ let window; //FIXME automatic width and height in prod use function createWindow() { - if (!big) { - window = new BrowserWindow({ - width: dev ? 1000 : 1000, - height: dev ? 342 : 320, - frame: dev ? true : false, - fullscreen: dev ? false : true, - webPreferences: { - nodeIntegration: true - } - }) - } else { - window = new BrowserWindow({ - width: dev ? 1400 : 800, - height: dev ? 502 : 480, - frame: dev ? true : false, - fullscreen: dev ? false : true, - webPreferences: { - nodeIntegration: true - } - }) - } + const { + screen + } = require('electron') + const mainScreen = screen.getPrimaryDisplay(); + window = new BrowserWindow({ + width: dev ? big ? 1000 : 1400 : mainScreen.size.width, + height: dev ? big ? 342 : 502 : mainScreen.size.height, + frame: dev ? true : false, + fullscreen: dev ? false : true, + webPreferences: { + nodeIntegration: true + } + }) if (dev) { require('electron-reload')(__dirname, { diff --git a/src/app/config/config.service.ts b/src/app/config/config.service.ts index f6b441a9b..a23184518 100644 --- a/src/app/config/config.service.ts +++ b/src/app/config/config.service.ts @@ -1,7 +1,7 @@ import { Injectable, Input } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { environment } from '../../environments/environment'; -import * as Ajv from 'ajv'; +import Ajv from 'ajv'; declare global { interface Window { diff --git a/src/app/config/invalid-config/invalid-config.component.html b/src/app/config/invalid-config/invalid-config.component.html index 7edce2887..69c27e7b8 100644 --- a/src/app/config/invalid-config/invalid-config.component.html +++ b/src/app/config/invalid-config/invalid-config.component.html @@ -5,4 +5,4 @@
  • {{ error }}
- \ No newline at end of file + From 9c605ebe444d961eac5e291e6027be19932186d7 Mon Sep 17 00:00:00 2001 From: TimonGaebelein Date: Mon, 15 Jul 2019 00:12:01 +0200 Subject: [PATCH 12/18] Adjust README.md --- README.md | 56 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 53f655102..7ef134635 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,61 @@ -# OctoprintDash +# OctoDash -OctoprintDash is a small, but beautiful monitoring UI for Octoprint. It doesn't support touchscreen input (yet). +OctoDash is a small, but beautiful dashboard for Octoprint. -## Screenshots +## Installation -![job_running](https://raw.githubusercontent.com/TimonGaebelein/OctoprintDash/master/screenshots/job.png) -Job Running +### Electron (recommended) -![no_job_running](https://raw.githubusercontent.com/TimonGaebelein/OctoprintDash/master/screenshots/no_job.png) -No Job Running +- Download the latest release, start the app and OctoDash will help you setup a config. -## Installation +If you want to start Electron automatically have a look at the wiki (not done yet) + + +### Website -### Building the App +This option does not allow you to change your config via the UI and the styling may be a little off for you, due to your browser engine. It may improve performance slightly if you use a very lightweight browser. - Clone the repository - `git clone https://github.com/TimonGaebelein/OctoprintDash && cd OctoprintDash` - Install all the dependencies - `npm install` - Adjust `src/assets/config.json` accordingly to your installation - Build the app - `ng build --prod` +- The final website is located at `/dist`, which can be served by any webserver and viewed by any webbrowser, that does support angular. A chromium based webbrowser is recommended + + + +## Screenshots + + -### Using the App + -After the step before, you will have a simple http website located at `dist`. You can serve the website via any webserver, or, if you don't have a server installed, use the supplied node server, located at `server`. If you'd like to use the node server the steps are the following. +Job Running +No Job Running -- Move the website - `mv dist/OctoprintDash/* server/web/` -- Copy the server folder over to the raspberry -- Install npm dependencies for server on the raspberry - `cd server && npm install` -- Open chromium in kiosk mode - `chromium-browser --kiosk --app=http://localhost:8080` +## Troubleshooting + +If you encounter an issue, while using OctoDash please have a look at the wiki Troubleshooting Guide first (not done yet)! If your issue is not covered please open an issue! ## Bugs and more If you find a bug, please open an issue, so I can have a look at it. Please also add the steps to reproduce and the .gcode file. Thank you! One more thing: If you're Octoprint is running on a Raspberry Pi 1 you may want to opt out of this, because it just does not have enough power. + +## Contributing + +If you can think of something nice to add or want to change some of the messy code feel free to create a Pull Request. I'll haev a look at it and will merge it into master if everything checks out! +Any help is greatly appreciated! + +If you can think of a great feature, but don't feel yet ready to code something open an issue. I'll have a look at it and maybe implement it, if I have the time. It is preferred if you directly create a Pull Request for your new feature. If you need some help, I can point you in the correct direction. + +## License + +The project is licensed under the Apache 2.0 License. + +The Credits for the icons can be (temporarily) found at icons.txt. They'll get moved into the product soon. + + +## Special Thanks + +Special Thanks to [/u/Slateclean](https://www.reddit.com/user/Slateclean) for supplying me with touchscreens so I can further develop the project. Without you this wouldn't be happening! \ No newline at end of file From 52d7c3d2e5f849e53877c5ae0eebfd9893407a20 Mon Sep 17 00:00:00 2001 From: Timon G Date: Mon, 15 Jul 2019 00:31:15 +0200 Subject: [PATCH 13/18] Fix Alignment --- README.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7ef134635..30aa64cba 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # OctoDash -OctoDash is a small, but beautiful dashboard for Octoprint. +OctoDash is a simple, but beautiful dashboard for Octoprint. ## Installation @@ -24,13 +24,10 @@ This option does not allow you to change your config via the UI and the styling ## Screenshots - - - - - -Job Running -No Job Running +

+ + +

## Troubleshooting @@ -58,4 +55,4 @@ The Credits for the icons can be (temporarily) found at icons.txt. They'll get m ## Special Thanks -Special Thanks to [/u/Slateclean](https://www.reddit.com/user/Slateclean) for supplying me with touchscreens so I can further develop the project. Without you this wouldn't be happening! \ No newline at end of file +Special Thanks to [/u/Slateclean](https://www.reddit.com/user/Slateclean) for supplying me with touchscreens so I can further develop the project. Without you this wouldn't be happening! From bd4c818d8c807228023faebb0e026a0d138b5454 Mon Sep 17 00:00:00 2001 From: UnchartedBull Date: Mon, 15 Jul 2019 14:13:33 +0200 Subject: [PATCH 14/18] Electron app building on MacOS --- .gitignore | 1 + config.js | 0 main.js | 7 +- package-lock.json | 1100 ++++++++++++++++++++++++++++++- package.json | 50 +- src/environments/environment.ts | 2 +- 6 files changed, 1149 insertions(+), 11 deletions(-) delete mode 100644 config.js diff --git a/.gitignore b/.gitignore index 48b43f568..86fc044a3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ # compiled output /dist +/package /tmp /out-tsc # Only exists if Bazel was run diff --git a/config.js b/config.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/main.js b/main.js index 7254464a1..6e7f721e8 100644 --- a/main.js +++ b/main.js @@ -9,11 +9,8 @@ const args = process.argv.slice(1); const dev = args.some(val => val === '--serve'); const big = args.some(val => val === '--big-screen') - let window; -//FIXME automatic width and height in prod use - function createWindow() { const { screen @@ -42,15 +39,13 @@ function createWindow() { })); } - // if (dev) window.webContents.openDevTools(); - window.webContents.openDevTools(); + if (dev) window.webContents.openDevTools(); window.on('closed', () => { window = null; }); } - app.on('ready', createWindow) app.on("window-all-closed", () => { diff --git a/package-lock.json b/package-lock.json index 92d20a938..edfad68b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,15 @@ { - "name": "octo-print-dash", + "name": "octodash", "version": "0.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "7zip-bin": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-4.1.0.tgz", + "integrity": "sha512-AsnBZN3a8/JcNt+KPkGGODaA4c7l3W5+WpeKgGSbstSLxqWtTXqd1ieJGBQ8IFCtRg8DmmKUcSkIkUc0A4p3YA==", + "dev": true + }, "@angular-devkit/architect": { "version": "0.800.6", "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.800.6.tgz", @@ -565,6 +571,21 @@ "semver-intersect": "1.4.0" } }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, "@types/ajv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/ajv/-/ajv-1.0.0.tgz", @@ -574,6 +595,12 @@ "ajv": "*" } }, + "@types/debug": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.4.tgz", + "integrity": "sha512-D9MyoQFI7iP5VdpEyPZyjjqIJ8Y8EDNQFIFVLOmeg1rI1xiHOChyUPMPRUVfqFCerxfE+yS3vMyj37F6IdtOoQ==", + "dev": true + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -906,6 +933,43 @@ "resolved": "https://registry.npmjs.org/angular-svg-round-progressbar/-/angular-svg-round-progressbar-3.0.1.tgz", "integrity": "sha512-sH9dW/VoPb4sWwPQyuj+N4HmLxn1okUPJmB1UG979vDS9zzMGpSc6Cg8W/ixWmws5J3KMBH1XTWa6Aj7h4hhng==" }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", @@ -960,6 +1024,65 @@ } } }, + "app-builder-bin": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.3.0.tgz", + "integrity": "sha512-FuWyffqFDfh2xFWeNae9A1RSXYo0i95EjxUA01LnhrQ2LHs71etIOiYo9wieOGRJBY5Y+evAqhaq85m7dmW+8w==", + "dev": true + }, + "app-builder-lib": { + "version": "21.0.15", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-21.0.15.tgz", + "integrity": "sha512-WJ6xEm0G30vzEGRPmSpB4sOH5oeWDZO8GzZ6oDViiPvwTkTKbqzxkUw9NZx+9kr5JYTXcSZmB7TbIi6g1NDTEQ==", + "dev": true, + "requires": { + "7zip-bin": "~4.1.0", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "21.0.15", + "builder-util-runtime": "8.3.0", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.1.1", + "ejs": "^2.6.2", + "electron-osx-sign": "0.4.11", + "electron-publish": "21.0.15", + "fs-extra": "^8.1.0", + "hosted-git-info": "^2.7.1", + "is-ci": "^2.0.0", + "isbinaryfile": "^4.0.1", + "js-yaml": "^3.13.1", + "lazy-val": "^1.0.4", + "minimatch": "^3.0.4", + "normalize-package-data": "^2.5.0", + "read-config-file": "4.0.1", + "sanitize-filename": "^1.6.1", + "semver": "^6.2.0", + "temp-file": "^3.3.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "dev": true + } + } + }, "app-root-path": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", @@ -1152,6 +1275,12 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, + "async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1437,6 +1566,15 @@ "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", "dev": true }, + "bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5" + } + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -1489,6 +1627,56 @@ "multicast-dns-service-types": "^1.1.0" } }, + "boxen": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", + "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^2.4.2", + "cli-boxes": "^2.2.0", + "string-width": "^3.0.0", + "term-size": "^1.2.0", + "type-fest": "^0.3.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1627,6 +1815,28 @@ "isarray": "^1.0.0" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1645,6 +1855,77 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "builder-util": { + "version": "21.0.15", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-21.0.15.tgz", + "integrity": "sha512-Gto22jES/t9752CuH7O23VvRvZs2R2Gt6o74vzY5ywBb3v/+cuHk52Arf6T4xM0aprsdKe7vjgbZjCNei6HgDA==", + "dev": true, + "requires": { + "7zip-bin": "~4.1.0", + "@types/debug": "^4.1.4", + "app-builder-bin": "3.3.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "8.3.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "fs-extra": "^8.1.0", + "is-ci": "^2.0.0", + "js-yaml": "^3.13.1", + "source-map-support": "^0.5.12", + "stat-mode": "^0.3.0", + "temp-file": "^3.3.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "builder-util-runtime": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.3.0.tgz", + "integrity": "sha512-CSOdsYqf4RXIHh1HANPbrZHlZ9JQJXSuDDloblZPcWQVN62inyYoTQuSmY3KrgefME2Sv3Kn2MxHvbGQHRf8Iw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -1724,6 +2005,50 @@ "unset-value": "^1.0.0" } }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "http-cache-semantics": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", + "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==", + "dev": true + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "normalize-url": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.3.0.tgz", + "integrity": "sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ==", + "dev": true + } + } + }, "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -1934,6 +2259,18 @@ "tslib": "^1.9.0" } }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -1990,6 +2327,12 @@ } } }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "dev": true + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -2051,6 +2394,15 @@ "shallow-clone": "^1.0.0" } }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -2140,6 +2492,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -2220,6 +2578,63 @@ } } }, + "configstore": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", + "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", @@ -2418,6 +2833,12 @@ "randomfill": "^1.0.3" } }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, "css-parse": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", @@ -2513,6 +2934,15 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -2535,6 +2965,12 @@ "ip-regex": "^2.1.0" } }, + "defer-to-connect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", + "integrity": "sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -2716,6 +3152,33 @@ "path-type": "^3.0.0" } }, + "dmg-builder": { + "version": "21.0.15", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-21.0.15.tgz", + "integrity": "sha512-Py8as3SXO9cskCSG4rSbFJDn7tyVNu5IficGELd/e/TVtdlbHddYPp4o29WRm1GShzgNrdJCDHeg2okfcTixew==", + "dev": true, + "requires": { + "app-builder-lib": "~21.0.15", + "bluebird-lst": "^1.0.9", + "builder-util": "~21.0.15", + "fs-extra": "^8.1.0", + "iconv-lite": "^0.5.0", + "js-yaml": "^3.13.1", + "parse-color": "^1.0.0", + "sanitize-filename": "^1.6.1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", + "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -2756,6 +3219,24 @@ "is-obj": "^2.0.0" } }, + "dotenv": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.0.0.tgz", + "integrity": "sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -2784,6 +3265,12 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "ejs": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", + "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==", + "dev": true + }, "electron": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/electron/-/electron-5.0.6.tgz", @@ -2803,6 +3290,118 @@ } } }, + "electron-builder": { + "version": "21.0.15", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-21.0.15.tgz", + "integrity": "sha512-ENvaU8+UwLAd4hIgOib1KyB1Ap119VrrEj4tBgihuKDgsNUgV7qt2YUdYA6umcUKPAE+ewWBfPLzg+q0gqWTIQ==", + "dev": true, + "requires": { + "app-builder-lib": "21.0.15", + "bluebird-lst": "^1.0.9", + "builder-util": "21.0.15", + "builder-util-runtime": "8.3.0", + "chalk": "^2.4.2", + "dmg-builder": "21.0.15", + "fs-extra": "^8.1.0", + "is-ci": "^2.0.0", + "lazy-val": "^1.0.4", + "read-config-file": "4.0.1", + "sanitize-filename": "^1.6.1", + "update-notifier": "^3.0.1", + "yargs": "^13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "electron-download": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", @@ -2854,6 +3453,54 @@ } } }, + "electron-osx-sign": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.11.tgz", + "integrity": "sha512-VVd40nrnVqymvFrY9ZkOYgHJOvexHHYTR3di/SN+mjJ0OWhR1I8BRVj3U+Yamw6hnkZZNKZp52rqL5EFAAPFkQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "compare-version": "^0.1.2", + "debug": "^2.6.8", + "isbinaryfile": "^3.0.2", + "minimist": "^1.2.0", + "plist": "^3.0.1" + }, + "dependencies": { + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + } + } + }, + "electron-publish": { + "version": "21.0.15", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-21.0.15.tgz", + "integrity": "sha512-KZACt9DPEnuW6+TBCme+8HVfsD+JaQzZ4jz237jd/yQKfQD3NW8zqZw3nRveNyDAuZomEbHtIEd3+OKZKY4n3g==", + "dev": true, + "requires": { + "bluebird-lst": "^1.0.9", + "builder-util": "~21.0.15", + "builder-util-runtime": "8.3.0", + "chalk": "^2.4.2", + "fs-extra": "^8.1.0", + "lazy-val": "^1.0.4", + "mime": "^2.4.4" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, "electron-reload": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/electron-reload/-/electron-reload-1.4.0.tgz", @@ -3566,6 +4213,17 @@ "readable-stream": "^2.0.0" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs-minipass": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", @@ -4224,6 +4882,15 @@ } } }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -4252,6 +4919,25 @@ } } }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, "graceful-fs": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", @@ -4342,6 +5028,12 @@ } } }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, "hash-base": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", @@ -4610,6 +5302,12 @@ "resolve-from": "^3.0.0" } }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -4791,6 +5489,15 @@ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -4878,6 +5585,33 @@ "is-extglob": "^2.1.1" } }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "dependencies": { + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + } + } + }, + "is-npm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", + "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -4997,12 +5731,24 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "isbinaryfile": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.2.tgz", + "integrity": "sha512-C3FSxJdNrEr2F4z6uFtNzECDM5hXk+46fxaa+cwBe5/XrWSmzdG8DDgyjfX6/NRdBB21q2JXuRAzPCUs+fclnQ==", + "dev": true + }, "isemail": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", @@ -5145,6 +5891,12 @@ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -5231,6 +5983,15 @@ "source-map-support": "^0.5.5" } }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -5243,6 +6004,21 @@ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "lazy-val": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", + "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", + "dev": true + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -5408,6 +6184,12 @@ "signal-exit": "^3.0.0" } }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -5637,6 +6419,12 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, "mini-css-extract-plugin": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz", @@ -6305,6 +7093,12 @@ "os-tmpdir": "^1.0.0" } }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -6370,6 +7164,26 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "package-json": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.4.0.tgz", + "integrity": "sha512-bd1T8OBG7hcvMd9c/udgv6u5v9wISP3Oyl9Cm7Weop8EFwrtcQDnS2sb6zhwqus2WslSr5wSTIPiTTpxxmPm7Q==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^3.4.0", + "registry-url": "^5.0.0", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "dev": true + } + } + }, "pacote": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.0.tgz", @@ -6444,6 +7258,23 @@ "safe-buffer": "^5.1.1" } }, + "parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", + "dev": true, + "requires": { + "color-convert": "~0.5.0" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", + "dev": true + } + } + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -6613,6 +7444,17 @@ "find-up": "^3.0.0" } }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dev": true, + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + } + }, "portfinder": { "version": "1.0.21", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", @@ -6831,6 +7673,12 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, "psl": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", @@ -7007,6 +7855,33 @@ } } }, + "read-config-file": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-4.0.1.tgz", + "integrity": "sha512-5caED3uo2IAZMPcbh/9hx/O29s2430RLxtnFDdzxpH/epEpawOrQnGBHueotIXUrGPPIgdNQN+S/CIp2WmiSfw==", + "dev": true, + "requires": { + "ajv": "^6.10.1", + "ajv-keywords": "^3.4.1", + "dotenv": "^8.0.0", + "dotenv-expand": "^5.1.0", + "fs-extra": "^8.1.0", + "js-yaml": "^3.13.1", + "json5": "^2.1.0", + "lazy-val": "^1.0.4" + }, + "dependencies": { + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "read-package-json": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", @@ -7190,6 +8065,25 @@ "regjsparser": "^0.1.4" } }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, "regjsgen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", @@ -7316,6 +8210,15 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -7410,6 +8313,15 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sanitize-filename": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz", + "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, "sass": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.2.tgz", @@ -7485,6 +8397,23 @@ "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", "dev": true }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, "semver-dsl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", @@ -8192,6 +9121,12 @@ "figgy-pudding": "^3.5.1" } }, + "stat-mode": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz", + "integrity": "sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==", + "dev": true + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -8452,6 +9387,75 @@ "yallist": "^3.0.3" } }, + "temp-file": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.4.tgz", + "integrity": "sha512-qSZ5W5q54iyGnP8cNl49RE0jTJc5CrzNocux5APD5yIxcgonoMuMSbsZfaZy8rTGCYo0Xz6ySVv3adagZ8gffg==", + "dev": true, + "requires": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^8.1.0" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, "terser": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz", @@ -8575,6 +9579,12 @@ } } }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -8656,6 +9666,15 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, "ts-node": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", @@ -8803,6 +9822,15 @@ "imurmurhash": "^0.1.4" } }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, "universal-analytics": { "version": "0.4.20", "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", @@ -8889,6 +9917,26 @@ "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", "dev": true }, + "update-notifier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", + "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", + "dev": true, + "requires": { + "boxen": "^3.0.0", + "chalk": "^2.0.1", + "configstore": "^4.0.0", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.1.0", + "is-npm": "^3.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -8931,12 +9979,35 @@ "requires-port": "^1.0.0" } }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + } + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -9322,6 +10393,15 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -9390,6 +10470,24 @@ "typedarray-to-buffer": "^3.1.5" } }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index 49118e8bf..125f23f18 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "octodash", + "description": "OctoDash is a simple, but beautiful dashboard for Octoprint.", "version": "0.5.0", "license": "Apache 2.0", "author": { @@ -7,18 +8,60 @@ "email": "timon.gaebelein@icloud.com" }, "main": "main.js", + "files": [ + "main.js", + "node_modules", + "dist", + "!**/node_modules/*/{CHANGELOG.md,README.md,README,readme.md,readme}", + "!**/node_modules/*/{test,__tests__,tests,powered-test,example,examples}", + "!**/node_modules/*.d.ts", + "!**/node_modules/.bin", + "!**/*.{iml,o,hprof,orig,pyc,pyo,rbc,swp,csproj,sln,xproj}", + "!.editorconfig", + "!**/._*", + "!**/{.DS_Store,.git,.hg,.svn,CVS,RCS,SCCS,.gitignore,.gitattributes}", + "!**/{__pycache__,thumbs.db,.flowconfig,.idea,.vs,.nyc_output}", + "!**/{appveyor.yml,.travis.yml,circle.yml}", + "!**/{npm-debug.log,yarn.lock,.yarn-integrity,.yarn-metadata.json}" + ], + "build": { + "appId": "com.unchartedbull.octodash", + "productName": "OctoDash", + "directories": { + "output": "package" + }, + "linux": { + "target": [{ + "target": "deb", + "arch": [ + "armv7l", + "arm64" + ] + }, { + "target": "snap", + "arch": [ + "armv7l", + "arm64" + ] + }] + }, + "mac": { + "target": "dmg", + "extraDistFiles": ["dist"] + } + }, "scripts": { "ng": "ng", "start": "npm-run-all -p ng:serve electron:serve", "start:big": "npm-run-all -p ng:serve electron:serve:big", - "build": "ng build --prod && electron .", + "build": "npm run ng:build && electron .", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e", "electron": "electron .", "electron:serve": "wait-on http-get://localhost:4200/ && electron . --serve", "electron:serve:big": "wait-on http-get://localhost:4200/ && electron . --serve --big", - "electron:build": "electron-builder build --linux", + "pack": "npm run ng:build && electron-builder build --dir", "ng:serve": "ng serve", "ng:build": "ng build --prod" }, @@ -34,6 +77,7 @@ "@angular/router": "~8.0.0", "ajv": "^6.10.1", "angular-svg-round-progressbar": "^3.0.1", + "electron-store": "^4.0.0", "rxjs": "~6.4.0", "tslib": "^1.9.0", "zone.js": "~0.9.1" @@ -47,8 +91,8 @@ "@types/node": "~8.9.4", "codelyzer": "^5.0.0", "electron": "^5.0.6", + "electron-builder": "^21.0.15", "electron-reload": "^1.4.0", - "electron-store": "^4.0.0", "npm-run-all": "^4.1.5", "ts-node": "~7.0.0", "tslint": "~5.15.0", diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 0d7f26260..1b79cbb2b 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -4,7 +4,7 @@ export const environment = { production: false, - config: 'assets/config.testings.json' + config: 'assets/config.testing.json' }; /* From d5e36ede712c6e0e335cd255f256caaf0f2899a3 Mon Sep 17 00:00:00 2001 From: UnchartedBull Date: Mon, 15 Jul 2019 14:57:09 +0200 Subject: [PATCH 15/18] Fixed Memory Leak --- src/app/bottom-bar/bottom-bar.component.ts | 24 ++++++++++++------- src/app/display-layer-progress.service.ts | 12 ++++++---- src/app/job-status/job-status.component.ts | 15 ++++++++---- src/app/job-status/job-status.service.ts | 10 +++++--- .../layer-progress.component.ts | 18 +++++++++----- .../printer-status.component.ts | 24 ++++++++++++------- .../printer-status/printer-status.service.ts | 8 +++++-- 7 files changed, 75 insertions(+), 36 deletions(-) diff --git a/src/app/bottom-bar/bottom-bar.component.ts b/src/app/bottom-bar/bottom-bar.component.ts index 15ee0cd15..f8ad1d430 100644 --- a/src/app/bottom-bar/bottom-bar.component.ts +++ b/src/app/bottom-bar/bottom-bar.component.ts @@ -1,29 +1,37 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, OnDestroy } from '@angular/core'; import { ConfigService } from '../config/config.service'; import { PrinterStatusService, PrinterStatusAPI } from '../printer-status/printer-status.service'; +import { Subscription } from 'rxjs'; @Component({ selector: 'app-bottom-bar', templateUrl: './bottom-bar.component.html', styleUrls: ['./bottom-bar.component.scss'] }) -export class BottomBarComponent implements OnInit { +export class BottomBarComponent implements OnInit, OnDestroy { - printer: Printer; - enclosureTemperature: number; + private subscriptions: Subscription = new Subscription(); + public printer: Printer; + public enclosureTemperature: number; constructor(private printerStatusService: PrinterStatusService, private configService: ConfigService) { - this.printerStatusService.getObservable().subscribe((printerStatus: PrinterStatusAPI) => this.printer.status = printerStatus.status); - } - - ngOnInit() { this.enclosureTemperature = 22.5; // TODO this.printer = { name: this.configService.config.printer.name, status: 'connecting ...' }; } + + ngOnInit() { + this.subscriptions.add(this.printerStatusService.getObservable().subscribe((printerStatus: PrinterStatusAPI) => { + this.printer.status = printerStatus.status; + })); + } + + ngOnDestroy() { + this.subscriptions.unsubscribe(); + } } interface Printer { diff --git a/src/app/display-layer-progress.service.ts b/src/app/display-layer-progress.service.ts index 8d1933a3a..d10120f1a 100644 --- a/src/app/display-layer-progress.service.ts +++ b/src/app/display-layer-progress.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { Observable, Observer, timer } from 'rxjs'; +import { Observable, Observer, timer, Subscription } from 'rxjs'; import { HttpHeaders, HttpErrorResponse, HttpClient } from '@angular/common/http'; import { ConfigService } from './config/config.service'; import { share } from 'rxjs/operators'; @@ -9,18 +9,22 @@ import { share } from 'rxjs/operators'; }) export class DisplayLayerProgressService { + httpRequest: Subscription; observable: Observable; constructor(private configService: ConfigService, private http: HttpClient) { this.observable = new Observable((observer: Observer) => { - timer(750, this.configService.config.octoprint.apiInterval).subscribe(_ => { + timer(1000, this.configService.config.octoprint.apiInterval).subscribe(_ => { if (this.configService.config) { const httpHeaders = { headers: new HttpHeaders({ 'x-api-key': this.configService.config.octoprint.accessToken }) }; - this.http.get(this.configService.config.octoprint.url + 'plugin/DisplayLayerProgress', httpHeaders).subscribe( + if (this.httpRequest) { + this.httpRequest.unsubscribe(); + } + this.httpRequest = this.http.get(this.configService.config.octoprint.url + 'plugin/DisplayLayerProgress', httpHeaders).subscribe( (data: JSON) => { observer.next({ current: data['layer']['current'] === '-' ? 0 : data['layer']['current'], @@ -28,7 +32,7 @@ export class DisplayLayerProgressService { fanSpeed: data['fanSpeed'] === '-' ? 0 : data['fanSpeed'] }) }, (error: HttpErrorResponse) => { - console.error('Can\'t retrieve layerProgress! ' + error.message); + console.error('Can\'t retrieve layer progress! ' + error.message); }); } }); diff --git a/src/app/job-status/job-status.component.ts b/src/app/job-status/job-status.component.ts index 3c8f9b155..14242410c 100644 --- a/src/app/job-status/job-status.component.ts +++ b/src/app/job-status/job-status.component.ts @@ -1,5 +1,6 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, OnDestroy } from '@angular/core'; import { JobStatusService, Job } from './job-status.service'; +import { Subscription } from 'rxjs'; @Component({ selector: 'app-job-status', @@ -7,12 +8,18 @@ import { JobStatusService, Job } from './job-status.service'; styleUrls: ['./job-status.component.scss'], providers: [JobStatusService] }) -export class JobStatusComponent implements OnInit { - job: Job; +export class JobStatusComponent implements OnInit, OnDestroy { + + private subscriptions: Subscription = new Subscription(); + public job: Job; constructor(private jobStatusService: JobStatusService) { } ngOnInit() { - this.jobStatusService.getObservable().subscribe((job: Job) => this.job = job); + this.subscriptions.add(this.jobStatusService.getObservable().subscribe((job: Job) => this.job = job)); + } + + ngOnDestroy() { + this.subscriptions.unsubscribe(); } } diff --git a/src/app/job-status/job-status.service.ts b/src/app/job-status/job-status.service.ts index 88ca9f939..ca6646aa2 100644 --- a/src/app/job-status/job-status.service.ts +++ b/src/app/job-status/job-status.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { Observable, Observer, timer } from 'rxjs'; +import { Observable, Observer, timer, Subscription } from 'rxjs'; import { ConfigService } from '../config/config.service'; import { HttpHeaders, HttpClient, HttpErrorResponse } from '@angular/common/http'; import { share } from 'rxjs/operators'; @@ -9,18 +9,22 @@ import { share } from 'rxjs/operators'; }) export class JobStatusService { + httpRequest: Subscription; observable: Observable; constructor(private configService: ConfigService, private http: HttpClient) { this.observable = new Observable((observer: Observer) => { - timer(1000, this.configService.config.octoprint.apiInterval).subscribe(_ => { + timer(750, this.configService.config.octoprint.apiInterval).subscribe(_ => { if (this.configService.config) { const httpHeaders = { headers: new HttpHeaders({ 'x-api-key': this.configService.config.octoprint.accessToken }) }; - this.http.get(this.configService.config.octoprint.url + 'job', httpHeaders).subscribe( + if (this.httpRequest) { + this.httpRequest.unsubscribe(); + } + this.httpRequest = this.http.get(this.configService.config.octoprint.url + 'job', httpHeaders).subscribe( (data: JSON) => { let job: Job = null; if (data['state'] === 'Printing') { diff --git a/src/app/layer-progress/layer-progress.component.ts b/src/app/layer-progress/layer-progress.component.ts index 50d3028d0..ee35f35dc 100644 --- a/src/app/layer-progress/layer-progress.component.ts +++ b/src/app/layer-progress/layer-progress.component.ts @@ -1,27 +1,33 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, OnDestroy } from '@angular/core'; import { DisplayLayerProgressService, DisplayLayerProgressAPI } from '../display-layer-progress.service'; +import { Subscription } from 'rxjs'; @Component({ selector: 'app-layer-progress', templateUrl: './layer-progress.component.html', styleUrls: ['./layer-progress.component.scss'] }) -export class LayerProgressComponent implements OnInit { +export class LayerProgressComponent implements OnInit, OnDestroy { - layerProgress: LayerProgress; + private subscriptions: Subscription = new Subscription(); + public layerProgress: LayerProgress; constructor(private displayLayerProgressService: DisplayLayerProgressService) { this.layerProgress = { current: 0, total: 0 }; - this.displayLayerProgressService.getObservable().subscribe((layerProgress: DisplayLayerProgressAPI) => { + } + + ngOnInit() { + this.subscriptions.add(this.displayLayerProgressService.getObservable().subscribe((layerProgress: DisplayLayerProgressAPI) => { this.layerProgress.current = layerProgress.current; this.layerProgress.total = layerProgress.total; - }); + })); } - ngOnInit() { + ngOnDestroy() { + this.subscriptions.unsubscribe(); } } diff --git a/src/app/printer-status/printer-status.component.ts b/src/app/printer-status/printer-status.component.ts index 846163742..bc789edc8 100644 --- a/src/app/printer-status/printer-status.component.ts +++ b/src/app/printer-status/printer-status.component.ts @@ -1,15 +1,17 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, OnDestroy } from '@angular/core'; import { PrinterStatusService, PrinterStatusAPI, PrinterValue } from './printer-status.service'; import { DisplayLayerProgressService, DisplayLayerProgressAPI } from '../display-layer-progress.service'; +import { Subscription } from 'rxjs'; @Component({ selector: 'app-printer-status', templateUrl: './printer-status.component.html', styleUrls: ['./printer-status.component.scss'] }) -export class PrinterStatusComponent implements OnInit { +export class PrinterStatusComponent implements OnInit, OnDestroy { - printerStatus: PrinterStatus; + private subscriptions: Subscription = new Subscription(); + public printerStatus: PrinterStatus; constructor(private printerStatusService: PrinterStatusService, private displayLayerProgressService: DisplayLayerProgressService) { this.printerStatus = { @@ -23,18 +25,22 @@ export class PrinterStatusComponent implements OnInit { }, fan: 0 }; - this.printerStatusService.getObservable().subscribe((printerStatus: PrinterStatusAPI) => { + } + + ngOnInit() { + this.subscriptions.add(this.printerStatusService.getObservable().subscribe((printerStatus: PrinterStatusAPI) => { this.printerStatus.nozzle = printerStatus.nozzle; this.printerStatus.heatbed = printerStatus.heatbed; - }); + })); - this.displayLayerProgressService.getObservable().subscribe((layerProgress: DisplayLayerProgressAPI) => { + this.subscriptions.add(this.displayLayerProgressService.getObservable().subscribe((layerProgress: DisplayLayerProgressAPI) => { this.printerStatus.fan = layerProgress.fanSpeed; - }); + })); } - ngOnInit() { } - + ngOnDestroy() { + this.subscriptions.unsubscribe(); + } } export interface PrinterStatus { diff --git a/src/app/printer-status/printer-status.service.ts b/src/app/printer-status/printer-status.service.ts index 5780bec5d..f4427af8b 100644 --- a/src/app/printer-status/printer-status.service.ts +++ b/src/app/printer-status/printer-status.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http'; import { ConfigService } from '../config/config.service'; -import { Observable, Observer, timer } from 'rxjs'; +import { Observable, Observer, timer, Subscription } from 'rxjs'; import { share } from 'rxjs/operators'; @Injectable({ @@ -9,6 +9,7 @@ import { share } from 'rxjs/operators'; }) export class PrinterStatusService { + httpRequest: Subscription; observable: Observable; constructor(private http: HttpClient, private configService: ConfigService) { @@ -20,7 +21,10 @@ export class PrinterStatusService { 'x-api-key': this.configService.config.octoprint.accessToken }) }; - this.http.get(this.configService.config.octoprint.url + 'printer', httpHeaders).subscribe( + if (this.httpRequest) { + this.httpRequest.unsubscribe(); + } + this.httpRequest = this.http.get(this.configService.config.octoprint.url + 'printer', httpHeaders).subscribe( (data: JSON) => { const printerStatus: PrinterStatusAPI = { status: data['state']['text'].toLowerCase(), From 09145ead0d34f228964af29c0bb1041a37498767 Mon Sep 17 00:00:00 2001 From: UnchartedBull Date: Mon, 15 Jul 2019 15:14:41 +0200 Subject: [PATCH 16/18] Adjust README --- README.md | 25 ++++++++++++++++++------- icons.txt | 3 +++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 30aa64cba..ade37328b 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,14 @@ OctoDash is a simple, but beautiful dashboard for Octoprint. ### Electron (recommended) -- Download the latest release, start the app and OctoDash will help you setup a config. +- Download the latest release for your architecture (for Raspberry Pi use armv7l), start the app and OctoDash will help you set up a config. -If you want to start Electron automatically have a look at the wiki (not done yet) + +#### Start on boot +tbd. + +#### Creating config manually +If you don't want to use the Config Wizard you can also create the config manually. Just copy `sample.config.json` and adjust it according to your setup. Copy the file to `~/.config/octodash/config.json` (for Raspbian). For other OS please refer to the [Electron Docs](https://electronjs.org/docs/api/app#appgetpathname). ### Website @@ -19,9 +24,15 @@ This option does not allow you to change your config via the UI and the styling - Install all the dependencies - `npm install` - Adjust `src/assets/config.json` accordingly to your installation - Build the app - `ng build --prod` -- The final website is located at `/dist`, which can be served by any webserver and viewed by any webbrowser, that does support angular. A chromium based webbrowser is recommended +- The final website is located at `/dist`, which can be served by any web server and viewed by any web browser, that does support angular. A chromium-based web browser is recommended + +## Supported Devices + +It is recommended to use a 5" or 7" display with a resolution of 800x480 px. You shouldn't choose a screen smaller than 3.5" and with a lower resolution than 480x320 px. +The prebuilt electron app supports Raspberry Pi 2 and higher. The Raspberry Pi 1 is not supported and never will be supported. If you use a Pi 1 please use the Website Version or build the app yourself. +All other SoCs that are using an armv7, or arm64 compatible, processer are supported as well. ## Screenshots

@@ -37,14 +48,14 @@ If you encounter an issue, while using OctoDash please have a look at the wiki T If you find a bug, please open an issue, so I can have a look at it. Please also add the steps to reproduce and the .gcode file. Thank you! -One more thing: If you're Octoprint is running on a Raspberry Pi 1 you may want to opt out of this, because it just does not have enough power. +One more thing: If you're Octoprint is running on a Raspberry Pi 1 you may want to opt out of this because it just does not have enough power. ## Contributing -If you can think of something nice to add or want to change some of the messy code feel free to create a Pull Request. I'll haev a look at it and will merge it into master if everything checks out! +If you can think of something nice to add or want to change some of the messy code feel free to create a Pull Request. I'll have a look at it and will merge it into master if everything checks out! Any help is greatly appreciated! -If you can think of a great feature, but don't feel yet ready to code something open an issue. I'll have a look at it and maybe implement it, if I have the time. It is preferred if you directly create a Pull Request for your new feature. If you need some help, I can point you in the correct direction. +If you can think of a great feature, but don't feel yet ready to code something open an issue. I'll have a look at it and maybe implement it if I have the time. It is preferred if you directly create a Pull Request for your new feature. If you need some help, I can point you in the correct direction. ## License @@ -55,4 +66,4 @@ The Credits for the icons can be (temporarily) found at icons.txt. They'll get m ## Special Thanks -Special Thanks to [/u/Slateclean](https://www.reddit.com/user/Slateclean) for supplying me with touchscreens so I can further develop the project. Without you this wouldn't be happening! +Special Thanks to [/u/Slateclean](https://www.reddit.com/user/Slateclean) for supplying me with touchscreens so I can further develop the project. Without you, this wouldn't be happening! diff --git a/icons.txt b/icons.txt index 2bf7442b6..f95cf1855 100644 --- a/icons.txt +++ b/icons.txt @@ -1,3 +1,6 @@ +"bed plate, heated, Plate, Bed icon" from shareicon.net +"filament, spool, Reel icon" from shareicon.net +"Extruder, nozzle, head icon" from shareicon.net "Invalid Code" by Arthur Shlain from thenounproject.com "back" by Dwiky Setiawan from thenounproject.com "next" by Dwiky Setiawan from thenounproject.com From ff04e1f141848480538521d670c24aa639b23d0f Mon Sep 17 00:00:00 2001 From: UnchartedBull Date: Mon, 15 Jul 2019 21:27:52 +0200 Subject: [PATCH 17/18] Add Autostart to README + Fix electron build --- README.md | 43 ++++++++++++++++++++++++++++++++++++++++--- package-lock.json | 41 ++++++++++------------------------------- package.json | 31 ++++++++++++++++++++----------- sample.config.json | 17 +++++++++++++++++ 4 files changed, 87 insertions(+), 45 deletions(-) create mode 100644 sample.config.json diff --git a/README.md b/README.md index ade37328b..82c1223c4 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,50 @@ OctoDash is a simple, but beautiful dashboard for Octoprint. ## Installation -### Electron (recommended) +You need to install the DisplayLayerProgress Plugin by OllisGit to enable the full functionality of OctoDash. The API is currently not in the final plugin, so please install the plugin with the following link: https://github.com/UnchartedBull/OctoPrint-DisplayLayerProgress/archive/master.zip. -- Download the latest release for your architecture (for Raspberry Pi use armv7l), start the app and OctoDash will help you set up a config. +### Electron (recommended) +- Download the latest release for your architecture (for Raspberry Pi use armv7l) +`insert download command here` +- Install the app +`sudo dpkg -i name` +- If you get an error while installing install all missing dependencies and reinstall OctoDash. +`sudo apt install -f && sudo dpkg -i name` #### Start on boot -tbd. +This is a superminimal install to just display OctoDash on Raspbian LITE. Good thing is, that it keeps the load and the Pi quite low and improves start-up time. If you use another window manager adjust your files according to the Documentation. + +- Enable pi Console Autologin via +`sudo raspi-config` +- Install xorg + ratpoison +`sudo apt install xserver-xorg --no-install-recommends ratpoison x11-xserver-utils xinit` +- Create the .xinitrc file +`nano ~/.xinitrc` +- Add the following contents: +``` + #!/bin/sh + + xset s off + xset s noblank + xset -dpms + + ratpoison& + octodash +``` +- make the file executable +`sudo chmod +x .xinitrc` +- make xinit autostart on boot `nano ~/.bashrc` +- add the following at the very bottom: +``` +if [ -z "$SSH_CLIENT" ] || [ -z "$SSH_TTY" ]; then + xinit -- -nocursor +fi +``` +- reboot + + +If you get the `Cannot open virtual console 2 (Permission denied)` error run `sudo chmod ug+s /usr/lib/xorg/Xorg` and reboot. #### Creating config manually If you don't want to use the Config Wizard you can also create the config manually. Just copy `sample.config.json` and adjust it according to your setup. Copy the file to `~/.config/octodash/config.json` (for Raspbian). For other OS please refer to the [Electron Docs](https://electronjs.org/docs/api/app#appgetpathname). diff --git a/package-lock.json b/package-lock.json index edfad68b5..776d844fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2550,7 +2550,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/conf/-/conf-5.0.0.tgz", "integrity": "sha512-lRNyt+iRD4plYaOSVTxu1zPWpaH0EOxgFIR1l3mpC/DGZ7XzhoGFMKmbl54LAgXcSu6knqWgOwdINkqm58N85A==", - "dev": true, "requires": { "ajv": "^6.10.0", "dot-prop": "^5.0.0", @@ -2564,14 +2563,12 @@ "env-paths": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==" }, "make-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "dev": true, "requires": { "semver": "^6.0.0" } @@ -3214,7 +3211,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.1.0.tgz", "integrity": "sha512-n1oC6NBF+KM9oVXtjmen4Yo7HyAVWV2UUl50dCYJdw2924K6dX9bf9TTTWaKtYlRn0FEtxG27KS80ayVLixxJA==", - "dev": true, "requires": { "is-obj": "^2.0.0" } @@ -3536,7 +3532,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-4.0.0.tgz", "integrity": "sha512-qgkDetwB9bz+ZA7mNCQGm6zLJOMT4yBkTZ7f16M9iS0GcI/bOeOeFkLkIaJddTtPca7MOiaUM1imMjFqUfQgSA==", - "dev": true, "requires": { "conf": "^5.0.0", "type-fest": "^0.5.2" @@ -4109,7 +4104,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -5321,8 +5315,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "2.1.0", @@ -5635,8 +5628,7 @@ "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" }, "is-path-cwd": { "version": "2.2.0", @@ -5710,8 +5702,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", @@ -5917,8 +5908,7 @@ "json-schema-typed": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.0.tgz", - "integrity": "sha512-ikVqF4dlAgRvAb3MDAgDQRtB/GIC8+iq+z5bczPh9bUT7bAZCdGfGCypJHBquzZNoxebql1UgPxWbImnvkSuJg==", - "dev": true + "integrity": "sha512-ikVqF4dlAgRvAb3MDAgDQRtB/GIC8+iq+z5bczPh9bUT7bAZCdGfGCypJHBquzZNoxebql1UgPxWbImnvkSuJg==" }, "json-stringify-safe": { "version": "5.0.1", @@ -6135,7 +6125,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -7121,7 +7110,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -7130,7 +7118,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "requires": { "p-limit": "^2.0.0" } @@ -7161,8 +7148,7 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "package-json": { "version": "6.4.0", @@ -7318,8 +7304,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", @@ -7439,7 +7424,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, "requires": { "find-up": "^3.0.0" } @@ -8394,8 +8378,7 @@ "semver": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" }, "semver-diff": { "version": "2.1.0", @@ -8647,8 +8630,7 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "single-line-log": { "version": "1.1.2", @@ -9758,8 +9740,7 @@ "type-fest": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", - "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", - "dev": true + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==" }, "type-is": { "version": "1.6.18", @@ -9781,7 +9762,6 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, "requires": { "is-typedarray": "^1.0.0" } @@ -10462,7 +10442,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.0.tgz", "integrity": "sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q==", - "dev": true, "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", diff --git a/package.json b/package.json index 125f23f18..081809365 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "octodash", "description": "OctoDash is a simple, but beautiful dashboard for Octoprint.", - "version": "0.5.0", + "version": "1.0.0", "license": "Apache 2.0", "author": { "name": "Timon Gaebelein", @@ -25,7 +25,7 @@ "!**/{npm-debug.log,yarn.lock,.yarn-integrity,.yarn-metadata.json}" ], "build": { - "appId": "com.unchartedbull.octodash", + "appId": "octodash", "productName": "OctoDash", "directories": { "output": "package" @@ -37,17 +37,26 @@ "armv7l", "arm64" ] - }, { - "target": "snap", + }], + "category": "Utility" + }, + "mac": { + "target": [{ + "target": "dmg", "arch": [ - "armv7l", - "arm64" + "x64" ] - }] + }], + "category": "public.app-category.utilities" }, - "mac": { - "target": "dmg", - "extraDistFiles": ["dist"] + "win": { + "target": [{ + "target": "portable", + "arch": [ + "x64", + "ia32" + ] + }] } }, "scripts": { @@ -61,7 +70,7 @@ "electron": "electron .", "electron:serve": "wait-on http-get://localhost:4200/ && electron . --serve", "electron:serve:big": "wait-on http-get://localhost:4200/ && electron . --serve --big", - "pack": "npm run ng:build && electron-builder build --dir", + "pack": "npm run ng:build && electron-builder build -lmw", "ng:serve": "ng serve", "ng:build": "ng build --prod" }, diff --git a/sample.config.json b/sample.config.json new file mode 100644 index 000000000..0a01bb92d --- /dev/null +++ b/sample.config.json @@ -0,0 +1,17 @@ +{ + "config": { + "octoprint": { + "url": "http://localhost:5000/api/", + "accessToken": "INSERT API KEY HERE", + "apiInterval": 1500 + }, + "printer": { + "name": "NAME HERE" + }, + "filament": { + "thickness": 0, + "density": 0 + }, + "touchscreen": true + } +} From c1653cbf2fb7876c81d46322f244f102e1f1bc5d Mon Sep 17 00:00:00 2001 From: UnchartedBull Date: Mon, 15 Jul 2019 22:33:04 +0200 Subject: [PATCH 18/18] Fix Layout Issue --- src/app/display-layer-progress.service.ts | 11 ++++++----- src/app/job-status/job-status.component.scss | 7 ++++++- src/app/job-status/job-status.service.ts | 1 + .../layer-progress/layer-progress.component.scss | 2 +- .../printer-status/printer-status.component.scss | 14 ++++++++++---- src/assets/fan.svg | 9 ++++++++- src/assets/heat-bed.svg | 9 ++++++++- 7 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/app/display-layer-progress.service.ts b/src/app/display-layer-progress.service.ts index d10120f1a..2a327f141 100644 --- a/src/app/display-layer-progress.service.ts +++ b/src/app/display-layer-progress.service.ts @@ -26,11 +26,12 @@ export class DisplayLayerProgressService { } this.httpRequest = this.http.get(this.configService.config.octoprint.url + 'plugin/DisplayLayerProgress', httpHeaders).subscribe( (data: JSON) => { - observer.next({ - current: data['layer']['current'] === '-' ? 0 : data['layer']['current'], - total: data['layer']['total'] === '-' ? 0 : data['layer']['total'], - fanSpeed: data['fanSpeed'] === '-' ? 0 : data['fanSpeed'] - }) + let fanSpeed = + observer.next({ + current: data['layer']['current'] === '-' ? 0 : data['layer']['current'], + total: data['layer']['total'] === '-' ? 0 : data['layer']['total'], + fanSpeed: data['fanSpeed'] === '-' ? 0 : data['fanSpeed'] === 'Off' ? 0 : data['fanSpeed'] + }) }, (error: HttpErrorResponse) => { console.error('Can\'t retrieve layer progress! ' + error.message); }); diff --git a/src/app/job-status/job-status.component.scss b/src/app/job-status/job-status.component.scss index 9c3747f4a..20936c970 100644 --- a/src/app/job-status/job-status.component.scss +++ b/src/app/job-status/job-status.component.scss @@ -1,7 +1,12 @@ +.job-info { + height: 27vw; + display: block; +} + .job-info__no-job { width: 100%; font-size: 6vw; - height: 21.5vh; + height: 26vh; margin-top: 19vh; text-align: center; } diff --git a/src/app/job-status/job-status.service.ts b/src/app/job-status/job-status.service.ts index ca6646aa2..4ed29ac1e 100644 --- a/src/app/job-status/job-status.service.ts +++ b/src/app/job-status/job-status.service.ts @@ -27,6 +27,7 @@ export class JobStatusService { this.httpRequest = this.http.get(this.configService.config.octoprint.url + 'job', httpHeaders).subscribe( (data: JSON) => { let job: Job = null; + console.log(data); if (data['state'] === 'Printing') { job = { filename: data['job']['file']['display'].replace('.gcode', ''), diff --git a/src/app/layer-progress/layer-progress.component.scss b/src/app/layer-progress/layer-progress.component.scss index caff869b7..0d1177805 100644 --- a/src/app/layer-progress/layer-progress.component.scss +++ b/src/app/layer-progress/layer-progress.component.scss @@ -1,7 +1,7 @@ .layer-indication { width: 100%; display: block; - margin-top: 3vh; + margin-top: 1vh; text-align: center; font-size: 4vw; } diff --git a/src/app/printer-status/printer-status.component.scss b/src/app/printer-status/printer-status.component.scss index e15769bad..d70441bba 100644 --- a/src/app/printer-status/printer-status.component.scss +++ b/src/app/printer-status/printer-status.component.scss @@ -1,14 +1,20 @@ .printer-status { width: 100%; - margin-top: 10.4vh; + margin-top: 3vh; + height: 23vh; display: block; table-layout: fixed; overflow: visible; + + & tr { + vertical-align: middle; + } } .printer-status__value { text-align: right; - height: 16.5vh; + height: 23vh; + vertical-align: middle; & img { width: 10vw; @@ -28,7 +34,7 @@ padding-right: 7.5vw; & img { - width: 9.2vw; + width: 9.6vw; } } @@ -38,7 +44,7 @@ & img { padding-top: 1vh; - width: 11.5vw; + width: 10vw; } } } diff --git a/src/assets/fan.svg b/src/assets/fan.svg index 703ead7e5..58ad08636 100644 --- a/src/assets/fan.svg +++ b/src/assets/fan.svg @@ -1 +1,8 @@ - \ No newline at end of file + + + + + + diff --git a/src/assets/heat-bed.svg b/src/assets/heat-bed.svg index 1295c1885..eb05f883c 100644 --- a/src/assets/heat-bed.svg +++ b/src/assets/heat-bed.svg @@ -1 +1,8 @@ - \ No newline at end of file + + + + + +