diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..d1d8c124 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,24 @@ + +module.exports = { + root: true, + env: { + node: true + }, + extends: [ + "plugin:vue/recommended", + "eslint:recommended", + "prettier/vue", + "plugin:prettier/recommended" + ], + rules: { + "vue/component-name-in-template-casing": ["error", "PascalCase"], + "no-console": process.env.NODE_ENV === "production" ? "error" : "off", + "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off" + }, + globals: { + $nuxt: true + }, + parserOptions: { + parser: "babel-eslint" + } +}; \ No newline at end of file diff --git a/app/app.dev.js b/app/app.dev.js index d71881a9..2fe4cd0e 100644 --- a/app/app.dev.js +++ b/app/app.dev.js @@ -1,27 +1,27 @@ -const electron = require('electron') -const contextMenu = require('electron-context-menu') -const path = require('path') +const electron = require("electron"); +const contextMenu = require("electron-context-menu"); +const path = require("path"); -const app = electron.app -const BrowserWindow = electron.BrowserWindow +const app = electron.app; +const BrowserWindow = electron.BrowserWindow; -let url = 'http://localhost:8080/' +let url = "http://localhost:8080/"; // Set the application menu -require('./menu.js') +require("./menu.js"); -app.on('ready', () => { +app.on("ready", () => { let window = new BrowserWindow({ - width: 1124, + width: 1124, height: 800, - icon: path.join(__dirname, '/icons/png/64x64.png') - }) + icon: path.join(__dirname, "/icons/png/64x64.png") + }); contextMenu({ showCopyImageAddress: true, showSaveImageAs: true, - showInspectElement: true, + showInspectElement: true }); - window.loadURL(url) -}) \ No newline at end of file + window.loadURL(url); +}); diff --git a/app/app.js b/app/app.js index 3240717a..23e0c5f4 100644 --- a/app/app.js +++ b/app/app.js @@ -1,144 +1,159 @@ // Required packages -const electron = require('electron') -const { dialog } = require('electron') +const electron = require("electron"); +const { dialog } = require("electron"); const updater = require("electron-updater"); const autoUpdater = updater.autoUpdater; -const contextMenu = require('electron-context-menu') -const path = require('path') +const contextMenu = require("electron-context-menu"); +const path = require("path"); // Attach settings store -const { store } = require('./store') +const { store } = require("./store"); -// Auto upadater +// Auto upadater autoUpdater.autoDownload = false; -autoUpdater.on('checking-for-update', function () {}); +autoUpdater.on("checking-for-update", function() {}); -autoUpdater.on('update-available', function (info) { - sendStatusToWindow('Update available.' + info) - dialog.showMessageBox(mainWindow, { - type: 'info', - title: 'Update available', - message: 'A new version of OpenFlexure eV is available.', - buttons: ['Download', 'Later'] - }, (buttonIndex) => { - if (buttonIndex === 0) { - autoUpdater.downloadUpdate() +autoUpdater.on("update-available", function(info) { + sendStatusToWindow("Update available." + info); + dialog.showMessageBox( + mainWindow, + { + type: "info", + title: "Update available", + message: "A new version of OpenFlexure eV is available.", + buttons: ["Download", "Later"] + }, + buttonIndex => { + if (buttonIndex === 0) { + autoUpdater.downloadUpdate(); + } } - }) + ); }); -autoUpdater.on('update-downloaded', function (info) { - sendStatusToWindow('Update downloaded.' + info) - dialog.showMessageBox(mainWindow, { - type: 'info', +autoUpdater.on("update-downloaded", function(info) { + sendStatusToWindow("Update downloaded." + info); + dialog.showMessageBox( + mainWindow, + { + type: "info", title: "Update downloaded", - message: 'Please restart the application to apply the update.', - buttons: ['Update', 'Later'] - }, (buttonIndex) => { - if (buttonIndex === 0) { - autoUpdater.quitAndInstall(); + message: "Please restart the application to apply the update.", + buttons: ["Update", "Later"] + }, + buttonIndex => { + if (buttonIndex === 0) { + autoUpdater.quitAndInstall(); + } } - }) + ); }); -autoUpdater.on('update-not-available', function (info) { - sendStatusToWindow('Update not available.'); +autoUpdater.on("update-not-available", function() { + sendStatusToWindow("Update not available."); }); -autoUpdater.on('error', function (err) { - sendStatusToWindow('Error in auto-updater.'); +autoUpdater.on("error", function() { + sendStatusToWindow("Error in auto-updater."); }); -autoUpdater.on('download-progress', function (progressObj) { +autoUpdater.on("download-progress", function(progressObj) { let log_message = "Download speed: " + progressObj.bytesPerSecond; - log_message = log_message + ' - Downloaded ' + parseInt(progressObj.percent) + '%'; - log_message = log_message + ' (' + progressObj.transferred + "/" + progressObj.total + ')'; + log_message = + log_message + " - Downloaded " + parseInt(progressObj.percent) + "%"; + log_message = + log_message + + " (" + + progressObj.transferred + + "/" + + progressObj.total + + ")"; sendStatusToWindow(log_message); }); function sendStatusToWindow(message) { - console.log(message); + console.log(message); } // Set up the app -const app = electron.app -const BrowserWindow = electron.BrowserWindow +const app = electron.app; +const BrowserWindow = electron.BrowserWindow; // Set the window content -let url = `file://${path.join(__dirname, '/dist/index.html')}` -let mainWindow +let url = `file://${path.join(__dirname, "/dist/index.html")}`; +let mainWindow; // Set the application menu -require('./menu.js') +require("./menu.js"); // Handle redrawing the mainWindow let recreatingWindowInProgress = false; -function toggleCustomTitleBar () { +function toggleCustomTitleBar() { // Mark window as being recreated, to prevent stopping the application - recreatingWindowInProgress = true + recreatingWindowInProgress = true; // Invert the drawCustomTitleBar setting - store.set('drawCustomTitleBar', !store.get('drawCustomTitleBar')) + store.set("drawCustomTitleBar", !store.get("drawCustomTitleBar")); // Destroy old window - mainWindow.destroy() + mainWindow.destroy(); // Create new window - createWindow() + createWindow(); // Mark window as no longer being recreated - recreatingWindowInProgress = false + recreatingWindowInProgress = false; } function createWindow() { // Create the browser window. mainWindow = new BrowserWindow({ - frame: !store.get('drawCustomTitleBar'), - width: 1124, + frame: !store.get("drawCustomTitleBar"), + width: 1124, height: 800, - icon: path.join(__dirname, '/icons/png/64x64.png'), + icon: path.join(__dirname, "/icons/png/64x64.png"), webPreferences: { nodeIntegration: true } - }) + }); // Make a context menu contextMenu({ showCopyImageAddress: true, showSaveImageAs: true, - showInspectElement: false, + showInspectElement: false }); // Load window contents - mainWindow.loadURL(url) + mainWindow.loadURL(url); // Check for updates autoUpdater.checkForUpdates(); // Emitted when the window is closed. - mainWindow.on('closed', function() { - mainWindow = null // Dereference the window object - }) + mainWindow.on("closed", function() { + mainWindow = null; // Dereference the window object + }); } // Some APIs can only be used after this event occurs. -app.on('ready', () => { - createWindow() -}) +app.on("ready", () => { + createWindow(); +}); // Quit when all windows are closed. -app.on('window-all-closed', function() { - if ((process.platform !== 'darwin') && recreatingWindowInProgress != true) { - app.quit() +app.on("window-all-closed", function() { + if (process.platform !== "darwin" && recreatingWindowInProgress != true) { + app.quit(); } -}) +}); -app.on('activate', function() { +app.on("activate", function() { if (mainWindow === null) { - createWindow() + createWindow(); } -}) +}); // Export toggleCustomTitleBar for use in ./menu.js -module.exports.toggleCustomTitleBar = toggleCustomTitleBar \ No newline at end of file +module.exports.toggleCustomTitleBar = toggleCustomTitleBar; diff --git a/app/menu.js b/app/menu.js index f8d54ab6..0fb6a391 100644 --- a/app/menu.js +++ b/app/menu.js @@ -1,129 +1,122 @@ -const { app, shell, Menu } = require('electron') +const { app, shell, Menu } = require("electron"); const updater = require("electron-updater"); const autoUpdater = updater.autoUpdater; -const path = require('path') +const path = require("path"); -const openAboutWindow = require('about-window').default +const openAboutWindow = require("about-window").default; -const main = require('./app') -const { store } = require('./store') +const main = require("./app"); +const { store } = require("./store"); const template = [ { - label: 'Edit', + label: "Edit", submenu: [ - { role: 'undo' }, - { role: 'redo' }, - { type: 'separator' }, - { role: 'cut' }, - { role: 'copy' }, - { role: 'paste' }, - { role: 'delete' }, - { role: 'selectall' } + { role: "undo" }, + { role: "redo" }, + { type: "separator" }, + { role: "cut" }, + { role: "copy" }, + { role: "paste" }, + { role: "delete" }, + { role: "selectall" } ] }, { - label: 'View', + label: "View", submenu: [ - { role: 'reload' }, - { role: 'forcereload' }, - { role: 'toggledevtools' }, - { type: 'separator' }, - { role: 'togglefullscreen' }, - { type: 'separator' }, + { role: "reload" }, + { role: "forcereload" }, + { role: "toggledevtools" }, + { type: "separator" }, + { role: "togglefullscreen" }, + { type: "separator" }, { - type: 'checkbox', - checked: store.get('drawCustomTitleBar'), - label: 'Custom titlebar', - click () { - main.toggleCustomTitleBar() + type: "checkbox", + checked: store.get("drawCustomTitleBar"), + label: "Custom titlebar", + click() { + main.toggleCustomTitleBar(); } } ] }, { - role: 'window', - submenu: [ - { role: 'minimize' }, - { role: 'close' } - ] + role: "window", + submenu: [{ role: "minimize" }, { role: "close" }] }, { - role: 'help', + role: "help", submenu: [ { - label: 'About', - click () { + label: "About", + click() { openAboutWindow({ - package_json_dir: path.join(__dirname, '..'), - icon_path: path.join(__dirname, '/icons/png/512x512.png'), - bug_report_url: "https://gitlab.com/openflexure/openflexure-microscope-jsclient/issues", - homepage: "https://gitlab.com/openflexure/openflexure-microscope-jsclient", - }) + package_json_dir: path.join(__dirname, ".."), + icon_path: path.join(__dirname, "/icons/png/512x512.png"), + bug_report_url: + "https://gitlab.com/openflexure/openflexure-microscope-jsclient/issues", + homepage: + "https://gitlab.com/openflexure/openflexure-microscope-jsclient" + }); } }, { - label: 'Homepage', - click () { - shell.openExternal('https://openflexure.org') + label: "Homepage", + click() { + shell.openExternal("https://openflexure.org"); } }, - { type: 'separator' }, + { type: "separator" }, { - label: 'Check for Updates', - click () { + label: "Check for Updates", + click() { autoUpdater.checkForUpdates(); } } ] } -] +]; -if (process.platform === 'darwin') { +if (process.platform === "darwin") { template.unshift({ label: app.getName(), submenu: [ - { role: 'about' }, - { type: 'separator' }, - { role: 'services' }, - { type: 'separator' }, - { role: 'hide' }, - { role: 'hideothers' }, - { role: 'unhide' }, - { type: 'separator' }, - { role: 'quit' } + { role: "about" }, + { type: "separator" }, + { role: "services" }, + { type: "separator" }, + { role: "hide" }, + { role: "hideothers" }, + { role: "unhide" }, + { type: "separator" }, + { role: "quit" } ] - }) + }); // Edit menu template[1].submenu.push( - { type: 'separator' }, + { type: "separator" }, { - label: 'Speech', - submenu: [ - { role: 'startspeaking' }, - { role: 'stopspeaking' } - ] + label: "Speech", + submenu: [{ role: "startspeaking" }, { role: "stopspeaking" }] } - ) + ); // Window menu template[3].submenu = [ - { role: 'close' }, - { role: 'minimize' }, - { role: 'zoom' }, - { type: 'separator' }, - { role: 'front' } - ] -} -else { + { role: "close" }, + { role: "minimize" }, + { role: "zoom" }, + { type: "separator" }, + { role: "front" } + ]; +} else { template.unshift({ - label: 'File', - submenu: [ - { role: 'quit' } - ] - }) + label: "File", + submenu: [{ role: "quit" }] + }); } -const menu = Menu.buildFromTemplate(template) -Menu.setApplicationMenu(menu) \ No newline at end of file +const menu = Menu.buildFromTemplate(template); +Menu.setApplicationMenu(menu); diff --git a/app/store.js b/app/store.js index 549a45f7..5d14dcf0 100644 --- a/app/store.js +++ b/app/store.js @@ -1,9 +1,9 @@ -const Store = require('electron-store'); +const Store = require("electron-store"); const store = new Store(); -if (store.has('drawCustomTitleBar') !== true) { +if (store.has("drawCustomTitleBar") !== true) { // Default to false if on MacOS, otherwise true - store.set('drawCustomTitleBar', (process.platform === 'win32') ? true : false) + store.set("drawCustomTitleBar", process.platform === "win32" ? true : false); } -module.exports.store = store \ No newline at end of file +module.exports.store = store; diff --git a/package-lock.json b/package-lock.json index a0d5349c..44d0802d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1538,6 +1538,12 @@ "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "dev": true + }, "acorn-walk": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", @@ -2097,6 +2103,31 @@ } } }, + "babel-eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, "babel-loader": { "version": "8.0.6", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", @@ -2814,8 +2845,7 @@ "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "optional": true + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "check-types": { "version": "8.0.3", @@ -2981,8 +3011,7 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "optional": true + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "clipboardy": { "version": "2.1.0", @@ -4150,6 +4179,12 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "deepmerge": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", @@ -4502,6 +4537,15 @@ "buffer-indexof": "^1.0.0" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -5131,6 +5175,249 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "eslint": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz", + "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "dev": true, + "requires": { + "type-fest": "^0.5.2" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "inquirer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "string-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.0" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "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 + } + } + }, + "eslint-config-prettier": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz", + "integrity": "sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz", + "integrity": "sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-vue": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.0.0.tgz", + "integrity": "sha512-+LxTJCd6nDt+AKQ1X+ySD48xJHft8OkeQmAhiq6UoAMxRFTiEKIDusiGgEUJLwKyiwGUGWbbqEbbWvupH5TSjg==", + "dev": true, + "requires": { + "vue-eslint-parser": "^6.0.4" + } + }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", @@ -5141,11 +5428,54 @@ "estraverse": "^4.1.1" } }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "dev": true, + "requires": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true + } + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", @@ -5384,7 +5714,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "optional": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -5496,6 +5825,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -5515,6 +5850,12 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", @@ -5554,6 +5895,15 @@ "escape-string-regexp": "^1.0.5" } }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "file-loader": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", @@ -5663,6 +6013,34 @@ "locate-path": "^2.0.0" } }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "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", @@ -5795,7 +6173,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -5816,12 +6195,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5836,17 +6217,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5963,7 +6347,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5975,6 +6360,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5989,6 +6375,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5996,12 +6383,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -6020,6 +6409,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -6100,7 +6490,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -6112,6 +6503,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -6197,7 +6589,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -6233,6 +6626,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6252,6 +6646,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6295,12 +6690,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -6310,6 +6707,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -7330,8 +7733,7 @@ "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "optional": true + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-regex": { "version": "1.0.4", @@ -7513,6 +7915,12 @@ "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.1.tgz", "integrity": "sha512-IqUK+Cqc8/MqHsCvv1TMccbKdBzoATOLHXZAF5UDu70/CCxo648cHUig24hc+XTK53TyeNk1UeVTlc2Haovtsw==" }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -7675,6 +8083,16 @@ } } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -8329,6 +8747,12 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -8688,6 +9112,20 @@ "is-wsl": "^1.1.0" } }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "ora": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", @@ -8731,8 +9169,7 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "optional": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-cancelable": { "version": "1.1.0", @@ -8842,6 +9279,23 @@ "no-case": "^2.2.0" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-asn1": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", @@ -9601,6 +10055,12 @@ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -9613,6 +10073,15 @@ "integrity": "sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==", "dev": true }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-bytes": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", @@ -9651,6 +10120,12 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "progress-stream": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", @@ -10135,6 +10610,12 @@ "define-properties": "^1.1.2" } }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "regexpu-core": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", @@ -10443,7 +10924,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "optional": true, "requires": { "is-promise": "^2.1.0" } @@ -10461,7 +10941,6 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", - "optional": true, "requires": { "tslib": "^1.9.0" } @@ -11465,6 +11944,43 @@ "util.promisify": "~1.0.0" } }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "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" + } + }, + "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" + } + } + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -11603,6 +12119,12 @@ } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "thenify": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", @@ -11641,8 +12163,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "optional": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.5", @@ -11679,7 +12200,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "optional": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -11827,6 +12347,15 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", @@ -12206,6 +12735,12 @@ "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", "dev": true }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -12251,6 +12786,33 @@ "integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==", "dev": true }, + "vue-eslint-parser": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-6.0.5.tgz", + "integrity": "sha512-Bvjlx7rH1Ulvus56KHeLXOjEi3JMOYTa1GAqZr9lBQhd8weK8mV7U7V2l85yokBZEWHJQjLn6X3nosY8TzkOKg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^4.0.0", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.0", + "esquery": "^1.0.1", + "lodash": "^4.17.11" + }, + "dependencies": { + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + } + } + }, "vue-hot-reload-api": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", @@ -12696,6 +13258,12 @@ "string-width": "^2.1.1" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -12758,6 +13326,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, "write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", diff --git a/package.json b/package.json index 76e44c4c..2ca437a4 100644 --- a/package.json +++ b/package.json @@ -34,9 +34,14 @@ "@vue/cli-plugin-babel": "^3.11.0", "@vue/cli-service": "^3.11.0", "axios": "^0.19.0", + "babel-eslint": "^10.0.3", "css-loader": "^3.2.0", "electron": "^6.0.10", "electron-builder": "^21.2.0", + "eslint": "^6.6.0", + "eslint-config-prettier": "^6.5.0", + "eslint-plugin-prettier": "^3.1.1", + "eslint-plugin-vue": "^6.0.0", "less": "^3.10.3", "less-loader": "^5.0.0", "mdns-js": "^1.0.3", @@ -58,4 +63,4 @@ "last 2 versions", "not ie <= 8" ] -} +} \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index 4bc91a3e..faf10b8b 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,57 +1,55 @@ diff --git a/src/assets/less/app.less b/src/assets/less/app.less index 008ee44f..f762eda0 100644 --- a/src/assets/less/app.less +++ b/src/assets/less/app.less @@ -1,14 +1,15 @@ // Theming specific to the electron app .menubar-menu-container { - box-shadow: 0.5px 1px 4px 0px rgba(0,0,0,0.3) !important; + box-shadow: 0.5px 1px 4px 0px rgba(0, 0, 0, 0.3) !important; } -.menubar-menu-container > * { - box-shadow: none !important; +.menubar-menu-container>* { + box-shadow: none !important; } -.menubar-menu-container .action-menu-item, .menubar-menu-container .action-label { +.menubar-menu-container .action-menu-item, +.menubar-menu-container .action-label { cursor: default } diff --git a/src/assets/less/highlight.less b/src/assets/less/highlight.less index 9cf76fdd..0dc5923d 100644 --- a/src/assets/less/highlight.less +++ b/src/assets/less/highlight.less @@ -8,35 +8,49 @@ } .hljs-comment, -.hljs-meta { color: #969896; } +.hljs-meta { + color: #969896; +} .hljs-string, .hljs-variable, .hljs-template-variable, .hljs-strong, .hljs-emphasis, -.hljs-quote { color: @global-danger-background; } +.hljs-quote { + color: @global-danger-background; +} .hljs-keyword, .hljs-selector-tag, -.hljs-type { color: #1f34aa; } +.hljs-type { + color: #1f34aa; +} .hljs-literal, .hljs-symbol, .hljs-bullet, -.hljs-attribute { color: #0086b3; } +.hljs-attribute { + color: #0086b3; +} .hljs-section, -.hljs-name { color: #63a35c; } +.hljs-name { + color: #63a35c; +} -.hljs-tag { color: #333; } +.hljs-tag { + color: #333; +} .hljs-title, .hljs-attr, .hljs-selector-id, .hljs-selector-class, .hljs-selector-attr, -.hljs-selector-pseudo { color: #795da3; } +.hljs-selector-pseudo { + color: #795da3; +} .hljs-addition { color: #55a532; @@ -48,4 +62,6 @@ background-color: #ffecec; } -.hljs-link { text-decoration: underline; } \ No newline at end of file +.hljs-link { + text-decoration: underline; +} \ No newline at end of file diff --git a/src/assets/less/theme.less b/src/assets/less/theme.less index f71e96ee..07601789 100644 --- a/src/assets/less/theme.less +++ b/src/assets/less/theme.less @@ -15,31 +15,31 @@ // UIkit // ======================================================================== -@global-font-family: ProximaNova, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; -@global-font-size: 14px; +@global-font-family: ProximaNova, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; +@global-font-size: 14px; -@global-xxlarge-font-size: 38px; -@global-xlarge-font-size: 30px; -@global-large-font-size: 24px; -@global-medium-font-size: 20px; -@global-small-font-size: 14px; +@global-xxlarge-font-size: 38px; +@global-xlarge-font-size: 30px; +@global-large-font-size: 24px; +@global-medium-font-size: 20px; +@global-small-font-size: 14px; -@global-emphasis-color: #222; +@global-emphasis-color: #222; // // Base // -@base-code-font-family: 'Roboto Mono', monospace; -@base-code-font-size: 12px; +@base-code-font-family: 'Roboto Mono', monospace; +@base-code-font-size: 12px; -@base-heading-font-weight: 300; +@base-heading-font-weight: 300; -@base-pre-font-size: 12px; -@base-pre-padding: 25px; -@base-pre-background: @global-muted-background; -@base-pre-border-width: 0; -@base-pre-border-radius: 0; +@base-pre-font-size: 12px; +@base-pre-padding: 25px; +@base-pre-background: @global-muted-background; +@base-pre-border-width: 0; +@base-pre-border-radius: 0; .hook-base-body() { -webkit-font-smoothing: antialiased; @@ -51,96 +51,103 @@ // Container // -@container-max-width: 1380px; -@container-small-max-width: 650px; +@container-max-width: 1380px; +@container-small-max-width: 650px; // // Navbar // -@inverse-navbar-nav-item-color: @inverse-global-color; -@inverse-navbar-nav-item-hover-color: @inverse-global-emphasis-color; +@inverse-navbar-nav-item-color: @inverse-global-color; +@inverse-navbar-nav-item-hover-color: @inverse-global-emphasis-color; // // Nav // -@nav-header-font-size: 12px; +@nav-header-font-size: 12px; // // Subnav // -@inverse-subnav-item-color: @inverse-global-color; -@inverse-subnav-item-hover-color: @inverse-global-emphasis-color; +@inverse-subnav-item-color: @inverse-global-color; +@inverse-subnav-item-hover-color: @inverse-global-emphasis-color; // // Tab // -@tab-item-padding-horizontal: 10px; -@tab-item-padding-vertical: 9px; -@tab-item-border-width: 2px; -@tab-item-font-size: 12px; +@tab-item-padding-horizontal: 10px; +@tab-item-padding-vertical: 9px; +@tab-item-border-width: 2px; +@tab-item-font-size: 12px; -.hook-tab-item() { line-height: 20px; } +.hook-tab-item() { + line-height: 20px; +} // // Table // -@table-header-cell-font-size: 12px; +@table-header-cell-font-size: 12px; // // Label // -@label-font-size: 12px; +@label-font-size: 12px; // // Text // -.hook-text-lead() { font-weight: 300; } -.hook-text-large() { font-weight: 300; } +.hook-text-lead() { + font-weight: 300; +} + +.hook-text-large() { + font-weight: 300; +} // // Utility // -@inverse-logo-color: @inverse-global-emphasis-color; -@inverse-logo-hover-color: @inverse-global-emphasis-color; +@inverse-logo-color: @inverse-global-emphasis-color; +@inverse-logo-hover-color: @inverse-global-emphasis-color; // // Off-canvas // -@offcanvas-bar-background: #fff; -@offcanvas-bar-color-mode: dark; +@offcanvas-bar-background: #fff; +@offcanvas-bar-color-mode: dark; // // Inverse // -@inverse-global-color: fade(@global-inverse-color, 80%); -@inverse-global-muted-color: fade(@global-inverse-color, 60%); +@inverse-global-color: fade(@global-inverse-color, 80%); +@inverse-global-muted-color: fade(@global-inverse-color, 60%); // // Paper // -@paper-border-radius: 4px; +@paper-border-radius: 4px; /* ======================================================================== Theme ========================================================================== */ -@sidebar-left-width: 240px; -@sidebar-left-width-xl: 300px; +@sidebar-left-width: 240px; +@sidebar-left-width-xl: 300px; -@sidebar-right-width: 200px; -@sidebar-right-left: 0px; -@sidebar-right-left-xl: 60px; +@sidebar-right-width: 200px; +@sidebar-right-left: 0px; +@sidebar-right-left-xl: 60px; @@ -152,11 +159,11 @@ */ // Line Mode -@navbar-nav-item-line-margin-vertical: 20px; -@navbar-nav-item-line-margin-horizontal: @navbar-nav-item-padding-horizontal; -@navbar-nav-item-line-height: 1px; -@navbar-nav-item-line-background: currentColor; -@navbar-nav-item-line-transition-duration: 0.3s; +@navbar-nav-item-line-margin-vertical: 20px; +@navbar-nav-item-line-margin-horizontal: @navbar-nav-item-padding-horizontal; +@navbar-nav-item-line-height: 1px; +@navbar-nav-item-line-background: currentColor; +@navbar-nav-item-line-transition-duration: 0.3s; .uk-navbar-dropdown.uk-open { border-radius: @paper-border-radius; @@ -168,7 +175,7 @@ .uk-card { border-radius: @paper-border-radius; - border: 1px solid rgba(180, 180, 180, 0.25); + border: 1px solid rgba(180, 180, 180, 0.25); } .uk-card-media-top img { @@ -176,14 +183,15 @@ } .uk-card-default .uk-card-footer { - border-top: 1px solid rgba(180, 180, 180, 0.25); + border-top: 1px solid rgba(180, 180, 180, 0.25); } .uk-card-primary .uk-card-footer { - border-top: 1px solid rgba(0, 0, 0, 0.075); + border-top: 1px solid rgba(0, 0, 0, 0.075); } .hook-inverse() { + // Override background colour in dark mode .uk-card-default { background-color: #2a2a2a !important; @@ -228,16 +236,22 @@ /* * Links */ -.uk-link, .uk-button-link { +.uk-link, +.uk-button-link { color: @global-muted-color; } -.uk-link:hover, .uk-button-link:hover, a:hover { +.uk-link:hover, +.uk-button-link:hover, +a:hover { color: @global-primary-background; } .hook-inverse() { - .uk-link:hover, .uk-button-link:hover, a:hover { + + .uk-link:hover, + .uk-button-link:hover, + a:hover { color: @inverse-primary-muted-color; } } @@ -256,7 +270,7 @@ } .hook-inverse() { - .uk-button-primary{ + .uk-button-primary { background-color: rgba(180, 180, 180, 0.15); color: @inverse-primary-muted-color; border-color: @inverse-primary-muted-color; @@ -268,7 +282,8 @@ } } -.uk-icon-button, .uk-icon-button:hover { +.uk-icon-button, +.uk-icon-button:hover { text-decoration: none } @@ -296,7 +311,7 @@ background-color: #333; } -.uk-open > .uk-accordion-title::before { +.uk-open>.uk-accordion-title::before { mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); mask-position: 100% 50%; background-image: none; diff --git a/src/components/controlComponents/paneCapture.vue b/src/components/controlComponents/paneCapture.vue index ec607da1..0148965a 100644 --- a/src/components/controlComponents/paneCapture.vue +++ b/src/components/controlComponents/paneCapture.vue @@ -1,30 +1,70 @@ \ No newline at end of file + diff --git a/src/components/controlComponents/paneNavigate.vue b/src/components/controlComponents/paneNavigate.vue index 82c00795..2c666f4e 100644 --- a/src/components/controlComponents/paneNavigate.vue +++ b/src/components/controlComponents/paneNavigate.vue @@ -1,98 +1,144 @@ \ No newline at end of file +}; + diff --git a/src/components/controlComponents/panePlugins.vue b/src/components/controlComponents/panePlugins.vue index ff116986..6c82d3ad 100644 --- a/src/components/controlComponents/panePlugins.vue +++ b/src/components/controlComponents/panePlugins.vue @@ -1,17 +1,17 @@ - + diff --git a/src/components/controlComponents/paneSettings.vue b/src/components/controlComponents/paneSettings.vue index 63868b26..ca8fd408 100644 --- a/src/components/controlComponents/paneSettings.vue +++ b/src/components/controlComponents/paneSettings.vue @@ -1,38 +1,35 @@ - + diff --git a/src/components/controlComponents/paneStatus.vue b/src/components/controlComponents/paneStatus.vue index 293a491b..bf19c936 100644 --- a/src/components/controlComponents/paneStatus.vue +++ b/src/components/controlComponents/paneStatus.vue @@ -1,70 +1,71 @@ - + diff --git a/src/components/controlComponents/settingsComponents/appSettings.vue b/src/components/controlComponents/settingsComponents/appSettings.vue index 5b366fc0..55e8fd37 100644 --- a/src/components/controlComponents/settingsComponents/appSettings.vue +++ b/src/components/controlComponents/settingsComponents/appSettings.vue @@ -1,31 +1,21 @@ - + diff --git a/src/components/controlComponents/settingsComponents/cameraSettings.vue b/src/components/controlComponents/settingsComponents/cameraSettings.vue index c4b2b695..fe86864d 100644 --- a/src/components/controlComponents/settingsComponents/cameraSettings.vue +++ b/src/components/controlComponents/settingsComponents/cameraSettings.vue @@ -1,138 +1,181 @@ diff --git a/src/components/controlComponents/settingsComponents/microscopeSettings.vue b/src/components/controlComponents/settingsComponents/microscopeSettings.vue index 282f8a75..7544e28c 100644 --- a/src/components/controlComponents/settingsComponents/microscopeSettings.vue +++ b/src/components/controlComponents/settingsComponents/microscopeSettings.vue @@ -1,108 +1,133 @@ diff --git a/src/components/controlComponents/settingsComponents/streamSettings.vue b/src/components/controlComponents/settingsComponents/streamSettings.vue index b6459f52..45cd987e 100644 --- a/src/components/controlComponents/settingsComponents/streamSettings.vue +++ b/src/components/controlComponents/settingsComponents/streamSettings.vue @@ -1,34 +1,49 @@ - + diff --git a/src/components/fieldComponents/checkList.vue b/src/components/fieldComponents/checkList.vue index acd26e39..dc8749f3 100644 --- a/src/components/fieldComponents/checkList.vue +++ b/src/components/fieldComponents/checkList.vue @@ -1,52 +1,66 @@ - \ No newline at end of file + diff --git a/src/components/fieldComponents/htmlBlock.vue b/src/components/fieldComponents/htmlBlock.vue index 2b4906c0..f28b65e4 100644 --- a/src/components/fieldComponents/htmlBlock.vue +++ b/src/components/fieldComponents/htmlBlock.vue @@ -6,14 +6,23 @@ - \ No newline at end of file + diff --git a/src/components/fieldComponents/keyvalList.vue b/src/components/fieldComponents/keyvalList.vue index c72e7f84..5933b11c 100644 --- a/src/components/fieldComponents/keyvalList.vue +++ b/src/components/fieldComponents/keyvalList.vue @@ -2,83 +2,117 @@
-
-
-
+
+
+ +
+
+ +
- - add_circle + add_circle
-
+
- +
- delete + delete
-
- \ No newline at end of file + diff --git a/src/components/fieldComponents/labelInput.vue b/src/components/fieldComponents/labelInput.vue index 0011d572..5fc4a553 100644 --- a/src/components/fieldComponents/labelInput.vue +++ b/src/components/fieldComponents/labelInput.vue @@ -1,58 +1,65 @@ - \ No newline at end of file + diff --git a/src/components/fieldComponents/numberInput.vue b/src/components/fieldComponents/numberInput.vue index 57961726..7517ce6e 100644 --- a/src/components/fieldComponents/numberInput.vue +++ b/src/components/fieldComponents/numberInput.vue @@ -1,33 +1,41 @@ - \ No newline at end of file + diff --git a/src/components/fieldComponents/radioList.vue b/src/components/fieldComponents/radioList.vue index 67b8dcb6..e975d6fb 100644 --- a/src/components/fieldComponents/radioList.vue +++ b/src/components/fieldComponents/radioList.vue @@ -1,29 +1,48 @@ - \ No newline at end of file + diff --git a/src/components/fieldComponents/selectList.vue b/src/components/fieldComponents/selectList.vue index 6009767c..f9272515 100644 --- a/src/components/fieldComponents/selectList.vue +++ b/src/components/fieldComponents/selectList.vue @@ -1,33 +1,42 @@ - \ No newline at end of file + diff --git a/src/components/fieldComponents/tagList.vue b/src/components/fieldComponents/tagList.vue index 59f27534..28aa065e 100644 --- a/src/components/fieldComponents/tagList.vue +++ b/src/components/fieldComponents/tagList.vue @@ -1,63 +1,79 @@ - \ No newline at end of file + diff --git a/src/components/fieldComponents/textInput.vue b/src/components/fieldComponents/textInput.vue index b001f18d..bb222ea3 100644 --- a/src/components/fieldComponents/textInput.vue +++ b/src/components/fieldComponents/textInput.vue @@ -1,30 +1,41 @@ - \ No newline at end of file + diff --git a/src/components/genericComponents/progressBar.vue b/src/components/genericComponents/progressBar.vue index 6cd3e95d..783e2816 100644 --- a/src/components/genericComponents/progressBar.vue +++ b/src/components/genericComponents/progressBar.vue @@ -1,38 +1,37 @@ \ No newline at end of file + diff --git a/src/components/genericComponents/tabContent.vue b/src/components/genericComponents/tabContent.vue index bcdef3d7..ab0021b3 100644 --- a/src/components/genericComponents/tabContent.vue +++ b/src/components/genericComponents/tabContent.vue @@ -1,36 +1,36 @@ \ No newline at end of file + diff --git a/src/components/genericComponents/tabIcon.vue b/src/components/genericComponents/tabIcon.vue index 0c0bbc18..7c7014c4 100644 --- a/src/components/genericComponents/tabIcon.vue +++ b/src/components/genericComponents/tabIcon.vue @@ -1,48 +1,51 @@ \ No newline at end of file + diff --git a/src/components/genericComponents/taskProgress.vue b/src/components/genericComponents/taskProgress.vue index 9d2b67ea..1c6834f3 100644 --- a/src/components/genericComponents/taskProgress.vue +++ b/src/components/genericComponents/taskProgress.vue @@ -1,21 +1,31 @@ \ No newline at end of file + diff --git a/src/components/genericComponents/taskSubmitter.vue b/src/components/genericComponents/taskSubmitter.vue index 11e5c74c..5e02ab19 100644 --- a/src/components/genericComponents/taskSubmitter.vue +++ b/src/components/genericComponents/taskSubmitter.vue @@ -1,25 +1,43 @@ \ No newline at end of file + diff --git a/src/components/panelLeft.vue b/src/components/panelLeft.vue index 67901cd6..2ee9d7b2 100644 --- a/src/components/panelLeft.vue +++ b/src/components/panelLeft.vue @@ -1,95 +1,147 @@ diff --git a/src/components/panelRight.vue b/src/components/panelRight.vue index 25f5c6dd..f1a75522 100644 --- a/src/components/panelRight.vue +++ b/src/components/panelRight.vue @@ -1,81 +1,98 @@ diff --git a/src/components/pluginComponents/JsonForm.vue b/src/components/pluginComponents/JsonForm.vue index 2648b809..8ab71505 100644 --- a/src/components/pluginComponents/JsonForm.vue +++ b/src/components/pluginComponents/JsonForm.vue @@ -1,68 +1,86 @@ \ No newline at end of file + diff --git a/src/components/viewComponents/connectComponents/hostCard.vue b/src/components/viewComponents/connectComponents/hostCard.vue index 48224053..ab716357 100644 --- a/src/components/viewComponents/connectComponents/hostCard.vue +++ b/src/components/viewComponents/connectComponents/hostCard.vue @@ -1,40 +1,62 @@ \ No newline at end of file + diff --git a/src/components/viewComponents/connectDisplay.vue b/src/components/viewComponents/connectDisplay.vue index 5ff0d75d..e8fe3f2b 100644 --- a/src/components/viewComponents/connectDisplay.vue +++ b/src/components/viewComponents/connectDisplay.vue @@ -1,26 +1,63 @@ diff --git a/src/components/viewComponents/galleryComponents/captureCard.vue b/src/components/viewComponents/galleryComponents/captureCard.vue index 541bba3a..d56b9aa7 100644 --- a/src/components/viewComponents/galleryComponents/captureCard.vue +++ b/src/components/viewComponents/galleryComponents/captureCard.vue @@ -1,86 +1,137 @@ diff --git a/src/components/viewComponents/galleryComponents/scanCard.vue b/src/components/viewComponents/galleryComponents/scanCard.vue index e4f8761c..bcc75794 100644 --- a/src/components/viewComponents/galleryComponents/scanCard.vue +++ b/src/components/viewComponents/galleryComponents/scanCard.vue @@ -1,54 +1,76 @@ diff --git a/src/components/viewComponents/galleryDisplay.vue b/src/components/viewComponents/galleryDisplay.vue index 9eac6205..cc371884 100644 --- a/src/components/viewComponents/galleryDisplay.vue +++ b/src/components/viewComponents/galleryDisplay.vue @@ -1,108 +1,255 @@ diff --git a/src/components/viewComponents/streamDisplay.vue b/src/components/viewComponents/streamDisplay.vue index f7c45815..d8d8b5ff 100644 --- a/src/components/viewComponents/streamDisplay.vue +++ b/src/components/viewComponents/streamDisplay.vue @@ -1,221 +1,246 @@ diff --git a/src/main.app.js b/src/main.app.js index 27d2b187..b29c1d3d 100644 --- a/src/main.app.js +++ b/src/main.app.js @@ -1,15 +1,15 @@ // Load settings store from main process -const { store } = require('electron').remote.require('./store') +const { store } = require("electron").remote.require("./store"); // Load extra modules we'll be using -const { Titlebar, Color } = require('custom-electron-titlebar'); +const { Titlebar, Color } = require("custom-electron-titlebar"); // Only show custom menubar if current window has no frame -if (store.get('drawCustomTitleBar') == true) { - new Titlebar({ - backgroundColor: Color.fromHex('#c5247f'), - icon: './titleicon.svg' - }); +if (store.get("drawCustomTitleBar") == true) { + new Titlebar({ + backgroundColor: Color.fromHex("#c5247f"), + icon: "./titleicon.svg" + }); } -console.log("Loaded main.app.js for electron-renderer functionality") \ No newline at end of file +console.log("Loaded main.app.js for electron-renderer functionality"); diff --git a/src/main.js b/src/main.js index a4e4129b..c12c17b5 100644 --- a/src/main.js +++ b/src/main.js @@ -1,43 +1,50 @@ -import Vue from 'vue' -import App from './App.vue' -import store from './store' +import Vue from "vue"; +import App from "./App.vue"; +import store from "./store"; -import UIkit from 'uikit'; +import UIkit from "uikit"; // Import MD icons -import 'material-design-icons/iconfont/material-icons.css' +import "material-design-icons/iconfont/material-icons.css"; -Vue.config.productionTip = false +Vue.config.productionTip = false; Vue.mixin({ methods: { modalConfirm: function(modalText) { - var context = this + var context = this; // Stop GPU preview to show modal - context.$root.$emit('globalTogglePreview', false) - + context.$root.$emit("globalTogglePreview", false); + var showModal = function(resolve, reject) { - UIkit.modal.confirm(modalText) - .then(function() { - resolve() - }, function () { - reject() - }) - .finally(function() { - // Reenable the GPU preview, if it was active before the modal - console.log("Re-enabling GPU preview") - if (context.$store.state.globalSettings.autoGpuPreview) { - console.log("Re-enabling preview") - context.$root.$emit('globalTogglePreview', true) - } - }) - } - return new Promise(showModal) + UIkit.modal + .confirm(modalText) + .then( + function() { + resolve(); + }, + function() { + reject(); + } + ) + .finally(function() { + // Reenable the GPU preview, if it was active before the modal + console.log("Re-enabling GPU preview"); + if (context.$store.state.globalSettings.autoGpuPreview) { + console.log("Re-enabling preview"); + context.$root.$emit("globalTogglePreview", true); + } + }); + }; + return new Promise(showModal); }, - modalNotify: function(message, status = 'success') { - UIkit.notification({message: message, status: status}) + modalNotify: function(message, status = "success") { + UIkit.notification({ + message: message, + status: status + }); }, modalDialog: function(title, message) { @@ -53,55 +60,57 @@ Vue.mixin({ }, modalError: function(error) { - console.log(error) - var errormsg = '' + console.log(error); + var errormsg = ""; // If a response was obtained if (error.response) { // If the response is a nicely formatted JSON response from the server if (error.response.data.message) { - errormsg = `${error.response.status}: ${error.response.data.message}` - console.log(errormsg) + errormsg = `${error.response.status}: ${error.response.data.message}`; + console.log(errormsg); } // If the response is just some generic error response else { - errormsg = `${error.response.status}: ${error.response.data}` - console.log(errormsg) + errormsg = `${error.response.status}: ${error.response.data}`; + console.log(errormsg); } - // If the error occured during the request + // If the error occured during the request } else if (error.request) { - errormsg = `${error.message}` - console.log(errormsg) - // Everything else + errormsg = `${error.message}`; + console.log(errormsg); + // Everything else } else { - errormsg = `${error.message}` - console.log(errormsg) + errormsg = `${error.message}`; + console.log(errormsg); } - this.$store.commit('setError', errormsg); - UIkit.notification({message: `${errormsg}`, status: 'danger'}) + this.$store.commit("setError", errormsg); + UIkit.notification({ + message: `${errormsg}`, + status: "danger" + }); }, getLocalStorageObj: function(keyName) { if (localStorage.getItem(keyName)) { try { - return JSON.parse(localStorage.getItem(keyName)) - } catch(e) { - console.log("Malformed entry. Removing from localStorage") - localStorage.removeItem(keyName) - return null + return JSON.parse(localStorage.getItem(keyName)); + } catch (e) { + console.log("Malformed entry. Removing from localStorage"); + localStorage.removeItem(keyName); + return null; } } }, setLocalStorageObj: function(keyName, object) { - const parsed = JSON.stringify(object) + const parsed = JSON.stringify(object); localStorage.setItem(keyName, parsed); } - } -}) +}); new Vue({ store, render: h => h(App) -}).$mount('#app') +}).$mount("#app"); diff --git a/src/modules/isElectron.js b/src/modules/isElectron.js index dce60deb..b5c3f513 100644 --- a/src/modules/isElectron.js +++ b/src/modules/isElectron.js @@ -1,20 +1,32 @@ function isElectron() { - // Renderer process - if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') { - return true; - } + // Renderer process + if ( + typeof window !== "undefined" && + typeof window.process === "object" && + window.process.type === "renderer" + ) { + return true; + } - // Main process - if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) { - return true; - } + // Main process + if ( + typeof process !== "undefined" && + typeof process.versions === "object" && + !!process.versions.electron + ) { + return true; + } - // Detect the user agent when the `nodeIntegration` option is set to true - if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) { - return true; - } + // Detect the user agent when the `nodeIntegration` option is set to true + if ( + typeof navigator === "object" && + typeof navigator.userAgent === "string" && + navigator.userAgent.indexOf("Electron") >= 0 + ) { + return true; + } - return false; + return false; } -export default isElectron; \ No newline at end of file +export default isElectron; diff --git a/src/store.js b/src/store.js index d959f08e..7d57c93d 100644 --- a/src/store.js +++ b/src/store.js @@ -1,18 +1,17 @@ -import Vue from 'vue' -import Vuex from 'vuex' -import axios from 'axios' +import Vue from "vue"; +import Vuex from "vuex"; +import axios from "axios"; -Vue.use(Vuex) +Vue.use(Vuex); export default new Vuex.Store({ - state: { - host: '', + host: "", port: 5000, - apiVer: 'v1', + apiVer: "v1", available: true, waiting: false, - error: '', + error: "", apiConfig: {}, apiState: {}, apiPlugins: [], @@ -25,13 +24,13 @@ export default new Vuex.Store({ }, mutations: { - changeHost(state, [host, port, apiVer='v1']) { + changeHost(state, [host, port, apiVer = "v1"]) { state.host = host; state.port = port; state.apiVer = apiVer; }, changeWaiting(state, waiting) { - state.waiting = waiting + state.waiting = waiting; }, commitConfig(state, configData) { state.apiConfig = configData; @@ -46,155 +45,158 @@ export default new Vuex.Store({ state.globalSettings[key] = value; }, resetState(state) { - state.waiting = false - state.available = true - state.error = null - state.apiConfig = {} - state.apiState = {} - state.apiPlugins = [] + state.waiting = false; + state.available = true; + state.error = null; + state.apiConfig = {}; + state.apiState = {}; + state.apiPlugins = []; }, setConnected(state) { - state.waiting = false - state.available = true + state.waiting = false; + state.available = true; }, setError(state, msg) { - state.waiting = false - state.available = false - state.error = msg + state.waiting = false; + state.available = false; + state.error = msg; } }, actions: { firstConnect(context) { // Reset the state when reconnecting starts - context.commit('resetState') + context.commit("resetState"); // Mark as loading - context.commit('changeWaiting', true) + context.commit("changeWaiting", true); var sendRequest = function(resolve, reject) { // Do requests - context.dispatch('updateConfig') - .then (() => context.dispatch('updateState')) - .then (() => context.dispatch('updatePlugins')) - .then (() => { - console.log("Finished first connect") - resolve() - }) - .catch(error => { - reject(error) - }) - } - return new Promise(sendRequest) + context + .dispatch("updateConfig") + .then(() => context.dispatch("updateState")) + .then(() => context.dispatch("updatePlugins")) + .then(() => { + console.log("Finished first connect"); + resolve(); + }) + .catch(error => { + reject(error); + }); + }; + return new Promise(sendRequest); }, - updateConfig(context, uri=`${context.getters.uri}/config`) { - console.log("Updating config") - context.commit('changeWaiting', true) - + updateConfig(context, uri = `${context.getters.uri}/config`) { + console.log("Updating config"); + context.commit("changeWaiting", true); + var sendRequest = function(resolve, reject) { - axios.get(uri) - .then(response => { - context.commit('commitConfig', response.data) - context.commit('setConnected') - console.log("Updating config finished") - resolve() - }) - .catch(error => { - reject(new Error(error)) - }) - } - return new Promise(sendRequest) + axios + .get(uri) + .then(response => { + context.commit("commitConfig", response.data); + context.commit("setConnected"); + console.log("Updating config finished"); + resolve(); + }) + .catch(error => { + reject(new Error(error)); + }); + }; + return new Promise(sendRequest); }, - updateState(context, uri=`${context.getters.uri}/state`) { - console.log("Updating state") - context.commit('changeWaiting', true) - + updateState(context, uri = `${context.getters.uri}/state`) { + console.log("Updating state"); + context.commit("changeWaiting", true); + var sendRequest = function(resolve, reject) { - axios.get(uri) - .then(response => { - context.commit('commitState', response.data) - context.commit('setConnected') - console.log("Updating state finished") - resolve() - }) - .catch(error => { - reject(new Error(error)) - }) - } - return new Promise(sendRequest) + axios + .get(uri) + .then(response => { + context.commit("commitState", response.data); + context.commit("setConnected"); + console.log("Updating state finished"); + resolve(); + }) + .catch(error => { + reject(new Error(error)); + }); + }; + return new Promise(sendRequest); }, - updatePlugins(context, uri=`${context.getters.uri}/plugin`) { - console.log("Updating plugins") - context.commit('changeWaiting', true) - + updatePlugins(context, uri = `${context.getters.uri}/plugin`) { + console.log("Updating plugins"); + context.commit("changeWaiting", true); + var sendRequest = function(resolve, reject) { - axios.get(uri) - .then(response => { - console.log("PLUGINS") - console.log(response.data) - context.commit('commitPlugins', response.data) - context.commit('setConnected') - console.log("Updating plugins finished") - resolve() - }) - .catch(error => { - reject(new Error(error)) - }) - } - return new Promise(sendRequest) + axios + .get(uri) + .then(response => { + console.log("PLUGINS"); + console.log(response.data); + context.commit("commitPlugins", response.data); + context.commit("setConnected"); + console.log("Updating plugins finished"); + resolve(); + }) + .catch(error => { + reject(new Error(error)); + }); + }; + return new Promise(sendRequest); }, pollTask(context, [taskId, timeout, interval]) { - var endTime = Number(new Date()) + (timeout*1000 || 30000); - interval = interval*1000 || 500; + var endTime = Number(new Date()) + (timeout * 1000 || 30000); + interval = interval * 1000 || 500; var checkCondition = function(resolve, reject) { - // If the condition is met, we're done! - axios.get(`${context.getters.uri}/task/${taskId}`) - .then(response => { - console.log(response.data.status) - var result = response.data.status + // If the condition is met, we're done! + axios.get(`${context.getters.uri}/task/${taskId}`).then(response => { + console.log(response.data.status); + var result = response.data.status; // If the task ends with success - if(result == 'success') { - resolve(response.data) + if (result == "success") { + resolve(response.data); } // If task ends with an error - else if (result == 'error') { + else if (result == "error") { // Pass the error string back with reject - reject(new Error(response.data.return)) + reject(new Error(response.data.return)); } // If task ends with termination - else if (result == 'terminated') { + else if (result == "terminated") { // Pass a generic termination error back with reject - reject(new Error("Task terminated")) + reject(new Error("Task terminated")); } // If task ends in any other way - else if (result != 'running') { + else if (result != "running") { // Pass status string as error - reject(new Error(result)) + reject(new Error(result)); } // If the condition isn't met but the timeout hasn't elapsed, go again else if (Number(new Date()) < endTime) { - setTimeout(checkCondition, interval, resolve, reject) + setTimeout(checkCondition, interval, resolve, reject); } // Didn't match and too much time, reject! else { - reject(new Error('Polling timed out')) + reject(new Error("Polling timed out")); } - }) - + }); }; return new Promise(checkCondition); - } }, getters: { uri: state => `http://${state.host}:${state.port}/api/${state.apiVer}`, - ready: state => ((state.available) && (Object.keys(state.apiConfig).length !== 0) && (Object.keys(state.apiState).length !== 0)) + ready: state => + state.available && + Object.keys(state.apiConfig).length !== 0 && + Object.keys(state.apiState).length !== 0 } - -}) +}); diff --git a/webpack.config.js b/webpack.config.js index a47d4971..99d6fd8b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,12 +1,12 @@ // this file is for cases where we need to access the // webpack config as a file when using CLI commands. -let service = process.VUE_CLI_SERVICE +let service = process.VUE_CLI_SERVICE; if (!service || process.env.VUE_CLI_API_MODE) { - const Service = require('@vue/cli-service/lib/Service') - service = new Service(process.env.VUE_CLI_CONTEXT || process.cwd()) - service.init(process.env.VUE_CLI_MODE || process.env.NODE_ENV) + const Service = require("@vue/cli-service/lib/Service"); + service = new Service(process.env.VUE_CLI_CONTEXT || process.cwd()); + service.init(process.env.VUE_CLI_MODE || process.env.NODE_ENV); } -module.exports = service.resolveWebpackConfig() +module.exports = service.resolveWebpackConfig();