diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..a36f44f --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,49 @@ +{ + "extends": "airbnb", + "globals": { + "window": true, + "document": true, + "fetch": true, + "btoa": true, + "atob": true, + "history": true, + "location": true, + "addEventListener": true + }, + "rules": { + "no-undef": "error", + "no-unused-vars": [2, { + "varsIgnorePattern": "h" + }], + "linebreak-style": "off", + "indent": ["error", 4], + + "react/jsx-indent": ["error", 4], + "react/jsx-indent-props": ["error", 4], + "react/no-unknown-property": "off", + "react/react-in-jsx-scope": 0, + "react/sort-comp": 0, + "react/require-render-return": 2, + "react/jsx-closing-bracket-location": 0, + "react/jsx-space-before-closing": 0, + "react/jsx-first-prop-new-line": 0, + "react/prop-types": 0, + "react/jsx-filename-extension": [1, {"extensions": [".js", ".jsx"]}], + "react/jsx-uses-vars": 2, + + "no-use-before-define": "off", + "jsx-quotes": "off", + "react/jsx-wrap-multilines": "off", + "implicit-arrow-linebreak": "off", + "arrow-parens": "off", + "semi": ["warn"], + "max-len": ["warn", 130], + "no-console": "off", + "no-extra-semi": "warn", + "import/no-dynamic-require": 0, + "import/no-extraneous-dependencies": 0, + "import/prefer-default-export": 0, + "strict": 0 + } + +} \ No newline at end of file diff --git a/client/src/index.html b/client/src/index.html index 9c1799c..220023e 100644 --- a/client/src/index.html +++ b/client/src/index.html @@ -1,132 +1,36 @@ - - - - + + + + - Turtle + Turtle - - + + - - + + - - + + - - - + + + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + diff --git a/client/src/js/actions/index.js b/client/src/js/actions/index.js index 8fe6e6b..dd4d6e6 100644 --- a/client/src/js/actions/index.js +++ b/client/src/js/actions/index.js @@ -21,7 +21,7 @@ const actions = { setSystemInfo: value => state => ({system_info: value}), - setBootScreenState: value => state => ({ showBootScreen: value }), + setSplashScreenState: value => state => ({ showSplashScreen: value }), setMode: value => state => save('', { mode: value }), settings: { diff --git a/client/src/js/app.js b/client/src/js/app.js index f80e7a5..2aa1cd9 100644 --- a/client/src/js/app.js +++ b/client/src/js/app.js @@ -1,17 +1,17 @@ -import { app } from 'hyperapp' -import actions from './actions' -import state from './state' -import view from './view' +import { app } from 'hyperapp'; +import actions from './actions'; +import state from './state'; +import view from './view'; -import { hyperlog } from "./utils/logger"; -import core from './core' +import { hyperlog } from './utils/logger'; +import core from './core'; const wiredActions = hyperlog(app)(state, actions, view, document.body); -document.onreadystatechange = function() { - if (document.readyState === "complete") { +document.onreadystatechange = () => { + if (document.readyState === 'complete') { wiredActions.restoreState(); - wiredActions.setBootScreenState(false); + wiredActions.setSplashScreenState(false); console.log(wiredActions); } }; @@ -23,3 +23,9 @@ core(wiredActions); // https://stackoverflow.com/a/50856621/1589989 // this is commented out since its prevents from moving thumb on mobile devices // window.addEventListener("touchmove", (event) => event.preventDefault(), {passive: false} ); + +window.oncontextmenu = (event) => { + event.preventDefault(); + event.stopPropagation(); + return false; +}; diff --git a/client/src/js/controller.js b/client/src/js/controller.js deleted file mode 100644 index 6416cd7..0000000 --- a/client/src/js/controller.js +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Controller is a master module in an application. - * It uses the Revealing Module Pattern - * https://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript -*/ - -const DEBUG = true; - -var controller = (function () { - /* - * PRIVATE area - */ - - /* - * called when main page is loaded and camera video should be displayed - */ - function mainPageLoaded() { - setTimeout(function() { - amplify.publish("controller->ui", "hide welcome screen"); - if (linux.getIsCameraAvailable() == true) amplify.publish("controller->ui", "change image source to camera"); - else amplify.publish("controller->ui", "change image source to default background"); - amplify.publish("controller->ui", "display camera video"); - }, 500); - } - - /* - * EVENTS triggers - */ - $(window).bind('beforeunload', function(){closePage();}); - - /* - * SUBSCRIBE to all topics - */ - amplify.subscribe("ui->controller", uiMessageCallback); - amplify.subscribe("linux->controller", linuxMessageCallback); - - /* - * CALLBACK functions - */ - function uiMessageCallback(message) { - if (DEBUG) console.log("uiMessageCallback: " + message); - if (DEBUG) amplify.publish("all->utests", message); - - switch(message) { - case "ui is ready for operation": - documentReadyCallback(); - break; - case "GO button is pressed": - mainPageLoaded(); - break; - default: - console.log("unknown command: " + message); - } - } - - function linuxMessageCallback(message) { - if (DEBUG) console.log("linuxMessageCallback: " + message); - - switch(message) { - case "communication established": - amplify.publish("controller->ui", "wait until GO button is pressed"); - break; - default: - console.log("unknown command: " + message); - } - } - - /* - * called when ui send ready message - */ - function documentReadyCallback() { - if (DEBUG) console.log("document ready callback"); - - // initialize multiple languages - amplify.publish("controller->ui", "initialize multilanguage"); - - // start python server - setTimeout(function () { - amplify.publish("controller->linux", "start python server"); - amplify.publish("controller->ui", "turtle is awake"); - }, 1500); - } - - /* - * called when page is unloaded - */ - function closePage() { - if (linux.getIsCameraAvailable()) - amplify.publish("controller->linux", "stop python server"); - } - - /* - * PUBLIC area - * Reveal public pointers to private functions and properties. - */ - return { - }; -})(); diff --git a/client/src/js/core/stream.js b/client/src/js/core/stream.js index 0344cbf..e7919c0 100644 --- a/client/src/js/core/stream.js +++ b/client/src/js/core/stream.js @@ -53,7 +53,7 @@ Stream.prototype.createPeerConnection = function() { this.peerConnection.ontrack = (event) => { console.log("[stream] remote stream added:", event.streams[0]); - let remoteVideoElement = document.getElementById('remote-video'); + let remoteVideoElement = document.getElementById('stream'); remoteVideoElement.srcObject = event.streams[0]; remoteVideoElement.play(); } @@ -199,7 +199,7 @@ Stream.prototype.error = function(event) { Stream.prototype.stop = function() { // stop_record(); - document.getElementById('remote-video').src = ''; + document.getElementById('stream').src = ''; this.close(); diff --git a/client/src/js/errors.js b/client/src/js/errors.js deleted file mode 100644 index 04491bb..0000000 --- a/client/src/js/errors.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * error handling for the whole application - * - * catch all errors using window object -*/ - -window.addEventListener('error', function(e){ - var error = e.error; - console.log("ERROR:\t" + error + "\tSTACK:\t" + error.stack); -}); \ No newline at end of file diff --git a/client/src/js/linux.js b/client/src/js/linux.js deleted file mode 100644 index a07d829..0000000 --- a/client/src/js/linux.js +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Linux class is responsible for all interaction between website and (linux) server itself - * It uses the Revealing Module Pattern - * https://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript -*/ - -var linux = (function () { - /* - * PRIVATE area - */ - var isCameraAvailable = false; - var serverProcessPID = -1; - var mjpegStreamPID = -1; - var communicationEstablished = false; - - /* - * start python server - * python server is responsible for all communication on the server side - */ - amplify.publish("linux->controller", "communication established"); - function startPythonServer() { - /* - * read screen resolution and choose video size from the following ones: - * 1280 x 720 - * 1024 x 768 - * 640 x 480 - * 320 x 240 - */ - var size = Math.max(window.screen.height, window.screen.width); - var res = "0x0"; - if (size > 1366) res = "1280x720"; - else if (size > 1152) res = "1024x768"; - else if (size > 800) res = "640x480"; - else res = "320x240"; - - if (DEBUG) console.log("Image resolution: " + res); - - $.get("server/starter.php", - { resolution: res }, - function(data) { - if (DEBUG) console.log("AJAX request sent"); - data = data.split("\r\n"); - - /* - * data received from the run_server.php - * 0 - amount of connected clients (only 1 at a time is allowed) - * 1 - python process pid - * 2 - mjpeg streamer process pid - */ - - // var numberOfClients = data[0]; - var numberOfClients = 0; - if (DEBUG) console.log("numberOfClients: " + numberOfClients); - - /* - * connect only if there is no more clients connected - * TODO: should be numberOfClients == 0. Does not work properly - */ - if (numberOfClients >= 0 || document.domain.includes("localhost")) { - serverProcessPID = -1; - mjpegStreamPID = -1; - // serverProcessPID = data[1]; - // mjpegStreamPID = data[2]; - // if the returned value is numeric (pid of the process) continue with camera - if ($.isNumeric(serverProcessPID) || $.isNumeric(mjpegStreamPID)) { - isCameraAvailable = true; - if (DEBUG) console.log("serverProcessPID: " + serverProcessPID); - if (DEBUG) console.log("mjpegStreamPID: " + mjpegStreamPID); - - // start webrtc streaming - amplify.publish("linux->webrtc", "start webrtc stream"); - - // start communication with webserver - setTimeout(function(){ - amplify.publish("linux->serverCommunication", "start communication on port 8080"); - }, 1000); - } - // otherwise display a notice and work with static image - else { - if (DEBUG) console.log("couldn't initialize python server"); - isCameraAvailable = false; - serverProcessPID = -1; - mjpegStreamPID = -1; - amplify.publish("all->ui", "notifications.server-connection-error"); - } - - communicationEstablished = true; - } - else amplify.publish("all->ui", "notifications.client-already-connected"); - }); - } - - /* - * stop python server when page is unloaded (controller.js -> closePage) - */ - function stopPythonServer() { - $.get("assets/python/server/close_server.php"); - } - - function retIsCameraAvailable() {return isCameraAvailable;} - function retServerProcessPID() {return serverProcessPID;} - - /* - * SUBSCRIBE to all topics - */ - amplify.subscribe("controller->linux", controllerMessageCallback); - amplify.subscribe("webrtc->linux", webrtcMessageCallback); - - /* - * CALLBACK functions - */ - function controllerMessageCallback(message) { - if (DEBUG) console.log("controllerMessageCallback: " + message); - - switch(message) { - case "start python server": - startPythonServer(); - break; - case "stop python server": - stopPythonServer(); - break; - default: - console.log("unknown command: " + message); - } - } - - function webrtcMessageCallback(message) { - if (DEBUG) console.log("webrtcMessageCallback: " + message); - - // switch(message) { - // case "camera stream is ready": - // // wait until communication channel is ready - // while (communicationEstablished == false && !document.domain.includes("localhost")) setTimeout(function() { }, 1000); - // // amplify.publish("linux->controller", "communication established"); - // break; - // default: - // console.log("unknown command: " + message); - // } - } - - - - /* - * PUBLIC area - * Reveal public pointers to private functions and properties. - */ - return { - getIsCameraAvailable : retIsCameraAvailable, - getServerProcessPID : retServerProcessPID - }; -})(); diff --git a/client/src/js/servercommunication.js b/client/src/js/servercommunication.js deleted file mode 100644 index 3e96351..0000000 --- a/client/src/js/servercommunication.js +++ /dev/null @@ -1,283 +0,0 @@ -/* - * controlCanvas is used for controlling Turtle - * It uses the Revealing Module Pattern - * https://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript - * - * For drawing and touch applications it uses CREATEJS set of libraries - * + EaselJS - * + TweenJS - * + SoundJS - * + PreloadJS - * http://www.createjs.com/docs - */ - -var serverCommunication = (function() { - /* - * PRIVATE area - */ - let sockets = window.turtle.sockets; - let utils = new window.turtle.utils(); - let frameBuilder = new window.turtle.frameBuilder(); - /* - * SUBSCRIBE to all topics - */ - amplify.subscribe("linux->serverCommunication", linuxMessageCallback); - - function linuxMessageCallback(message) { - if (DEBUG) console.log("linuxMessageCallback: " + message); - if (DEBUG) amplify.publish("all->utests", message); - - switch (message) { - case "start communication on port 8080": - connect8080(); - break; - default: - console.log("unknown command: " + message); - } - } - - /* - * defines how often new information is sent - */ - const INTERVAL = 100; - const BAT_INTERVAL = 2000; - - /* - * class for every new socket communication - */ - // function socket(ref, open, process) { - // this.socket = ref; // reference to connection - // this.isOpen = open; // indicates whether the connection is open or not - // this.pid = process; // process identifier indicates identifier of Python application. Should be killed while page leaving - // } - - /* - * connects with port 8080 - */ - function connect8080() { - console.log("Location hostname: " + location.hostname); - - /* - * subscribe to canvas topic - */ - amplify.subscribe("controlCanvas->port8080", canvasMessageCallback); - - function canvasMessageCallback(message) { - if (DEBUG) console.log("canvasMessageCallback: " + message); - if (DEBUG) amplify.publish("all->utests", message); - - switch (message) { - case "stop all motors": - stopMotors(); - break; - default: - console.log("unknown command: " + message); - } - }; - - amplify.subscribe("manipulator->port8080", manipulatorMessageCallback); - - function manipulatorMessageCallback(message) { - if (DEBUG) console.log("manipulatorMessageCallback: " + message); - if (DEBUG) amplify.publish("all->utests", message); - - switch (message) { - case "set new servo position": - setNewManiPosition(); - break; - default: - console.log("unknown command: " + message); - } - }; - - amplify.subscribe("ui->port8080", uiMessageCallback); - - function uiMessageCallback(message) { - if (DEBUG) console.log("uiMessageCallback: " + message); - if (DEBUG) amplify.publish("all->utests", message); - - switch (message) { - case "update camera settings": - updateCameraSettings(); - break; - case "set new gripper position": - setNewGripperPosition(); - break; - case "set new axis1 position": - case "set new axis2 position": - updateAxisPositions(); - break; - case "set new camera position": - setNewCameraPosition(); - break; - case "set new mani position": - setNewManiPosition(); - break; - default: - console.log("unknown command: " + message); - } - } - - // for 3G used service ngrok - // if (location.host == "bentos.eu.ngrok.io") - // var socket8080 = new socket(new WebSocket("ws://" + "bentossocket.eu.ngrok.io"), false, -1); - // else { - // var socket8080 = new socket(new WebSocket("ws://" + location.hostname + ":8080"), false, -1); - // } - // - // socket8080.socket.binaryType = "arraybuffer"; - - /* - * EVENT functions for socket - */ - if (sockets.io.connected) { - console.log("Connected with port 8080"); - amplify.publish("all->ui", "set last status done"); - amplify.publish("all->ui", "initialize camera..."); - } - - function updateAxisPositions() { - $("#mani-axis-1").val($("#axis1-slider-input").val()); - $("#mani-axis-2").val($("#axis2-slider-input").val()); - setNewManiPosition(); - } - /* - * set new position of servo - */ - function setNewManiPosition() { - //var newPosition = manipulator.getCurrentPosition(); - if (sockets.io.connected) { - /*var alphaValue = newPosition.alpha * 4; // in quarter of microseconds - var betaValue = newPosition.beta * 4;*/ - - var axis_1 = document.getElementById('axis1-slider-input').value; - var axis_2 = document.getElementById('axis2-slider-input').value; - - - let frame = frameBuilder.manipulator(axis_1, axis_2); - console.log(utils.arrayToHex(frameBuilder.motorsArr)); - sockets.sendManipulator(frame); - } - } - - function setNewGripperPosition() { - //var gripperPosition = manipulator.getGripperPosition(); - var gripperPosition = $("#gripper-slider-input").val(); - if (sockets.io.connected) { - let frame = frameBuilder.gripper(gripperPosition); - console.log(utils.arrayToHex(frameBuilder.gripperArr)); - sockets.sendGripper(frame); - } - } - - function setNewCameraPosition() { - var cameraPosition = $("#camera-slider-input").val(); - console.log("New camera position: " + cameraPosition); - if (sockets.io.connected) { - var buf = new ArrayBuffer(3); - var arr = new Uint8Array(buf); - - arr[0] = 0xA4; - arr[1] = (cameraPosition >> 8) & 0xFF; - arr[2] = cameraPosition & 0xFF; - - // socket8080.socket.send(buf); - } - } - - /* - * set all motors values - */ - function setMotors() { - if (sockets.io.connected) { - var motorsSpeed = controlCanvas.getMotorsSpeed(); - let frame = frameBuilder.motors(motorsSpeed); - console.log(utils.arrayToHex(frameBuilder.motorsArr)); - sockets.sendMotors(frame); - } else { - console.log("Connection not opened."); - } - } - - amplify.subscribe("controlkeyboard->servercommunication", setMotorKeyboard); - - function setMotorKeyboard(movement) { - if (sockets.io.connected) { - if (movement.type == "run") { - if (movement.speed <= 100 && movement.speed >= -100) { - let frame = frameBuilder.motorsKeyboard(movement); - sockets.sendMotors(frame); - // Convert to readable form - console.log(utils.arrayToHex(frameBuilder.motorsArr)); - } else { - clearInterval(movement.interval); - } - - } else if (movement.type == "stop") { - clearInterval(movement.interval); - stopMotors(); - } - } else { - console.log("Connection not opened."); - } - } - - /* - * stop all motors immediately - */ - function stopMotors() { - if (sockets.io.connected) { - var buf = new ArrayBuffer(4); - var arr = new Uint8Array(buf); - - // command to send - arr[0] = 0; - arr[1] = 0; - arr[2] = 0; - arr[3] = 0; - console.log("Halt!", buf); - sockets.sendMotors(buf); - } else console.log("Connection not opened."); - } - - - /* - * update all camera settings - */ - function updateCameraSettings() { - if (sockets.io.connected) { - var buf = new ArrayBuffer(9); - var arr = new Uint8Array(buf); - arr[0] = 0x50; - arr[1] = $("#brightness-slider-input").val(); - arr[2] = $("#contrast-slider-input").val(); - arr[3] = $("#saturation-slider-input").val(); - arr[4] = $("#hue-slider-input").val(); - arr[5] = ($("#gamma-slider-input").val() & 0xFF00) >> 8; - arr[6] = $("#gamma-slider-input").val() & 0x00FF; - arr[7] = $("#gain-slider-input").val(); - arr[8] = $("#sharpness-slider-input").val(); - - // socket8080.socket.send(buf); - - // Convert to readable form - var hex = ''; - for (var i = 0; i < arr.length; i++) - hex += ('00' + arr[i].toString(16)).substr(-2); - - if (DEBUG) console.log("Binary message sent. " + hex); - } else console.log("Connection not opened."); - } - - /* - * set interval to update motor values - * take care to not overload CPU - */ - setInterval(function() { - if (sockets.io.connected && controlCanvas.isCoordinatesClicked()) - setMotors(); - }, INTERVAL); - - - } -})(); diff --git a/client/src/js/state/index.js b/client/src/js/state/index.js index 024bd2f..a7fee64 100644 --- a/client/src/js/state/index.js +++ b/client/src/js/state/index.js @@ -6,7 +6,7 @@ let state = { video_devices: [], }, - showBootScreen: true, + showSplashScreen: true, mode: 'drive', manipulator: { axis1: { diff --git a/client/src/js/ui.js b/client/src/js/ui.js deleted file mode 100644 index 6cacdb2..0000000 --- a/client/src/js/ui.js +++ /dev/null @@ -1,672 +0,0 @@ -/* - * UI is responsible for all interactions User <-> Application - * It uses the Revealing Module Pattern - * https://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript - */ - -var ui = (function() { - /* - * PRIVATE area - */ - - /* - * INTERFACE functions - */ - function updateInterface() { - /* set width of right navigation div */ - $('#right-navigation-div').css("height", $('#right-navigation-div').width() + 0.03 * $(window).height()); - } - - updateInterface(); - - window.addEventListener('resize', function(event) { - updateInterface(); - }); - - /* - * obvious stupid function - */ - function isInternetExplorer() { - var ua = window.navigator.userAgent; - var msie = ua.indexOf("MSIE "); - var trident = ua.indexOf('Trident/'); - - return (msie > 0 || trident > 0); - } - - /* - * saves the date of loading the session - used for timer - */ - var startTime = new Date(); - setInterval(function() { - updateSessionTimer() - }, 1000); - - function updateSessionTimer() { - var time = new Date(); - var diff = time - startTime; - diff = Math.round(diff / 1000); // change from milliseconds to seconds - var minutes = Math.floor(diff / 60); - var seconds = diff - minutes * 60; - - // add leading 0 to the string - function pad(n) { - return (n < 10) ? ("0" + n) : n; - } - - $('#session-time-h1').text(pad(String(minutes)) + ":" + pad(String(seconds))); - }; - - function advancedInterfaceChanged() { - if ($("#advanced-interface-button").prop('checked') == false) { - Cookies.set("advanced-interface", false); - $(".advanced-interface").fadeIn(); - } else { - Cookies.set("advanced-interface", true); - $(".advanced-interface").fadeOut(); - } - }; - - /*function photographyChanged() { - if($("#photography-button").prop('checked') == false) { - Cookies.set("photography", false); - } - else { - Cookies.set("photography", true); - } - }*/ - - /* - * run popup window with shellinabox - */ - function consoleButtonClicked() { - // run shellbox - message = ""; - $('#banner').trigger("click"); - vex.dialog.alert({ - unsafeMessage: message - }) - }; - - /* - * MULTILANGUAGE - */ - - function languageChanged(lng) { - var newLanguage = lng; - console.log("new language: " + newLanguage); - - // set cookie for the next visit - Cookies.set("language", newLanguage); - - // change displayed language - newLanguage = newLanguage.toLowerCase(); - setLanguage(newLanguage); - } - - /* - * display language selector - user can choose user interface language - */ - function displayLanguageSelector() { - /* - * read language used in previous session - * if undefined set to English - */ - - // var previousSessionLanguage = Cookies.get("language"); - // if (previousSessionLanguage == undefined) previousSessionLanguage = "US"; - - // $("#languageSelector").attr({ - // "data-selected-country": previousSessionLanguage - // }); - // - // $("#languageSelector").flagStrap({ - // countries: { - // "PL": "Poland", - // "US": "United States", - // "DE": "Germany" - // }, - // buttonSize: "btn-sm", - // buttonType: "btn-info", - // labelMargin: "10px", - // scrollable: false, - // scrollableHeight: "350px" - // }); - // var lng = $("#languageSelector select option:selected").val(); - // console.log("interface language: " + lng); - // return lng; - } - - /* - * set displayed language - */ - function setLanguage(lng) { - i18next.init({ - "debug": false, - "lng": lng, - "fallbackLng": false, - "backend": { - "loadPath": "locales/{{lng}}.json" - } - }, function(err, t) { - // initialized and ready to go! - if (DEBUG) console.log("Initialized: " + i18next.t('my-button')); - - // translate all elements with class 'localised' - $(".localised").each(function(index) { - var id = $(this).attr('id'); - $(this).text(i18next.t(id)); - }); - }); - } - - /* - * initialize i18next, load JSON translations and change displayed language - */ - function initializeMultilanguage() { - // display selector and read last used language (from cookies) - var lng = String(displayLanguageSelector()).toLowerCase(); - - i18next.use(window.i18nextXHRBackend); - setLanguage(lng); - } - - /* - * OTHER - */ - /* - * send any type of data to the controller module - */ - function sendMessageToController(message) { - amplify.publish("ui->controller", message); - } - - /* - * set the source of an image depending on connection status - */ - function setCameraBackground(camera) { - /* if (camera && isInternetExplorer()) { - setInterval(function (){ - time = new Date(); - $("#camera-video-img").attr("src", "http://192.168.10.1:8090/?action=snapshot&time="+ time.getTime()); - }, 100); - } - else if (camera) $("#camera-video-img").attr("src", "http://192.168.10.1:8090/?action=stream"); - else $("#camera-video-img").attr("src", "assets/img/marsyard-camera.jpg"); - if (camera) { - // rotate camera - var deg = 0; - var rotate = 'rotate(' + deg + 'deg)'; - $("#camera-video-img").each(function () { - $(this).css({ - '-webkit-transform': rotate, - '-moz-transform': rotate, - '-o-transform': rotate, - '-ms-transform': rotate, - 'transform': rotate - }); - }); - } */ - } - - /* - * hide welcome screen is called when page is already loaded - */ - function hideWelcomeScreen() { - $(".inner").fadeOut("slow"); - } - - function displayCameraVideo() { - $("#camera-video").fadeIn(); - $("#navigation-ring-div").fadeIn(); - - $(".alt").fadeIn(); - $(".footer").fadeIn(); - - // hide some elements if interface in advanced mode - if ($("#advanced-interface-button").prop('checked') == true) $(".advanced-interface").hide(); - - updateInterface(); - } - - /* - * display welcome screen - */ - function displayWelocmeScreen() { - $("#go-button").fadeIn(); - } - - /* - * switch to fullscreen mode - */ - function toggleFullScreen() { - // for internet explorer use body as full screen, not the document - if (isInternetExplorer()) $('.landing').toggleFullScreen(); - else $(document).toggleFullScreen(); - } - - /* - * take schreenshot of the view and prompt to save - */ - function takeScreenShot() { - /*html2canvas(document.body, { - onrendered: function (canvas) { - console.log("saved as image"); - canvas.toBlob(function(blob) { - saveAs(blob, "snap.png"); - }); - } - });*/ - var video = document.getElementById('camera-video-img'); - var canvas = document.getElementById('snap-background-canvas'); - var context = canvas.getContext('2d'); - canvas.width = video.clientWidth; - canvas.height = video.clientHeight; - - context.drawImage(video, 0, 0, video.clientWidth, video.clientHeight); - - /* - * draw also turtle logo - */ - var img = new Image; - - /*canvas.toBlob(function(blob) { - saveAs(blob, "turtle_snap.png"); - });*/ - - img.src = 'assets/img/hud/turtle-logo.png'; - - - var logoWidth = video.clientWidth / 12; - var logoHeight = logoWidth * 0.265; - context.drawImage(img, 25, 10, logoWidth, logoHeight); - var d = new Date(); - var link = document.getElementById('snap-download-a'); - link.href = canvas.toDataURL(); - link.download = "turtle_" + d.getFullYear() + "_" + d.getMonth() + 1 + "_" + d.getDate() + "_" + d.getHours() + "_" + d.getMinutes() + "_" + d.getSeconds() + ".png"; - } - - function recordVideo() { - amplify.publish("ui->webrtc", "start stop recording"); - } - - /* - * full screen mode has been changed - */ - function changedFullScreen() { - if ($(document).fullScreen()) { - //$("#full-screen-button-img").attr("src", "assets/img/navigation/fullscreen-exit.png"); - } else { - //$("#full-screen-button-img").attr("src", "assets/img/navigation/fullscreen.png"); - } - } - - /* - * show or hide side menu - */ - function showHideMenu(pointer) { - if (pointer.is(":visible")) { - setTimeout(function() { - pointer.hide(); - }, 250); - var height = String(pointer.height()) + "px"; - pointer.transition({ - y: height - }); - } else { - pointer.show(); - var height = "-" + String(pointer.height()) + "px"; - pointer.transition({ - y: 0 - }); - } - } - - /* - * display notification for a user using noty library - */ - function displayNotification(id) { - message = i18next.t(id); - console.log(message); - noty({ - layout: 'top', - theme: 'defaultTheme', - type: 'warning', - timeout: 2000, - closeWith: ['click'], - text: '

' + message + '

' - }); - } - - /* - * if the rover has mounted camera rotation device, the slider should be back to the center if touchup and mousup - */ - /*function gripperSliderUp() { - if($("#photography-button").prop('checked')) - $("#gripper-slider-input").val( - (parseInt($("#gripper-slider-input").attr("max"))+parseInt($("#gripper-slider-input").attr("min"))) * 0.5); - } - function cameraSliderUp() { - $("#camera-slider-input").val( - (parseInt($("#camera-slider-input").attr("max"))+parseInt($("#camera-slider-input").attr("min"))) * 0.5); - }*/ - - /* - * SUBSCRIBE topics - */ - amplify.subscribe("controller->ui", controllerMessageCallback); - amplify.subscribe("all->ui", allMessageCallback); - - /* - * CALLBACK functions - */ - function controllerMessageCallback(message) { - if (DEBUG) console.log("controller->ui: " + message); - - // choose action - switch (message) { - case "hide welcome screen": - hideWelcomeScreen(); - break; - case "display camera video": - displayCameraVideo(); - break; - case "initialize multilanguage": - initializeMultilanguage(); - break; - case "change image source to camera": - setCameraBackground(true); - break; - case "change image source to default background": - setCameraBackground(false); - break; - case "wait until GO button is pressed": - displayWelocmeScreen(); - setLastStatusDone(true); - addNewStatus("turtle is ready to go!"); - setTimeout(function() { - setLastStatusDone(true); - addNewStatus("battery voltage: ", "battery-level-text", false); - addNewStatus("signal strength: ", "signal-strength-text", false); - addNewStatus("processor temp.: ", "processor-temperature-text", false); - }, 1000); - break; - case "turtle is awake": - // setLastStatusDone(true); - // addNewStatus("connecting..."); - break; - default: - console.log("unknown command: " + message); - } - }; - - function allMessageCallback(message) { - //if (DEBUG) console.log("all->ui: " + message); - - // choose action - switch (message) { - case "notifications.working-on": - displayNotification(message); - break; - case "notifications.server-connection-error": - displayNotification(message); - break; - case "notifications.client-already-connected": - displayNotification(message); - break; - case "console button clicked": - consoleButtonClicked(); - break; - case "set last status done": - // setLastStatusDone(true); - break; - case "set last status error": - // setLastStatusDone(false); - break; - case "initialize camera...": - // addNewStatus(message); - break; - case "set battery level to full": - setBatteryLevel(4); - break; - case "set battery level to 3": - setBatteryLevel(3); - break; - case "set battery level to 2": - setBatteryLevel(2); - break; - case "set battery level to 1": - setBatteryLevel(1); - break; - case "set battery level to 0": - setBatteryLevel(0); - break; - - default: - console.log("unknown command: " + message); - } - }; - - /* - * EVENT functions - */ - $("#languageSelector").change(function(e, data) { - languageChanged(data); - }); - $(".fullscreen-button-img").click(function() { - toggleFullScreen(); - }); - $("#snap-button-img").click(function() { - takeScreenShot(); - }); - $("#record-button-img").click(function() { - recordVideo(); - }); - $(document).bind("fullscreenchange", function() { - changedFullScreen(); - }); - $("#advanced-interface-button").change(function(e, data) { - advancedInterfaceChanged(); - }); - //$("#photography-button").change(function(e, data) {photographyChanged();}); - $("#go-button").click(function() { - var remoteVideoElement = document.getElementById('camera-video-img'); - remoteVideoElement.play(); - toggleFullScreen(); - amplify.publish("ui->controller", "GO button is pressed"); - }); - $("#open-console-button").click(function() { - consoleButtonClicked(); - }); - - $("#show-hide-right-menu-img").click(function() { - showHideMenu($("#right-navigation-div")); - }); - - $("#brightness-slider").change(function(e, data) { - amplify.publish("ui->port8080", "update camera settings"); - }); - $("#contrast-slider").change(function(e, data) { - amplify.publish("ui->port8080", "update camera settings"); - }); - $("#saturation-slider").change(function(e, data) { - amplify.publish("ui->port8080", "update camera settings"); - }); - $("#hue-slider").change(function(e, data) { - amplify.publish("ui->port8080", "update camera settings"); - }); - $("#gamma-slider").change(function(e, data) { - amplify.publish("ui->port8080", "update camera settings"); - }); - $("#gain-slider").change(function(e, data) { - amplify.publish("ui->port8080", "update camera settings"); - }); - $("#sharpness-slider").change(function(e, data) { - amplify.publish("ui->port8080", "update camera settings"); - }); - - $("#gripper-slider").on("input", function(e, data) { - amplify.publish("ui->port8080", "set new gripper position"); - }); - $("#axis1-slider").on("input", function(e, data) { - amplify.publish("ui->port8080", "set new axis1 position"); - }); - $("#axis2-slider").on("input", function(e, data) { - amplify.publish("ui->port8080", "set new axis2 position"); - }); - //$("#camera-slider").on("input", function(e, data) {amplify.publish("ui->port8080", "set new camera position");}); - /* - * TBD: is it better to have it back to the center or not? - $("#gripper-slider").on("mouseup touchend", function(e, data) {gripperSliderUp();}); - $("#camera-slider").on("mouseup touchend", function(e, data) {cameraSliderUp();}); - */ - - $("#mani-axis-1").change(function(e, data) { - amplify.publish("ui->port8080", "set new mani position"); - }); - $("#mani-axis-2").change(function(e, data) { - amplify.publish("ui->port8080", "set new mani position"); - }); - - $("#mani-x").change(function(e, data) { - amplify.publish("ui->manipulator", "move mani"); - }); - $("#mani-y").change(function(e, data) { - amplify.publish("ui->manipulator", "move mani"); - }); - - function setBatteryLevel(level) { - if (level == 4) $("#indicator-battery").attr('src', 'client/img/ui/battery-4.svg'); - else if (level == 3) $("#indicator-battery").attr('src', 'client/img/ui/battery-3.svg'); - else if (level == 2) $("#indicator-battery").attr('src', 'client/img/ui/battery-2.svg'); - else if (level == 1) $("#indicator-battery").attr('src', 'client/img/ui/battery-1.svg'); - else $("#battery-level-indicator-img").attr('src', 'client/img/ui/battery-0.svg'); - } - - - - - /* - * SEND information to controller - */ - amplify.publish("ui->controller", "ui is ready for operation"); - - /* - * LOADING area - * things to do while the page is loaded - */ - - /* - * this function enables jquery flagstrap form drop-down menu in #menu - */ - // $(function() { - // // Setup drop down menu - // $('.dropdown-toggle').dropdown(); - // - // // Fix input element click problem - // $('.dropdown input, .dropdown label').click(function(e) { - // e.stopPropagation(); - // }); - // }); - - /* - * read settings from last session - */ - // $(function() { - // readSetting(Cookies.get("advanced-interface"), "#advanced-interface-button", "true"); - // readSetting(Cookies.get("photography"), "#photography-button", "false"); - // }); - - function readSetting(value, name, defVal) { - if (value == undefined) value = defVal; - - if (value == "false") $(name).prop('checked', false); - else $(name).prop('checked', true); - } - - // GRIPPER range - $(function() { - // var axis1_max = Cookies.get("mani-axis-1-max") || $('#axis1-slider-input').attr('max'); - // var axis1_min = Cookies.get("mani-axis-1-min") || $('#axis1-slider-input').attr('min'); - // - // var axis2_max = Cookies.get("mani-axis-2-max") || $('#axis2-slider-input').attr('max'); - // var axis2_min = Cookies.get("mani-axis-2-min") || $('#axis2-slider-input').attr('min'); - var axis1_max = $('#axis1-slider-input').attr('max'); - var axis1_min = $('#axis1-slider-input').attr('min'); - - var axis2_max = $('#axis2-slider-input').attr('max'); - var axis2_min = $('#axis2-slider-input').attr('min'); - - // if (Cookies.get("mani-axis-1-max")) { - // $("#axis1-slider-input").attr({ - // "max": axis1_max - // }); - // } - // if (Cookies.get("mani-axis-1-min")) { - // $("#axis1-slider-input").attr({ - // "min": axis1_max - // }); - // } - // if (Cookies.get("mani-axis-2-max")) { - // $("#axis2-slider-input").attr({ - // "max": axis2_max - // }); - // } - // if (Cookies.get("mani-axis-2-min")) { - // $("#axis2-slider-input").attr({ - // "min": axis2_min - // }); - // } - - $('#mani-axis-1-max').val(axis1_max); - $('#mani-axis-1-min').val(axis1_min); - - $('#mani-axis-2-max').val(axis2_max); - $('#mani-axis-2-min').val(axis2_min); - - $("#mani-axis-1-max").on("change", function() { - if ($('#mani-axis-1-max').val() > $('#mani-axis-1-min').val()) { - $("#axis1-slider-input").attr({ - "max": $('#mani-axis-1-max').val() - }); - // Cookies.set("mani-axis-1-max", $('#mani-axis-1-max').val()); - } - }); - $("#mani-axis-1-min").on("change", function() { - if ($('#mani-axis-1-max').val() > $('#mani-axis-1-min').val()) { - $("#axis1-slider-input").attr({ - "min": $('#mani-axis-1-min').val() - }); - // Cookies.set("mani-axis-1-min", $('#mani-axis-1-min').val()); - } - }); - $("#mani-axis-2-max").on("change", function() { - if ($('#mani-axis-2-max').val() > $('#mani-axis-2-min').val()) { - $("#axis2-slider-input").attr({ - "max": $('#mani-axis-2-max').val() - }); - // Cookies.set("mani-axis-2-max", $('#mani-axis-2-max').val()); - } - }); - $("#mani-axis-2-min").on("change", function() { - if ($('#mani-axis-1-max').val() > $('#mani-axis-1-min').val()) { - $("#axis2-slider-input").attr({ - "min": $('#mani-axis-2-min').val() - }); - // Cookies.set("mani-axis-2-min", $('#mani-axis-2-min').val()); - } - }); - }); - - - /* - * configure vex dialogs - */ - vex.defaultOptions.className = 'vex-theme-os'; - - /* - * PUBLIC area - * Reveal public pointers to private functions and properties. - */ - return {}; -})(); diff --git a/client/src/js/view/components/elements/hold-button.js b/client/src/js/view/components/elements/button-hold.js similarity index 70% rename from client/src/js/view/components/elements/hold-button.js rename to client/src/js/view/components/elements/button-hold.js index f05b20e..9cc338c 100644 --- a/client/src/js/view/components/elements/hold-button.js +++ b/client/src/js/view/components/elements/button-hold.js @@ -1,13 +1,16 @@ import { h } from 'hyperapp' import { setInterval } from 'core-js'; -export const HoldButton = ({state, value, text, setValue}) => +export const ButtonHold = ({state, value, text, setValue}) => @@ -48,7 +51,7 @@ const clearTimers = (event) => { const disable = (el) => { el.disabled = true; - el.children[0].classList.add('button-hold_counter-disabled') + el.children[0].classList.add('button-hold__counter--disabled') el.style.background = 'black'; } \ No newline at end of file diff --git a/client/src/js/view/components/elements/number-input.js b/client/src/js/view/components/elements/input-number.js similarity index 69% rename from client/src/js/view/components/elements/number-input.js rename to client/src/js/view/components/elements/input-number.js index e40f52f..b45c909 100644 --- a/client/src/js/view/components/elements/number-input.js +++ b/client/src/js/view/components/elements/input-number.js @@ -1,10 +1,10 @@ import { h } from 'hyperapp' -export const NumberInput = ({label, value, step, inc, dec}) => -
- +export const InputNumber = ({label, value, step, inc, dec}) => +
+ onmousedown={(event) => continiuity(dec, step)} onmouseup={(event) => clearTimers()} onmouseleave={(event) => clearTimers()} - class="numberInput_dec">-{step} + class="input-number__dec"> + -{step} + + class="input-number__inc"> + +{step} +
diff --git a/client/src/js/view/components/joystick.js b/client/src/js/view/components/joystick.js index 8ab6862..bff3aaf 100644 --- a/client/src/js/view/components/joystick.js +++ b/client/src/js/view/components/joystick.js @@ -1,6 +1,6 @@ import { h } from 'hyperapp' export const Joystick = ({mode, joystick, motors}) => -
joystick({el, motors})}> - {/* */} +
joystick({el, motors})}> + {/* */}
diff --git a/client/src/js/view/components/manipulator.js b/client/src/js/view/components/manipulator.js index 885d0b0..a0a8583 100644 --- a/client/src/js/view/components/manipulator.js +++ b/client/src/js/view/components/manipulator.js @@ -1,20 +1,22 @@ -import { h } from 'hyperapp' -import { RangeInput } from "./elements/range-input"; -import {throttle} from 'lodash' +import { h } from 'hyperapp'; +import { throttle } from 'lodash'; +import { RangeInput } from './elements/range-input'; -export const Manipulator = ({mode, state, action}) => -
- setManipulator(value, state.axis2.value, action)} - onchange={action.axis1.setValue}/> +export const Manipulator = ({ mode, state, action }) => +
+ setManipulatorThrottled(value, state.axis2.value, action)} + onchange={action.axis1.setValue} + /> - setManipulatorThrottled(state.axis1.value, value, action)} - onchange={action.axis2.setValue}/> -
+ setManipulatorThrottled(state.axis1.value, value, action)} + onchange={action.axis2.setValue} + /> +
; -const setManipulatorThrottled = throttle((axis1, axis2, action) => action.m.setAxes(axis1, axis2), 100, { 'trailing': false }); +const setManipulatorThrottled = throttle((axis1, axis2, action) => action.m.setAxes(axis1, axis2), 100, { trailing: false }); diff --git a/client/src/js/view/components/settings/settings-general.js b/client/src/js/view/components/settings/settings-general.js index f781b9a..0fcf4e7 100644 --- a/client/src/js/view/components/settings/settings-general.js +++ b/client/src/js/view/components/settings/settings-general.js @@ -1,9 +1,9 @@ import { h } from 'hyperapp' -import { HoldButton } from '../elements/hold-button'; +import { ButtonHold } from '../elements/button-hold'; import { System } from '../../../core/system'; export const SettingsGeneral = ({actions}) =>
- actions.system.shutdown()}> + actions.system.shutdown()}>
diff --git a/client/src/js/view/components/settings/settings-manipulator.js b/client/src/js/view/components/settings/settings-manipulator.js index 27ae241..b8e83cc 100644 --- a/client/src/js/view/components/settings/settings-manipulator.js +++ b/client/src/js/view/components/settings/settings-manipulator.js @@ -1,44 +1,44 @@ import { h } from 'hyperapp' -import { NumberInput } from '../elements/number-input'; +import { InputNumber } from '../elements/input-number'; export const SettingsManipulator = ({state, actions}) =>
- - - - - - -
- +
+
diff --git a/client/src/js/view/index.js b/client/src/js/view/index.js index 2593b18..7ba7060 100644 --- a/client/src/js/view/index.js +++ b/client/src/js/view/index.js @@ -1,6 +1,6 @@ import { h} from 'hyperapp' -import { BootScreen } from './bootscreen' +import { SplashScreen } from './splashscreen' import { TopBar } from './components/topbar' import { Stream } from './components/stream' import { Settings } from "./components/settings" @@ -11,7 +11,7 @@ import { ModeChooser } from "./components/modechooser"; const view = (state, actions) => (
- +
diff --git a/client/src/js/view/bootscreen.js b/client/src/js/view/splashscreen.js similarity index 64% rename from client/src/js/view/bootscreen.js rename to client/src/js/view/splashscreen.js index 20c2233..6fd45fa 100644 --- a/client/src/js/view/bootscreen.js +++ b/client/src/js/view/splashscreen.js @@ -1,29 +1,22 @@ import { h } from 'hyperapp' -export const BootScreen = ({state}) => -
-
-const bootscreenClass = (state) => { +const splashScreenClass = (state) => { if (state === true) { - return 'bootscreen'; + return 'splashscreen'; } else { - return 'bootscreen bootscreen-hide'; + return 'splashscreen splashscreen-hide'; } } diff --git a/client/src/scss/elements/_button-hold.scss b/client/src/scss/elements/_button-hold.scss new file mode 100644 index 0000000..edbb2d0 --- /dev/null +++ b/client/src/scss/elements/_button-hold.scss @@ -0,0 +1,42 @@ +.button-hold { + background-color: $background-color; + border: $green 2px solid; + padding: 15px; + color: $green; + font-weight: bold; + position: relative; + + &:active { + background-color: $green; + color: $background-color; + } + + &:disabled { + border: $green_dark 2px solid; + color: $green_dark; + } + + &__counter { + position: absolute; + font-size: 7px; + top: -12px; + left: -2px; + padding: 2px; + background-color: $green; + color: $background-color; + font-weight: bold; + + &--disabled { + background-color: $green_dark; + } + } + +} + +button { + outline-style: none; + + &:-moz-focusring { + outline: none; + } +} \ No newline at end of file diff --git a/client/src/scss/elements/_button.scss b/client/src/scss/elements/_button.scss deleted file mode 100644 index d462dc1..0000000 --- a/client/src/scss/elements/_button.scss +++ /dev/null @@ -1,40 +0,0 @@ -.button { - background-color: $background-color; - border: $green 2px solid; - padding: 15px; - color: $green; - font-weight: bold; - position: relative; - - &:active { - background-color: $green; - color: $background-color; - } - &:disabled { - border: $green_dark 2px solid; - color: $green_dark; - } - &-hold { - &_counter { - position: absolute; - font-size: 7px; - top: -12px; - left: -2px; - padding: 2px; - background-color: $green; - color: $background-color; - font-weight: bold; - - &-disabled { - background-color: $green_dark; - } - } - } -} - -button { - outline-style:none; - &:-moz-focusring { - outline: none; - } - } \ No newline at end of file diff --git a/client/src/scss/elements/_input-number.scss b/client/src/scss/elements/_input-number.scss index e487a33..ffe1d27 100644 --- a/client/src/scss/elements/_input-number.scss +++ b/client/src/scss/elements/_input-number.scss @@ -1,4 +1,4 @@ -.numberInput { +.input-number { display: flex; flex-flow: row; justify-content: flex-end; @@ -6,12 +6,12 @@ padding:10px 0; box-sizing: border-box; - &_label { + &__label { text-transform: uppercase; padding: 10px; } - &_input { + &__input { border: 2px solid $green; background-color: $green; color: #000; @@ -37,7 +37,7 @@ } } - &_inc { + &__inc { border: 2px solid $green; border-left: 0; background-color: transparent; @@ -45,10 +45,9 @@ padding: 10px; width: 52px; // font-weight: bold; - } - &_dec { + &__dec { padding: 10px; border: 2px solid $green; border-left: 0; diff --git a/client/src/scss/main.scss b/client/src/scss/main.scss index 6fa85a0..cfa821f 100644 --- a/client/src/scss/main.scss +++ b/client/src/scss/main.scss @@ -17,10 +17,10 @@ @import "partials/gripper-control"; @import "partials/controls-boxes"; @import "partials/manipulator-control"; -@import "partials/video"; +@import "partials/stream"; // ELEMENTS -@import "elements/button"; +@import "elements/button-hold"; @import "elements/input-number"; @import "elements/input-range"; @import "elements/radio"; diff --git a/client/src/scss/partials/_joystick.scss b/client/src/scss/partials/_joystick.scss index e59d889..f1f9c87 100644 --- a/client/src/scss/partials/_joystick.scss +++ b/client/src/scss/partials/_joystick.scss @@ -20,12 +20,12 @@ height: 25vw; } - &_image { + &__image { width: 80%; height: auto; } - &-hide { + &--hide { visibility: hidden; } } diff --git a/client/src/scss/partials/_video.scss b/client/src/scss/partials/_stream.scss similarity index 87% rename from client/src/scss/partials/_video.scss rename to client/src/scss/partials/_stream.scss index 26f8136..f822456 100644 --- a/client/src/scss/partials/_video.scss +++ b/client/src/scss/partials/_stream.scss @@ -1,4 +1,4 @@ -.videoWrapper { +.stream-wrapper { position: fixed; top: 0; right: 0; @@ -7,7 +7,7 @@ z-index: -1; } -.video { +.stream { position: absolute; min-width: 100%; min-height: 100%; diff --git a/client/src/scss/bootscreen.scss b/client/src/scss/splashscreen.scss similarity index 66% rename from client/src/scss/bootscreen.scss rename to client/src/scss/splashscreen.scss index b2b4080..39b4425 100644 --- a/client/src/scss/bootscreen.scss +++ b/client/src/scss/splashscreen.scss @@ -1,6 +1,6 @@ @import "helpers/vars"; -.bootscreen { +.splashscreen { background: linear-gradient(113.05297105520958deg, rgba(127, 255, 160,1) 13.895833333333332%,rgba(74, 155, 96,1) 55.91840277777778%,rgba(33, 77, 46,1) 89.71527777777777%); height: 100%; width: 100%; @@ -12,23 +12,15 @@ justify-content: center; z-index: 10; - &_logo { + &__logo { display: inline-flex; height: auto; width: 20em; - - &_svg { - height: 100%; - width: 100%; - } } - &_bootlog { - &_message { - font-family: $log-font; - font-size: $log-font-size; - line-height: $log-line-height; - } + &__svg { + height: 100%; + width: 100%; } &-hide { diff --git a/package.json b/package.json index 926b163..495daac 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,24 @@ { "name": "tcs", - "version": "0.13.4", + "version": "0.13.5", "description": "Turtle Control Software", "main": "index.js", "scripts": { "start": "parcel watch ./client/src/index.html --out-dir ./client/dist --public-url ./ --no-hmr", - "build": "parcel build ./client/src/index.html --out-dir ./client/dist --public-url ./" + "build": "parcel build ./client/src/index.html --out-dir ./client/dist --public-url ./", + "lint": "eslint --ext .js client/src/" }, "repository": "git+https://github.com/TurtleRover/Turtle-Rover-Mission-Control.git", "keywords": [], "author": "", "license": "MIT", "devDependencies": { + "eslint": "^5.6.0", + "eslint-config-airbnb": "^17.1.0", + "eslint-config-airbnb-base": "^13.1.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-jsx-a11y": "^6.1.1", + "eslint-plugin-react": "^7.11.1", "node-sass": "^4.8.3", "parcel-bundler": "^1.9.7" }, diff --git a/yarn.lock b/yarn.lock index 12b7e5c..9586b3d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,20 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + "@hyperapp/logger@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@hyperapp/logger/-/logger-0.5.0.tgz#627404507c45d38fb5190343f84b4da377e103b8" @@ -21,14 +35,28 @@ abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" +acorn-jsx@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" + dependencies: + acorn "^5.0.3" + acorn@^5.0.0: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" +acorn@^5.0.3, acorn@^5.6.0: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" +ajv-keywords@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" @@ -45,6 +73,15 @@ ajv@^5.1.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" +ajv@^6.0.1, ajv@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + alphanum-sort@^1.0.0, alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -53,6 +90,10 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -101,6 +142,13 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -117,6 +165,23 @@ array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -125,6 +190,10 @@ arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" @@ -155,6 +224,10 @@ assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -198,6 +271,12 @@ aws4@^1.2.1, aws4@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" +axobject-query@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.1.tgz#05dfa705ada8ad9db993fa6896f22d395b0b0a07" + dependencies: + ast-types-flow "0.0.7" + babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -920,10 +999,20 @@ call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -979,7 +1068,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" dependencies: @@ -987,6 +1076,10 @@ chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + chokidar@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" @@ -1017,6 +1110,10 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" @@ -1042,6 +1139,10 @@ cli-spinners@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -1207,6 +1308,10 @@ constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -1266,7 +1371,7 @@ cross-spawn@^3.0.0: lru-cache "^4.0.1" which "^1.2.9" -cross-spawn@^6.0.4: +cross-spawn@^6.0.4, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" dependencies: @@ -1466,6 +1571,10 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" +damerau-levenshtein@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -1489,6 +1598,12 @@ debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6. dependencies: ms "2.0.0" +debug@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" + dependencies: + ms "^2.1.1" + debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -1547,6 +1662,18 @@ defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + 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" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1588,6 +1715,19 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + dom-serializer@0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" @@ -1679,6 +1819,10 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +emoji-regex@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -1719,7 +1863,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.1, es-abstract@^1.6.1: +es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" dependencies: @@ -1767,6 +1911,143 @@ escodegen@~1.9.0: optionalDependencies: source-map "~0.6.1" +eslint-config-airbnb-base@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz#b5a1b480b80dfad16433d6c4ad84e6605052c05c" + dependencies: + eslint-restricted-globals "^0.1.1" + object.assign "^4.1.0" + object.entries "^1.0.4" + +eslint-config-airbnb@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-17.1.0.tgz#3964ed4bc198240315ff52030bf8636f42bc4732" + dependencies: + eslint-config-airbnb-base "^13.1.0" + object.assign "^4.1.0" + object.entries "^1.0.4" + +eslint-import-resolver-node@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + +eslint-plugin-import@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" + dependencies: + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.2.0" + has "^1.0.1" + lodash "^4.17.4" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + resolve "^1.6.0" + +eslint-plugin-jsx-a11y@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.1.tgz#7bf56dbe7d47d811d14dbb3ddff644aa656ce8e1" + dependencies: + aria-query "^3.0.0" + array-includes "^3.0.3" + ast-types-flow "^0.0.7" + axobject-query "^2.0.1" + damerau-levenshtein "^1.0.4" + emoji-regex "^6.5.1" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + +eslint-plugin-react@^7.11.1: + version "7.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + prop-types "^15.6.2" + +eslint-restricted-globals@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" + +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.6.0.tgz#b6f7806041af01f71b3f1895cbb20971ea4b6223" + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.5.3" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^4.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + imurmurhash "^0.1.4" + inquirer "^6.1.0" + is-resolvable "^1.1.0" + js-yaml "^3.12.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.5" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^2.0.0" + require-uncached "^1.0.3" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^4.0.3" + text-table "^0.2.0" + +espree@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-4.0.0.tgz#253998f20a0f82db5d866385799d912a83a36634" + dependencies: + acorn "^5.6.0" + acorn-jsx "^4.1.1" + esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -1779,7 +2060,19 @@ esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" -estraverse@^4.2.0: +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -1831,6 +2124,14 @@ extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +external-editor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -1865,6 +2166,10 @@ fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + fast-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf" @@ -1884,6 +2189,19 @@ fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + filesize@^3.6.0: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" @@ -1904,6 +2222,21 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" @@ -1982,6 +2315,10 @@ function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -2055,10 +2392,36 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + dependencies: + 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" + +globals@^11.7.0: + version "11.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + 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" + globule@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" @@ -2124,6 +2487,10 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -2155,7 +2522,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.0, has@^1.0.1: +has@^1.0.0, has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" dependencies: @@ -2278,6 +2645,12 @@ hyperapp@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/hyperapp/-/hyperapp-1.2.8.tgz#48a3b02d6948b8faf3b72f42d70577470d0d4124" +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + iconv-lite@^0.4.4: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" @@ -2294,6 +2667,14 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + in-publish@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" @@ -2331,6 +2712,24 @@ ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" +inquirer@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.17.10" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.1.0" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -2484,6 +2883,22 @@ is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -2494,13 +2909,17 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" dependencies: has "^1.0.1" -is-resolvable@^1.0.0: +is-resolvable@^1.0.0, is-resolvable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" @@ -2583,7 +3002,7 @@ js-beautify@^1.7.5: mkdirp "~0.5.0" nopt "~3.0.1" -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2591,7 +3010,7 @@ js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.10.0, js-yaml@^3.9.0: +js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.9.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: @@ -2632,10 +3051,18 @@ json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" @@ -2669,6 +3096,12 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jsx-ast-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + dependencies: + array-includes "^3.0.3" + keyboardjs@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/keyboardjs/-/keyboardjs-2.4.1.tgz#7c5ad28695a21b6c4d066681c127376a60f9acd1" @@ -2699,7 +3132,7 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -levn@~0.3.0: +levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" dependencies: @@ -2716,6 +3149,22 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^2.0.0: + version "2.0.0" + resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" @@ -2748,13 +3197,17 @@ lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.4, lodash@~4.17.10: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" +lodash@^4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" dependencies: chalk "^2.0.1" -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" dependencies: @@ -2891,7 +3344,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" -"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -2935,6 +3388,14 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + nan@^2.0.7, nan@^2.10.0, nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" @@ -2955,6 +3416,10 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + needle@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" @@ -3168,7 +3633,7 @@ object-inspect@~1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" -object-keys@^1.0.6, object-keys@^1.0.8: +object-keys@^1.0.11, object-keys@^1.0.6, object-keys@^1.0.8: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -3178,6 +3643,24 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.6.1" + function-bind "^1.1.0" + has "^1.0.1" + object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -3224,7 +3707,7 @@ opn@^5.1.0: dependencies: is-wsl "^1.1.0" -optionator@^0.8.1: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: @@ -3260,7 +3743,7 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -3271,6 +3754,22 @@ osenv@0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + pako@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -3395,10 +3894,18 @@ path-exists@^2.0.0: dependencies: pinkie-promise "^2.0.0" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -3415,6 +3922,12 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + pbkdf2@^3.0.3: version "3.0.16" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" @@ -3451,6 +3964,16 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -3946,6 +4469,17 @@ process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +prop-types@^15.6.2: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + dependencies: + loose-envify "^1.3.1" + object-assign "^4.1.1" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -3972,6 +4506,10 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -4040,6 +4578,13 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -4048,6 +4593,14 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.3: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -4120,6 +4673,10 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.0.tgz#b2a7534a85ca1b033bcf5ce9ff8e56d4e0755365" + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -4216,11 +4773,22 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" -resolve@^1.1.5, resolve@^1.4.0: +resolve@^1.1.5, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: @@ -4245,7 +4813,7 @@ rgba-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" -rimraf@2, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -4258,6 +4826,18 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rxjs@^6.1.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" + dependencies: + tslib "^1.9.0" + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -4302,6 +4882,10 @@ scss-tokenizer@^0.2.3: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@^5.5.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -4413,6 +4997,12 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -4646,7 +5236,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2": +"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: @@ -4681,13 +5271,17 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" dependencies: get-stdin "^4.0.1" -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -4746,6 +5340,17 @@ svgo@^1.0.0, svgo@^1.0.5: unquote "~1.1.1" util.promisify "~1.0.0" +table@^4.0.3: + version "4.0.3" + resolved "http://registry.npmjs.org/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" + dependencies: + ajv "^6.0.1" + ajv-keywords "^3.0.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + tar@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" @@ -4774,6 +5379,10 @@ terser@^3.7.3: source-map "~0.6.1" source-map-support "~0.5.6" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + through2@^2.0.0, through2@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" @@ -4781,6 +5390,10 @@ through2@^2.0.0, through2@~2.0.3: readable-stream "^2.1.5" xtend "~4.0.1" +through@^2.3.6: + version "2.3.8" + resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + timers-browserify@^2.0.4: version "2.0.10" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" @@ -4795,6 +5408,12 @@ tiny-inflate@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.2.tgz#93d9decffc8805bd57eae4310f0b745e9b6fb3a7" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" @@ -4857,6 +5476,10 @@ trim-right@^1.0.1: dependencies: glob "^6.0.4" +tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -4931,6 +5554,12 @@ upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -5047,6 +5676,12 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + ws@^5.1.1: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"