From a84f7fe1eebaaec1d2e27a8e7117af9b26aa1ce2 Mon Sep 17 00:00:00 2001 From: andreamah Date: Mon, 10 Feb 2020 10:49:56 -0800 Subject: [PATCH 01/40] added listeners on buttons for backend --- src/process_user_code.py | 27 +++++++++++++++++++++++---- src/python_constants.py | 7 +++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/process_user_code.py b/src/process_user_code.py index 8bc283c7e..608f8f83a 100644 --- a/src/process_user_code.py +++ b/src/process_user_code.py @@ -30,7 +30,9 @@ # This import must happen after the sys.path is modified from adafruit_circuitplayground.express import cpx from adafruit_circuitplayground.telemetry import telemetry_py +from adafruit_circuitplayground.constants import CPX from microbit.model.microbit_model import mb +from microbit.model.constants import MICROBIT # Handle User Inputs Thread @@ -44,10 +46,27 @@ def run(self): sys.stdin.flush() try: new_state = json.loads(read_val) - for event in CONSTANTS.EXPECTED_INPUT_EVENTS_CPX: - cpx._Express__state[event] = new_state.get( - event, cpx._Express__state[event] - ) + + device = new_state.get(CONSTANTS.ACTIVE_DEVICE_FIELD) + if device == CPX: + for event in CONSTANTS.EXPECTED_INPUT_EVENTS_CPX: + cpx._Express__state[event] = new_state.get( + event, cpx._Express__state[event] + ) + elif device == MICROBIT: + for button in CONSTANTS.EXPECTED_INPUT_EVENTS_BUTTONS_MICROBIT: + previous_pressed = None + exec(f"previous_pressed = mb.{button}.get_presses()") + button_pressed = new_state.get(event, previous_pressed) + + if button_pressed != previous_pressed: + print(f"{event} is at {button_pressed}") + if button_pressed: + exec(f"mb.{button}._Button__press_down()") + else: + exec(f"mb.{button}._Button__release()") + else: + raise Exception("Device not implemented.") except Exception as e: print(CONSTANTS.ERROR_SENDING_EVENT, e, file=sys.stderr, flush=True) diff --git a/src/python_constants.py b/src/python_constants.py index 4b9d0338f..e2cea8345 100644 --- a/src/python_constants.py +++ b/src/python_constants.py @@ -1,6 +1,8 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT license. +ACTIVE_DEVICE_FIELD = "active_device" + CPX_DRIVE_NAME = "CIRCUITPY" ENABLE_TELEMETRY = "enable_telemetry" @@ -17,6 +19,11 @@ "touch", ] +EXPECTED_INPUT_EVENTS_BUTTONS_MICROBIT = [ + "button_a", + "button_b", +] + EXEC_COMMAND = "exec" ERROR_SENDING_EVENT = "Error trying to send event to the process : " ERROR_TRACEBACK = "\n\tTraceback of code execution : \n" From 767d14a371c9b469fee3ce707d129b997b88e4b8 Mon Sep 17 00:00:00 2001 From: xnkevinnguyen Date: Mon, 10 Feb 2020 11:17:41 -0800 Subject: [PATCH 02/40] Add button emitter --- .../components/microbit/MicrobitSimulator.tsx | 77 +++++++++++++++---- src/view/constants.ts | 5 ++ 2 files changed, 65 insertions(+), 17 deletions(-) diff --git a/src/view/components/microbit/MicrobitSimulator.tsx b/src/view/components/microbit/MicrobitSimulator.tsx index dd8f05f35..6e6e20390 100644 --- a/src/view/components/microbit/MicrobitSimulator.tsx +++ b/src/view/components/microbit/MicrobitSimulator.tsx @@ -1,5 +1,9 @@ import * as React from "react"; -import CONSTANTS, { WEBVIEW_MESSAGES } from "../../constants"; +import CONSTANTS, { + WEBVIEW_MESSAGES, + MICROBIT_BUTTONS_KEYS, + DEVICE_LIST_KEY, +} from "../../constants"; import PlayLogo from "../../svgs/play_svg"; import StopLogo from "../../svgs/stop_svg"; import { sendMessage } from "../../utils/MessageUtils"; @@ -7,26 +11,34 @@ import Dropdown from "../Dropdown"; import ActionBar from "../simulator/ActionBar"; import { MicrobitImage } from "./MicrobitImage"; -const initialLedState = [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], -]; +const DEFAULT_MICROBIT_STATE: IMicrobitState = { + leds: [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ], + buttons: { button_a: false, button_b: false }, +}; interface IState { active_editors: string[]; running_file: string; - leds: number[][]; play_button: boolean; selected_file: string; + microbit: IMicrobitState; +} + +interface IMicrobitState { + leds: number[][]; + buttons: { button_a: boolean; button_b: boolean }; } export class MicrobitSimulator extends React.Component { constructor() { super({}); this.state = { - leds: initialLedState, + microbit: DEFAULT_MICROBIT_STATE, play_button: false, selected_file: "", active_editors: [], @@ -39,13 +51,16 @@ export class MicrobitSimulator extends React.Component { switch (message.command) { case "reset-state": this.setState({ - leds: initialLedState, + microbit: DEFAULT_MICROBIT_STATE, play_button: false, }); break; case "set-state": this.setState({ - leds: message.state.leds, + microbit: { + ...this.state.microbit, + leds: message.state.leds, + }, }); break; case "activate-play": @@ -97,7 +112,7 @@ export class MicrobitSimulator extends React.Component { onMouseUp: this.onMouseUp, onMouseLeave: this.onMouseLeave, }} - leds={this.state.leds} + leds={this.state.microbit.leds} /> { protected refreshSimulatorClick = () => { sendMessage(WEBVIEW_MESSAGES.REFRESH_SIMULATOR, true); }; - protected onMouseUp(button: HTMLElement, event: Event, key: string) { + protected handleButtonClick = (key: string, isActive: boolean) => { + let newButtonState = this.state.microbit.buttons; + switch (key) { + case MICROBIT_BUTTONS_KEYS.BTN_A: + newButtonState.button_a = isActive; + break; + case MICROBIT_BUTTONS_KEYS.BTN_B: + newButtonState.button_b = isActive; + break; + case MICROBIT_BUTTONS_KEYS.BTN_AB: + newButtonState = { + button_a: isActive, + button_b: isActive, + }; + break; + } + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, { + active_device: DEVICE_LIST_KEY.MICROBIT, + state: newButtonState, + }); + this.setState({ + microbit: { + ...this.state.microbit, + buttons: newButtonState, + }, + }); + }; + protected onMouseUp = (button: HTMLElement, event: Event, key: string) => { event.preventDefault(); - console.log(`To implement onMouseUp on ${key}`); - } + this.handleButtonClick(key, false); + }; protected onMouseDown(button: HTMLElement, event: Event, key: string) { event.preventDefault(); - console.log(`To implement onMouseDown ${key}`); + this.handleButtonClick(key, true); } + protected onMouseLeave(button: HTMLElement, event: Event, key: string) { event.preventDefault(); console.log(`To implement onMouseLeave ${key}`); diff --git a/src/view/constants.ts b/src/view/constants.ts index fc1f53631..2fde0d112 100644 --- a/src/view/constants.ts +++ b/src/view/constants.ts @@ -45,6 +45,11 @@ export const CONSTANTS = { SIMULATOR_BUTTON_WIDTH: 60, TOOLBAR_INFO: `Explore what's on the board:`, }; +export const MICROBIT_BUTTONS_KEYS = { + BTN_A: "BTN_A", + BTN_B: "BTN_B", + BTN_AB: "BTN_AB", +}; export enum DEVICE_LIST_KEY { CPX = "CPX", MICROBIT = "micro:bit", From 86610b6949aeeb19af161359f249b6e823e8819e Mon Sep 17 00:00:00 2001 From: xnkevinnguyen Date: Mon, 10 Feb 2020 12:01:31 -0800 Subject: [PATCH 03/40] Modify format of messages from vscode api to python --- src/extension.ts | 5 ++++- src/view/components/cpx/CpxSimulator.tsx | 1 - src/view/components/microbit/MicrobitSimulator.tsx | 6 +----- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 60144e10a..b65a648e1 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -154,7 +154,10 @@ export async function activate(context: vscode.ExtensionContext) { // Handle messages from webview messageListener = currentPanel.webview.onDidReceiveMessage( message => { - const messageJson = JSON.stringify(message.text); + const messageJson = JSON.stringify({ + active_device: currentActiveDevice, + state: message.text, + }); switch (message.command) { case WEBVIEW_MESSAGES.BUTTON_PRESS: // Send input to the Python process diff --git a/src/view/components/cpx/CpxSimulator.tsx b/src/view/components/cpx/CpxSimulator.tsx index 7628f6562..44c9db5f3 100644 --- a/src/view/components/cpx/CpxSimulator.tsx +++ b/src/view/components/cpx/CpxSimulator.tsx @@ -170,7 +170,6 @@ class Simulator extends React.Component<{}, IState> { protected togglePlayClick() { sendMessage("play-simulator", { - active_device: CONSTANTS.DEVICE_NAME.CPX, selected_file: this.state.selected_file, state: !this.state.play_button, }); diff --git a/src/view/components/microbit/MicrobitSimulator.tsx b/src/view/components/microbit/MicrobitSimulator.tsx index 6e6e20390..d6e75d858 100644 --- a/src/view/components/microbit/MicrobitSimulator.tsx +++ b/src/view/components/microbit/MicrobitSimulator.tsx @@ -125,7 +125,6 @@ export class MicrobitSimulator extends React.Component { } protected togglePlayClick = () => { sendMessage(WEBVIEW_MESSAGES.TOGGLE_PLAY_STOP, { - active_device: CONSTANTS.DEVICE_NAME.MICROBIT, selected_file: this.state.selected_file, state: !this.state.play_button, }); @@ -154,10 +153,7 @@ export class MicrobitSimulator extends React.Component { }; break; } - sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, { - active_device: DEVICE_LIST_KEY.MICROBIT, - state: newButtonState, - }); + sendMessage(WEBVIEW_MESSAGES.BUTTON_PRESS, newButtonState); this.setState({ microbit: { ...this.state.microbit, From d8082fa95354af8a994cba599f74d199cabcf581 Mon Sep 17 00:00:00 2001 From: andreamah Date: Mon, 10 Feb 2020 12:06:58 -0800 Subject: [PATCH 04/40] fixed integration bugs on backend --- src/process_user_code.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/process_user_code.py b/src/process_user_code.py index 608f8f83a..3dab4c04d 100644 --- a/src/process_user_code.py +++ b/src/process_user_code.py @@ -54,13 +54,14 @@ def run(self): event, cpx._Express__state[event] ) elif device == MICROBIT: + new_state = new_state.get("state", {}) for button in CONSTANTS.EXPECTED_INPUT_EVENTS_BUTTONS_MICROBIT: previous_pressed = None exec(f"previous_pressed = mb.{button}.get_presses()") button_pressed = new_state.get(event, previous_pressed) if button_pressed != previous_pressed: - print(f"{event} is at {button_pressed}") + print(f"{button} is at {button_pressed}") if button_pressed: exec(f"mb.{button}._Button__press_down()") else: From 549978cc16c4aba3c9509a02bcdb375a62eaae1f Mon Sep 17 00:00:00 2001 From: xnkevinnguyen Date: Mon, 10 Feb 2020 12:08:36 -0800 Subject: [PATCH 05/40] Bind functions to simulator --- src/view/components/microbit/MicrobitSimulator.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/view/components/microbit/MicrobitSimulator.tsx b/src/view/components/microbit/MicrobitSimulator.tsx index 202ad6838..a31d0e469 100644 --- a/src/view/components/microbit/MicrobitSimulator.tsx +++ b/src/view/components/microbit/MicrobitSimulator.tsx @@ -165,17 +165,17 @@ export class MicrobitSimulator extends React.Component { }, }); }; - protected onMouseUp = (button: HTMLElement, event: Event, key: string) => { + protected onMouseUp = (event: Event, key: string) => { event.preventDefault(); this.handleButtonClick(key, false); }; - protected onMouseDown(button: HTMLElement, event: Event, key: string) { + protected onMouseDown = (event: Event, key: string) => { event.preventDefault(); this.handleButtonClick(key, true); - } + }; - protected onMouseLeave(button: HTMLElement, event: Event, key: string) { + protected onMouseLeave = (event: Event, key: string) => { event.preventDefault(); console.log(`To implement onMouseLeave ${key}`); - } + }; } From cda4e750244b0a63a8ccf3f1f5b8c154219724d7 Mon Sep 17 00:00:00 2001 From: xnkevinnguyen Date: Mon, 10 Feb 2020 12:11:33 -0800 Subject: [PATCH 06/40] Fix missing argument onmouseup --- src/view/components/microbit/MicrobitImage.tsx | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/view/components/microbit/MicrobitImage.tsx b/src/view/components/microbit/MicrobitImage.tsx index 98c554607..08d1d83b3 100644 --- a/src/view/components/microbit/MicrobitImage.tsx +++ b/src/view/components/microbit/MicrobitImage.tsx @@ -6,13 +6,9 @@ import "../../styles/Microbit.css"; import { MicrobitSvg } from "./Microbit_svg"; interface EventTriggers { - onMouseUp: (button: HTMLElement, event: Event, buttonKey: string) => void; - onMouseDown: (button: HTMLElement, event: Event, buttonKey: string) => void; - onMouseLeave: ( - button: HTMLElement, - event: Event, - buttonKey: string - ) => void; + onMouseUp: (event: Event, buttonKey: string) => void; + onMouseDown: (event: Event, buttonKey: string) => void; + onMouseLeave: (event: Event, buttonKey: string) => void; } interface IProps { eventTriggers: EventTriggers; @@ -47,13 +43,13 @@ const setupButton = ( key: string ) => { buttonElement.onmousedown = e => { - eventTriggers.onMouseDown(buttonElement, e, key); + eventTriggers.onMouseDown(e, key); }; buttonElement.onmouseup = e => { - eventTriggers.onMouseUp(buttonElement, e, key); + eventTriggers.onMouseUp(e, key); }; buttonElement.onmouseleave = e => { - eventTriggers.onMouseLeave(buttonElement, e, key); + eventTriggers.onMouseLeave(e, key); }; }; const setupAllButtons = (eventTriggers: EventTriggers, buttonRefs: Object) => { From c876f4fe6f0eaeda1d809fcae69e88f984e03cb8 Mon Sep 17 00:00:00 2001 From: andreamah Date: Mon, 10 Feb 2020 13:46:01 -0800 Subject: [PATCH 07/40] button connections implemented --- src/process_user_code.py | 43 ++++++++++++++++++++++------------------ src/python_constants.py | 6 +++++- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/process_user_code.py b/src/process_user_code.py index 3dab4c04d..38520591b 100644 --- a/src/process_user_code.py +++ b/src/process_user_code.py @@ -45,34 +45,39 @@ def run(self): read_val = sys.stdin.readline() sys.stdin.flush() try: - new_state = json.loads(read_val) + json_val = json.loads(read_val) + device = json_val.get(CONSTANTS.ACTIVE_DEVICE_FIELD) + new_state = json_val.get(CONSTANTS.STATE_KEYWORD, {}) - device = new_state.get(CONSTANTS.ACTIVE_DEVICE_FIELD) if device == CPX: - for event in CONSTANTS.EXPECTED_INPUT_EVENTS_CPX: - cpx._Express__state[event] = new_state.get( - event, cpx._Express__state[event] - ) + update_cpx(new_state) elif device == MICROBIT: - new_state = new_state.get("state", {}) - for button in CONSTANTS.EXPECTED_INPUT_EVENTS_BUTTONS_MICROBIT: - previous_pressed = None - exec(f"previous_pressed = mb.{button}.get_presses()") - button_pressed = new_state.get(event, previous_pressed) - - if button_pressed != previous_pressed: - print(f"{button} is at {button_pressed}") - if button_pressed: - exec(f"mb.{button}._Button__press_down()") - else: - exec(f"mb.{button}._Button__release()") + update_microbit(new_state) else: - raise Exception("Device not implemented.") + raise Exception(CONSTANTS.DEVICE_NOT_IMPLEMENTED_ERROR) except Exception as e: print(CONSTANTS.ERROR_SENDING_EVENT, e, file=sys.stderr, flush=True) +def update_cpx(new_state): + for event in CONSTANTS.EXPECTED_INPUT_EVENTS_CPX: + cpx._Express__state[event] = new_state.get(event, cpx._Express__state[event]) + + +def update_microbit(new_state): + for button in CONSTANTS.EXPECTED_INPUT_BUTTONS_MICROBIT: + previous_pressed = None + exec(f"previous_pressed = mb.{button}.get_presses()") + button_pressed = new_state.get(button, previous_pressed) + + if button_pressed != previous_pressed: + if button_pressed: + exec(f"mb.{button}._Button__press_down()") + else: + exec(f"mb.{button}._Button__release()") + + user_input = UserInput() threads.append(user_input) user_input.start() diff --git a/src/python_constants.py b/src/python_constants.py index e2cea8345..40bb360ef 100644 --- a/src/python_constants.py +++ b/src/python_constants.py @@ -5,6 +5,8 @@ CPX_DRIVE_NAME = "CIRCUITPY" +DEVICE_NOT_IMPLEMENTED_ERROR = "Device not implemented." + ENABLE_TELEMETRY = "enable_telemetry" EXPECTED_INPUT_EVENTS_CPX = [ "button_a", @@ -19,7 +21,7 @@ "touch", ] -EXPECTED_INPUT_EVENTS_BUTTONS_MICROBIT = [ +EXPECTED_INPUT_BUTTONS_MICROBIT = [ "button_a", "button_b", ] @@ -44,6 +46,8 @@ PYTHON_LIBS_DIR = "python_libs" +STATE_KEYWORD = "state" + UTF_FORMAT = "utf-8" WINDOWS_OS = "win32" From f97990e715fa50c5f98dfdbeb33b95a53708ba7a Mon Sep 17 00:00:00 2001 From: andreamah Date: Mon, 10 Feb 2020 14:02:38 -0800 Subject: [PATCH 08/40] some renaming --- src/process_user_code.py | 6 +++--- src/python_constants.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/process_user_code.py b/src/process_user_code.py index 56fc917ed..4c85c2165 100644 --- a/src/process_user_code.py +++ b/src/process_user_code.py @@ -46,9 +46,9 @@ def run(self): read_val = sys.stdin.readline() sys.stdin.flush() try: - json_val = json.loads(read_val) - device = json_val.get(CONSTANTS.ACTIVE_DEVICE_FIELD) - new_state = json_val.get(CONSTANTS.STATE_KEYWORD, {}) + new_state_message = json.loads(read_val) + device = new_state_message.get(CONSTANTS.ACTIVE_DEVICE_FIELD) + new_state = new_state_message.get(CONSTANTS.STATE_FIELD, {}) if device == CPX: update_cpx(new_state) diff --git a/src/python_constants.py b/src/python_constants.py index 40bb360ef..ab91e278e 100644 --- a/src/python_constants.py +++ b/src/python_constants.py @@ -46,7 +46,7 @@ PYTHON_LIBS_DIR = "python_libs" -STATE_KEYWORD = "state" +STATE_FIELD = "state" UTF_FORMAT = "utf-8" From 0525df8b8208322abf5397aac84835108a18bbe9 Mon Sep 17 00:00:00 2001 From: andreamah Date: Mon, 10 Feb 2020 14:42:23 -0800 Subject: [PATCH 09/40] initial work on sensor listeners --- src/process_user_code.py | 23 +++++++++++++++++++++++ src/python_constants.py | 11 +++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/process_user_code.py b/src/process_user_code.py index 4c85c2165..6837babcf 100644 --- a/src/process_user_code.py +++ b/src/process_user_code.py @@ -67,6 +67,7 @@ def update_cpx(new_state): def update_microbit(new_state): + # set button values for button in CONSTANTS.EXPECTED_INPUT_BUTTONS_MICROBIT: previous_pressed = None exec(f"previous_pressed = mb.{button}.get_presses()") @@ -78,6 +79,28 @@ def update_microbit(new_state): else: exec(f"mb.{button}._Button__release()") + # set motion_x, motion_y, motion_z + for name, direction in CONSTANTS.EXPECTED_INPUT_ACCEL_MICROBIT: + previous_motion_val = None + exec(f"previous_motion_val = mb.accelerometer.get_{direction}()") + new_motion_val = new_state.get(name, previous_motion_val) + if new_motion_val != previous_motion_val: + print("change motion val") + + # set temperature + previous_temp = mb.temperature() + new_temp = new_state.get(CONSTANTS.EXPECTED_INPUT_TEMP_MICROBIT, previous_temp) + if new_temp != new_temp: + print("set temp value") + + # set light level + previous_light_level = mb.display.read_light_level() + new_light_level = new_state.get( + CONSTANTS.EXPECTED_INPUT_LIGHT_MICROBIT, previous_light_level + ) + if new_light_level != new_light_level: + print("set light value") + user_input = UserInput() threads.append(user_input) diff --git a/src/python_constants.py b/src/python_constants.py index ab91e278e..ee5971c4e 100644 --- a/src/python_constants.py +++ b/src/python_constants.py @@ -8,6 +8,7 @@ DEVICE_NOT_IMPLEMENTED_ERROR = "Device not implemented." ENABLE_TELEMETRY = "enable_telemetry" + EXPECTED_INPUT_EVENTS_CPX = [ "button_a", "button_b", @@ -21,11 +22,21 @@ "touch", ] +EXPECTED_INPUT_ACCEL_MICROBIT = {"motion_x": "x", "motion_y": "y", "motion_z": "z"} + EXPECTED_INPUT_BUTTONS_MICROBIT = [ "button_a", "button_b", ] +EXPECTED_INPUT_LIGHT_MICROBIT = "light" + +EXPECTED_INPUT_SENSORS_MICROBIT = [ + "temperature", + "light", +] +EXPECTED_INPUT_TEMP_MICROBIT = "temperature" + EXEC_COMMAND = "exec" ERROR_SENDING_EVENT = "Error trying to send event to the process : " ERROR_TRACEBACK = "\n\tTraceback of code execution : \n" From 8dc2aee53a41860bd0dc7afb581b590d338ab5fe Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Mon, 10 Feb 2020 15:05:09 -0800 Subject: [PATCH 10/40] first commit for sensors --- src/microbit/__init__.py | 10 +- src/microbit/__model/accelerometer.py | 120 +++++++++++++++++++++++ src/microbit/__model/constants.py | 25 +++++ src/microbit/__model/display.py | 15 ++- src/microbit/__model/microbit_model.py | 18 +++- src/microbit/test/test_accelerometer.py | 95 ++++++++++++++++++ src/microbit/test/test_display.py | 14 +++ src/microbit/test/test_microbit_model.py | 15 +++ src/microbit/test/test_shim.py | 5 + 9 files changed, 311 insertions(+), 6 deletions(-) create mode 100644 src/microbit/__model/accelerometer.py create mode 100644 src/microbit/test/test_accelerometer.py diff --git a/src/microbit/__init__.py b/src/microbit/__init__.py index f6e847f48..a87cd59dc 100644 --- a/src/microbit/__init__.py +++ b/src/microbit/__init__.py @@ -4,6 +4,7 @@ button_a = __mb.button_a button_b = __mb.button_b display = __mb.display +accelerometer = __mb.accelerometer def sleep(n): @@ -21,4 +22,11 @@ def running_time(): Return the number of milliseconds since the board was switched on or restarted. """ - __mb.running_time() + return __mb.running_time() + + +def temperature(): + """ + Return the temperature of the micro:bit in degrees Celcius. + """ + return __mb.temperature() diff --git a/src/microbit/__model/accelerometer.py b/src/microbit/__model/accelerometer.py new file mode 100644 index 000000000..732503500 --- /dev/null +++ b/src/microbit/__model/accelerometer.py @@ -0,0 +1,120 @@ +import enum + +from . import constants as CONSTANTS + + +class Accelerometer: + def __init__(self): + self.__x = 0 + self.__y = 0 + self.__z = 0 + self.__current_gesture = "" + self.__prev_gestures = set() + self.__gestures = [] + + def get_x(self): + """ + Get the acceleration measurement in the ``x`` axis, as a positive or + negative integer, depending on the direction. The measurement is given in + milli-g. + """ + return self.__x + + def get_y(self): + """ + Get the acceleration measurement in the ``y`` axis, as a positive or + negative integer, depending on the direction. The measurement is given in + milli-g. + """ + return self.__y + + def get_z(self): + """ + Get the acceleration measurement in the ``z`` axis, as a positive or + negative integer, depending on the direction. The measurement is given in + milli-g. + """ + return self.__z + + def get_values(self): + """ + Get the acceleration measurements in all axes at once, as a three-element + tuple of integers ordered as X, Y, Z. + """ + return (self.__x, self.__y, self.__z) + + def current_gesture(self): + """ + Return the name of the current gesture. + """ + self.__add_current_gesture_to_gesture_lists() + return self.__current_gesture + + def is_gesture(self, name): + """ + Return True or False to indicate if the named gesture is currently active. + """ + self.__add_current_gesture_to_gesture_lists() + if name not in CONSTANTS.GESTURES: + raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) + return name == self.__current_gesture + + def was_gesture(self, name): + """ + Return True or False to indicate if the named gesture was active since the + last call. + """ + self.__add_current_gesture_to_gesture_lists() + if name not in CONSTANTS.GESTURES: + raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) + was_gesture = name in self.__prev_gestures + self.__prev_gestures.clear() + return was_gesture + + def get_gestures(self): + """ + Return a tuple of the gesture history. The most recent is listed last. + Also clears the gesture history before returning. + """ + self.__add_current_gesture_to_gesture_lists() + gestures = tuple(self.__gestures) + self.__gestures.clear() + return gestures + + # Helpers and Hidden Functions + + def __set_x(self, x): + self.__x = self.__get_valid_acceleration(x) + + def __set_y(self, y): + self.__y = self.__get_valid_acceleration(y) + + def __set_z(self, z): + self.__z = self.__get_valid_acceleration(z) + + def __get_valid_acceleration(self, acceleration): + if acceleration < CONSTANTS.MIN_ACCELERATION: + return CONSTANTS.MIN_ACCELERATION + elif acceleration > CONSTANTS.MAX_ACCELERATION: + return CONSTANTS.MAX_ACCELERATION + else: + return acceleration + + def __get_accel(self, axis): + if axis == "x": + return self.get_x() + elif axis == "y": + return self.get_y() + elif axis == "z": + return self.get_z() + + def __set_gesture(self, gesture): + if gesture in CONSTANTS.GESTURES: + self.__current_gesture = gesture + else: + self.__current_gesture = "" + + def __add_current_gesture_to_gesture_lists(self): + if self.__current_gesture in CONSTANTS.GESTURES: + self.__gestures.append(self.__current_gesture) + self.__prev_gestures.add(self.__current_gesture) diff --git a/src/microbit/__model/constants.py b/src/microbit/__model/constants.py index 7f566ea90..b8c87bf9c 100644 --- a/src/microbit/__model/constants.py +++ b/src/microbit/__model/constants.py @@ -112,6 +112,30 @@ BRIGHTNESS_MIN = 0 BRIGHTNESS_MAX = 9 +# sensor max/min values +MAX_TEMPERATURE = 125 +MIN_TEMPERATURE = -55 +MAX_LIGHT_LEVEL = 255 +MIN_LIGHT_LEVEL = 0 +MAX_ACCELERATION = 1023 +MIN_ACCELERATION = -1023 + +GESTURES = set( + [ + "up", + "down", + "left", + "right", + "face up", + "face down", + "freefall", + "3g", + "6g", + "8g", + "shake", + ] +) + # error messages BRIGHTNESS_ERR = "brightness out of bounds" COPY_ERR_MESSAGE = "please call copy function first" @@ -120,5 +144,6 @@ NOT_IMPLEMENTED_ERROR = "This method is not implemented by the simulator" UNSUPPORTED_ADD_TYPE = "unsupported types for __add__:" SAME_SIZE_ERR = "images must be the same size" +INVALID_GESTURE_ERR = "invalid gesture" TIME_DELAY = 0.03 diff --git a/src/microbit/__model/display.py b/src/microbit/__model/display.py index 2dfd7cc36..e5920a79f 100644 --- a/src/microbit/__model/display.py +++ b/src/microbit/__model/display.py @@ -13,9 +13,10 @@ class Display: def __init__(self): self.__image = Image() self.__on = True - self.__current_pid = None + self.__light_level = 0 self.__blank_image = Image() + self.__current_pid = None self.__lock = threading.Lock() def scroll(self, value, delay=150, wait=True, loop=False, monospace=False): @@ -226,13 +227,19 @@ def is_on(self): def read_light_level(self): """ - Not implemented yet. - Use the display's LEDs in reverse-bias mode to sense the amount of light falling on the display. Returns an integer between 0 and 255 representing the light level, with larger meaning more light. """ - raise NotImplementedError(CONSTANTS.NOT_IMPLEMENTED_ERROR) + return self.__light_level + + def __set_light_level(self, level): + if level < CONSTANTS.MIN_LIGHT_LEVEL: + self.__light_level = CONSTANTS.MIN_LIGHT_LEVEL + elif level > CONSTANTS.MAX_LIGHT_LEVEL: + self.__light_level = CONSTANTS.MAX_LIGHT_LEVEL + else: + self.__light_level = level # Helpers diff --git a/src/microbit/__model/microbit_model.py b/src/microbit/__model/microbit_model.py index a1de5045d..a6d585545 100644 --- a/src/microbit/__model/microbit_model.py +++ b/src/microbit/__model/microbit_model.py @@ -1,17 +1,22 @@ import time +from .accelerometer import Accelerometer from .button import Button from .display import Display +from . import constants as CONSTANTS class MicrobitModel: def __init__(self): # State in the Python process + self.accelerometer = Accelerometer() self.button_a = Button() self.button_b = Button() - self.__start_time = time.time() self.display = Display() + self.__start_time = time.time() + self.__temperature = 0 + def sleep(self, n): time.sleep(n / 1000) @@ -19,5 +24,16 @@ def running_time(self): print(f"time. time: {time.time()}") return time.time() - self.__start_time + def temperature(self): + return self.__temperature + + def __set_temperature(self, temperature): + if temperature < CONSTANTS.MIN_TEMPERATURE: + self.__temperature = CONSTANTS.MIN_TEMPERATURE + elif temperature > CONSTANTS.MAX_TEMPERATURE: + self.__temperature = CONSTANTS.MAX_TEMPERATURE + else: + self.__temperature = temperature + __mb = MicrobitModel() diff --git a/src/microbit/test/test_accelerometer.py b/src/microbit/test/test_accelerometer.py new file mode 100644 index 000000000..fc118fada --- /dev/null +++ b/src/microbit/test/test_accelerometer.py @@ -0,0 +1,95 @@ +import pytest +from unittest import mock + +from ..__model import constants as CONSTANTS +from ..__model.accelerometer import Accelerometer + + +class TestAccelerometer(object): + def setup_method(self): + self.accelerometer = Accelerometer() + + @pytest.mark.parametrize( + "accel, expected", + [ + (CONSTANTS.MIN_ACCELERATION - 10, CONSTANTS.MIN_ACCELERATION), + (CONSTANTS.MIN_ACCELERATION, CONSTANTS.MIN_ACCELERATION), + (100, 100), + (CONSTANTS.MAX_ACCELERATION, CONSTANTS.MAX_ACCELERATION), + (CONSTANTS.MAX_ACCELERATION + 1, CONSTANTS.MAX_ACCELERATION), + ], + ) + def test_x_y_z(self, accel, expected): + self.accelerometer._Accelerometer__set_x(accel) + assert expected == self.accelerometer.get_x() + self.accelerometer._Accelerometer__set_y(accel) + assert expected == self.accelerometer.get_y() + self.accelerometer._Accelerometer__set_z(accel) + assert expected == self.accelerometer.get_z() + + @pytest.mark.parametrize( + "accels, expected", + [ + ((23, 25, 26), (23, 25, 26)), + ((204, 234, -534), (204, 234, -534)), + ( + (CONSTANTS.MIN_ACCELERATION - 10, 234, CONSTANTS.MAX_ACCELERATION), + (CONSTANTS.MIN_ACCELERATION, 234, CONSTANTS.MAX_ACCELERATION), + ), + ], + ) + def test_get_values(self, accels, expected): + self.accelerometer._Accelerometer__set_x(accels[0]) + self.accelerometer._Accelerometer__set_y(accels[1]) + self.accelerometer._Accelerometer__set_z(accels[2]) + assert expected == self.accelerometer.get_values() + + @pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) + def test_current_gesture(self, gesture): + self.accelerometer._Accelerometer__set_gesture(gesture) + assert gesture == self.accelerometer.current_gesture() + + @pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) + def test_is_gesture(self, gesture): + self.accelerometer._Accelerometer__set_gesture(gesture) + assert self.accelerometer.is_gesture(gesture) + for g in CONSTANTS.GESTURES: + if g != gesture: + assert not self.accelerometer.is_gesture(g) + + def test_is_gesture_error(self): + with pytest.raises(ValueError): + self.accelerometer.is_gesture("sideways") + + def test_was_gesture(self): + mock_gesture_up = "up" + mock_gesture_down = "down" + + assert not self.accelerometer.was_gesture(mock_gesture_up) + self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) + self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. + self.accelerometer._Accelerometer__set_gesture("") + assert self.accelerometer.was_gesture(mock_gesture_up) + assert not self.accelerometer.was_gesture(mock_gesture_up) + + def test_was_gesture_error(self): + with pytest.raises(ValueError): + self.accelerometer.was_gesture("sideways") + + def test_get_gestures(self): + mock_gesture_up = "up" + mock_gesture_down = "down" + mock_gesture_freefall = "freefall" + self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) + self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. + self.accelerometer._Accelerometer__set_gesture(mock_gesture_down) + self.accelerometer.current_gesture() + self.accelerometer._Accelerometer__set_gesture(mock_gesture_freefall) + self.accelerometer.current_gesture() + self.accelerometer._Accelerometer__set_gesture("") + assert ( + mock_gesture_up, + mock_gesture_down, + mock_gesture_freefall, + ) == self.accelerometer.get_gestures() + assert () == self.accelerometer.get_gestures() diff --git a/src/microbit/test/test_display.py b/src/microbit/test/test_display.py index fc5c0ab34..dc5beafb1 100644 --- a/src/microbit/test/test_display.py +++ b/src/microbit/test/test_display.py @@ -157,6 +157,20 @@ def test_async_tests(self): self.display.show("6", delay=0) assert Image._Image__same_image(Image(STR_SIX), self.display._Display__image) + @pytest.mark.parametrize( + "light_level, expected", + [ + (CONSTANTS.MIN_LIGHT_LEVEL - 10, CONSTANTS.MIN_LIGHT_LEVEL), + (CONSTANTS.MIN_LIGHT_LEVEL, CONSTANTS.MIN_LIGHT_LEVEL), + (100, 100), + (CONSTANTS.MAX_LIGHT_LEVEL, CONSTANTS.MAX_LIGHT_LEVEL), + (CONSTANTS.MAX_LIGHT_LEVEL + 10, CONSTANTS.MAX_LIGHT_LEVEL), + ], + ) + def test_temperature(self, light_level, expected): + self.display._Display__set_light_level(light_level) + assert expected == self.display.read_light_level() + # Helpers def __is_clear(self): i = Image(CONSTANTS.BLANK_5X5) diff --git a/src/microbit/test/test_microbit_model.py b/src/microbit/test/test_microbit_model.py index 4ce6ca0a2..a6436ec71 100644 --- a/src/microbit/test/test_microbit_model.py +++ b/src/microbit/test/test_microbit_model.py @@ -3,6 +3,7 @@ import pytest from unittest import mock from ..__model.microbit_model import MicrobitModel +from ..__model import constants as CONSTANTS class TestMicrobitModel(object): @@ -24,3 +25,17 @@ def test_running_time(self): assert mock_end_time - mock_start_time == pytest.approx( self.__mb.running_time() ) + + @pytest.mark.parametrize( + "temperature, expected", + [ + (CONSTANTS.MIN_TEMPERATURE - 10, CONSTANTS.MIN_TEMPERATURE), + (CONSTANTS.MIN_TEMPERATURE, CONSTANTS.MIN_TEMPERATURE), + (0, 0), + (CONSTANTS.MAX_TEMPERATURE, CONSTANTS.MAX_TEMPERATURE), + (CONSTANTS.MAX_TEMPERATURE + 5, CONSTANTS.MAX_TEMPERATURE), + ], + ) + def test_temperature(self, temperature, expected): + self.__mb._MicrobitModel__set_temperature(temperature) + assert expected == self.__mb.temperature() diff --git a/src/microbit/test/test_shim.py b/src/microbit/test/test_shim.py index 25c1afac8..fb25d2c16 100644 --- a/src/microbit/test/test_shim.py +++ b/src/microbit/test/test_shim.py @@ -20,3 +20,8 @@ def test_running_time(self): MicrobitModel.running_time = mock.Mock() running_time() MicrobitModel.running_time.assert_called_once() + + def test_temperature(self): + MicrobitModel.temperature = mock.Mock() + temperature() + MicrobitModel.temperature.asser_called_once() From 1916b493c7af2b38b46e55c1fc5432c76633c477 Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Mon, 10 Feb 2020 15:05:32 -0800 Subject: [PATCH 11/40] Updated tests --- src/microbit/test/test_accelerometer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/microbit/test/test_accelerometer.py b/src/microbit/test/test_accelerometer.py index fc118fada..dcd461fee 100644 --- a/src/microbit/test/test_accelerometer.py +++ b/src/microbit/test/test_accelerometer.py @@ -64,7 +64,6 @@ def test_is_gesture_error(self): def test_was_gesture(self): mock_gesture_up = "up" mock_gesture_down = "down" - assert not self.accelerometer.was_gesture(mock_gesture_up) self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. From ae1a4eba39ce30c0406075e47136285569d139fb Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Mon, 10 Feb 2020 15:05:51 -0800 Subject: [PATCH 12/40] Updated tests --- src/microbit/test/test_accelerometer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/microbit/test/test_accelerometer.py b/src/microbit/test/test_accelerometer.py index dcd461fee..df9ea281c 100644 --- a/src/microbit/test/test_accelerometer.py +++ b/src/microbit/test/test_accelerometer.py @@ -64,6 +64,7 @@ def test_is_gesture_error(self): def test_was_gesture(self): mock_gesture_up = "up" mock_gesture_down = "down" + assert not self.accelerometer.was_gesture(mock_gesture_up) self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. @@ -79,6 +80,7 @@ def test_get_gestures(self): mock_gesture_up = "up" mock_gesture_down = "down" mock_gesture_freefall = "freefall" + self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. self.accelerometer._Accelerometer__set_gesture(mock_gesture_down) From 20fc7244b78b5259019e6f4586a5898586794c52 Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Mon, 10 Feb 2020 15:09:41 -0800 Subject: [PATCH 13/40] Added docs link --- src/microbit/__model/accelerometer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/microbit/__model/accelerometer.py b/src/microbit/__model/accelerometer.py index 732503500..8655e147a 100644 --- a/src/microbit/__model/accelerometer.py +++ b/src/microbit/__model/accelerometer.py @@ -4,6 +4,7 @@ class Accelerometer: + # The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/accelerometer.html. def __init__(self): self.__x = 0 self.__y = 0 From 120f42d2227838950116c0bcb2938d3be1c2b930 Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Mon, 10 Feb 2020 15:11:05 -0800 Subject: [PATCH 14/40] Rearranged variables to be sorted --- src/microbit/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/microbit/__init__.py b/src/microbit/__init__.py index a87cd59dc..bdf3f0779 100644 --- a/src/microbit/__init__.py +++ b/src/microbit/__init__.py @@ -1,10 +1,10 @@ from .__model.image import Image from .__model.microbit_model import __mb +accelerometer = __mb.accelerometer button_a = __mb.button_a button_b = __mb.button_b display = __mb.display -accelerometer = __mb.accelerometer def sleep(n): From 41d1a4af70bdf44a57b8d090cf422deaf1dda00c Mon Sep 17 00:00:00 2001 From: xnkevinnguyen Date: Mon, 10 Feb 2020 15:14:50 -0800 Subject: [PATCH 15/40] Create accelerometer sensor --- package-lock.json | 3585 +++++------------ src/view/components/cpx/Cpx.tsx | 24 +- src/view/components/microbit/Microbit.tsx | 20 +- .../components/toolbar/MotionSensorBar.tsx | 212 - .../components/toolbar/SensorModalUtils.tsx | 45 +- .../toolbar/motion/Accelerometer.tsx | 11 + .../toolbar/motion/MotionSensorBar.tsx | 133 + .../ThreeDimensionSlider.tsx | 121 + src/view/translations/en.json | 75 +- 9 files changed, 1310 insertions(+), 2916 deletions(-) delete mode 100644 src/view/components/toolbar/MotionSensorBar.tsx create mode 100644 src/view/components/toolbar/motion/Accelerometer.tsx create mode 100644 src/view/components/toolbar/motion/MotionSensorBar.tsx create mode 100644 src/view/components/toolbar/motion/threeDimensionSlider/ThreeDimensionSlider.tsx diff --git a/package-lock.json b/package-lock.json index 8a763baf1..cade389d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3270,16 +3270,6 @@ "regenerator-runtime": "^0.13.2" } }, - "@babel/runtime-corejs3": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.8.4.tgz", - "integrity": "sha512-+wpLqy5+fbQhvbllvlJEVRIpYj+COUWnnsm+I4jZlA8Lo7/MJmBhGTCHyk1/RWfOqBRJ2MbadddG6QltTKTlrg==", - "dev": true, - "requires": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.2" - } - }, "@babel/template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", @@ -3337,9 +3327,9 @@ "dev": true }, "@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-9.0.1.tgz", + "integrity": "sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==", "dev": true }, "@formatjs/intl-relativetimeformat": { @@ -3391,9 +3381,9 @@ "dev": true }, "@hapi/hoek": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", - "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", "dev": true }, "@hapi/joi": { @@ -5351,220 +5341,19 @@ } }, "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.1.0.tgz", + "integrity": "sha512-d09ehQWqLMywP/PT/5JvXwPskPK9QCXUjiSkAHehreB381qExXf5JFCBWhfEyNonRbkIneCeYM99w+Ud48YIQQ==", "dev": true, "requires": { - "@babel/core": "^7.4.5", + "@babel/core": "^7.1.6", "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", + "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@svgr/core": "^4.1.0", + "@svgr/plugin-jsx": "^4.1.0", + "@svgr/plugin-svgo": "^4.0.3", + "loader-utils": "^1.1.0" } }, "@testing-library/dom": { @@ -5705,12 +5494,6 @@ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -5772,12 +5555,6 @@ "jest-diff": "^24.3.0" } }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", - "dev": true - }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -5898,86 +5675,42 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, "@typescript-eslint/eslint-plugin": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.19.0.tgz", - "integrity": "sha512-u7IcQ9qwsB6U806LupZmINRnQjC+RJyv36sV/ugaFWMHTbFm/hlLTRx3gGYJgHisxcGSTnf+I/fPDieRMhPSQQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "2.19.0", - "eslint-utils": "^1.4.3", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.19.0.tgz", - "integrity": "sha512-zwpg6zEOPbhB3+GaQfufzlMUOO6GXCNZq6skk+b2ZkZAIoBhVoanWK255BS1g5x9bMwHpLhX0Rpn5Fc3NdCZdg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.6.0.tgz", + "integrity": "sha512-U224c29E2lo861TQZs6GSmyC0OYeRNg6bE9UVIiFBxN2MlA0nq2dCrgIVyyRbC05UOcrgf2Wk/CF2gGOPQKUSQ==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.19.0", - "eslint-scope": "^5.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } + "@typescript-eslint/parser": "1.6.0", + "@typescript-eslint/typescript-estree": "1.6.0", + "requireindex": "^1.2.0", + "tsutils": "^3.7.0" } }, "@typescript-eslint/parser": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.19.0.tgz", - "integrity": "sha512-s0jZoxAWjHnuidbbN7aA+BFVXn4TCcxEVGPV8lWMxZglSs3NRnFFAlL+aIENNmzB2/1jUJuySi6GiM6uACPmpg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.6.0.tgz", + "integrity": "sha512-VB9xmSbfafI+/kI4gUK3PfrkGmrJQfh0N4EScT1gZXSZyUxpsBirPL99EWZg9MmPG0pzq/gMtgkk7/rAHj4aQw==", "dev": true, "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.19.0", - "@typescript-eslint/typescript-estree": "2.19.0", - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/typescript-estree": "1.6.0", + "eslint-scope": "^4.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.19.0.tgz", - "integrity": "sha512-n6/Xa37k0jQdwpUszffi19AlNbVCR0sdvCs3DmSKMD7wBttKY31lhD2fug5kMD91B2qW4mQldaTEc1PEzvGu8w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.6.0.tgz", + "integrity": "sha512-A4CanUwfaG4oXobD5y7EXbsOHjCwn8tj1RDd820etpPAjH+Icjc2K9e/DQM1Hac5zH2BSy+u6bjvvF2wwREvYA==", "dev": true, "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^6.3.0", - "tsutils": "^3.17.1" + "lodash.unescape": "4.0.1", + "semver": "5.5.0" }, "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true } } @@ -6342,51 +6075,6 @@ "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", "dev": true }, - "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", - "dev": true, - "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - }, - "dependencies": { - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -6401,16 +6089,6 @@ "es6-promisify": "^5.0.0" } }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", @@ -6456,13 +6134,10 @@ } }, "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true }, "ansi-gray": { "version": "0.1.1", @@ -6561,12 +6236,6 @@ "commander": "^2.11.0" } }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -6785,69 +6454,6 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", @@ -7067,14 +6673,10 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "axobject-query": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.1.tgz", - "integrity": "sha512-lF98xa/yvy6j3fBHAgQXIYl+J4eZadOSqsPojemUqClzNbBV38wWGpUbQbVEyf4eUF5yF7eHmGgGA2JiHyjeqw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.4", - "@babel/runtime-corejs3": "^7.7.4" - } + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", + "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==", + "dev": true }, "azure-devops-node-api": { "version": "7.2.0", @@ -7108,26 +6710,27 @@ } }, "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz", + "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.0.0", "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" }, "dependencies": { - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "path-parse": "^1.0.6" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } } } @@ -7618,23 +7221,15 @@ } }, "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", + "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", "dev": true, "requires": { "find-cache-dir": "^2.0.0", "loader-utils": "^1.0.2", "mkdirp": "^0.5.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } + "util.promisify": "^1.0.0" } }, "babel-plugin-dynamic-import-node": { @@ -7719,9 +7314,9 @@ "dev": true }, "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -8475,6 +8070,39 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -8554,9 +8182,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001025", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001025.tgz", - "integrity": "sha512-SKyFdHYfXUZf5V85+PJgLYyit27q4wgvZuf8QTOk1osbypcROihMBlx9GRar2/pIcKH2r4OehdlBr9x6PXetAQ==", + "version": "1.0.30001027", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001027.tgz", + "integrity": "sha512-7xvKeErvXZFtUItTHgNtLgS9RJpVnwBlWX8jSo/BO8VsF6deszemZSkJJJA1KOKrXuzZH4WALpAJdq5EyfgMLg==", "dev": true }, "capture-exit": { @@ -8568,9 +8196,9 @@ } }, "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==", "dev": true }, "caseless": { @@ -8731,19 +8359,13 @@ "source-map": "~0.6.0" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -8994,15 +8616,6 @@ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "requires": { - "arity-n": "^1.0.4" - } - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -9201,12 +8814,6 @@ } } }, - "core-js-pure": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz", - "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -10464,15 +10071,15 @@ } }, "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", "dev": true }, "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", + "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", "dev": true }, "duplexer": { @@ -10519,9 +10126,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.345", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.345.tgz", - "integrity": "sha512-f8nx53+Z9Y+SPWGg3YdHrbYYfIJAtbUjpFfW4X1RwTZ94iUG7geg9tV8HqzAXX7XTNgyWgAFvce4yce8ZKxKmg==", + "version": "1.3.347", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.347.tgz", + "integrity": "sha512-IityliF5ZY4nLa4DaXOGrWVeTK3OcN6LJECVe60DOX/SEF0zohVRxZHJXu4ZA8bW0A3K6Skcn67G20MGXOqhaA==", "dev": true }, "elliptic": { @@ -10810,54 +10417,53 @@ } }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", + "ajv": "^6.9.1", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob": "^7.1.2", + "globals": "^11.7.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.14", + "lodash": "^4.17.11", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { @@ -10880,34 +10486,6 @@ "supports-color": "^5.3.0" } }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -10918,53 +10496,21 @@ "resolve-from": "^4.0.0" } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^3.0.0" } }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10977,12 +10523,12 @@ } }, "eslint-config-react-app": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.0.tgz", - "integrity": "sha512-WrHjoGpKr1kLLiWDD81tme9jMM0hk5cMxasLSdyno6DdPt+IfLOrDJBVo6jN7tn4y1nzhs43TmUaZWO6Sf0blw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-4.0.1.tgz", + "integrity": "sha512-ZsaoXUIGsK8FCi/x4lT2bZR5mMkL/Kgj+Lnw690rbvvUr/uiwgFiD8FcfAhkCycm7Xte6O5lYz4EqMx2vX7jgw==", "dev": true, "requires": { - "confusing-browser-globals": "^1.0.9" + "confusing-browser-globals": "^1.0.7" } }, "eslint-import-resolver-node": { @@ -11011,9 +10557,9 @@ "dev": true }, "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -11022,50 +10568,25 @@ } }, "eslint-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", - "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.2.tgz", + "integrity": "sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg==", "dev": true, "requires": { - "fs-extra": "^8.1.0", - "loader-fs-cache": "^1.0.2", - "loader-utils": "^1.2.3", - "object-hash": "^2.0.1", - "schema-utils": "^2.6.1" + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" }, "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" + "glob": "^7.1.3" } } } @@ -11150,32 +10671,30 @@ } }, "eslint-plugin-flowtype": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz", - "integrity": "sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ==", + "version": "2.50.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.1.tgz", + "integrity": "sha512-9kRxF9hfM/O6WGZcZPszOVPd2W0TLHBtceulLTsGfwMPtiCCLnCW0ssRiOOiXyqrCA20pm1iXdXm7gQeN306zQ==", "dev": true, "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.10" } }, "eslint-plugin-import": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", - "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", + "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", "dev": true, "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", + "eslint-module-utils": "^2.3.0", "has": "^1.0.3", + "lodash": "^4.17.11", "minimatch": "^3.0.4", - "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" + "resolve": "^1.9.0" }, "dependencies": { "debug": { @@ -11302,25 +10821,15 @@ "find-up": "^2.0.0", "read-pkg": "^2.0.0" } - }, - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } } } }, "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.1.tgz", + "integrity": "sha512-cjN2ObWrRz0TTw7vEcGQrx+YltMvZoOEx4hWU8eEERDnBIU00OTq7Vr+jA7DFKxiwLNv4tTh5Pq2GUNEa8b6+w==", "dev": true, "requires": { - "@babel/runtime": "^7.4.5", "aria-query": "^3.0.0", "array-includes": "^3.0.3", "ast-types-flow": "^0.0.7", @@ -11328,24 +10837,22 @@ "damerau-levenshtein": "^1.0.4", "emoji-regex": "^7.0.2", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" + "jsx-ast-utils": "^2.0.1" } }, "eslint-plugin-react": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz", - "integrity": "sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ==", + "version": "7.12.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz", + "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==", "dev": true, "requires": { - "array-includes": "^3.1.1", + "array-includes": "^3.0.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", - "prop-types": "^15.7.2", - "resolve": "^1.14.2" + "jsx-ast-utils": "^2.0.1", + "object.fromentries": "^2.0.0", + "prop-types": "^15.6.2", + "resolve": "^1.9.0" }, "dependencies": { "doctrine": { @@ -11356,78 +10863,6 @@ "requires": { "esutils": "^2.0.2" } - }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } } } }, @@ -11463,22 +10898,14 @@ "dev": true }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "dev": true, "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", - "dev": true - } + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "esprima": { @@ -12101,9 +11528,9 @@ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" @@ -12133,9 +11560,9 @@ "dev": true }, "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -12151,49 +11578,13 @@ } }, "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", "dev": true, "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" } }, "file-uri-to-path": { @@ -12204,9 +11595,9 @@ "optional": true }, "filesize": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", - "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", "dev": true }, "fill-range": { @@ -12417,14 +11808,14 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "fork-ts-checker-webpack-plugin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", - "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-zEhg7Hz+KhZlBhILYpXy+Beu96gwvkROWJiTXOCyOOMMrdBIRPvsBpBqgTI4jfJGrJXcqGwJR8zsBGDmzY0jsA==", "dev": true, "requires": { "babel-code-frame": "^6.22.0", "chalk": "^2.4.1", - "chokidar": "^3.3.0", + "chokidar": "^2.0.4", "micromatch": "^3.1.10", "minimatch": "^3.0.4", "semver": "^5.6.0", @@ -12441,31 +11832,6 @@ "color-convert": "^1.9.0" } }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -12477,77 +11843,6 @@ "supports-color": "^5.3.0" } }, - "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -12556,15 +11851,6 @@ "requires": { "has-flag": "^3.0.0" } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, @@ -12615,31 +11901,14 @@ } }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "requires": { - "graceful-fs": "^4.2.0", + "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" } }, "fs-mkdirp-stream": { @@ -14062,59 +13331,40 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" }, - "html-minifier-terser": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.2.tgz", - "integrity": "sha512-VAaitmbBuHaPKv9bj47XKypRhgDxT/cDLvsPiiF7w+omrN3K0eQhpigV9Z1ilrmHa9e0rOYcD6R/+LCDADGcnQ==", + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", "dev": true, "requires": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^4.0.0", - "he": "^1.2.0", - "param-case": "^2.1.1", - "relateurl": "^0.2.7", - "terser": "^4.3.9" + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" }, "dependencies": { "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true - }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } } } }, "html-webpack-plugin": { - "version": "4.0.0-beta.11", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz", - "integrity": "sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg==", + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz", + "integrity": "sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ==", "dev": true, "requires": { - "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.15", + "html-minifier": "^3.5.20", + "loader-utils": "^1.1.0", + "lodash": "^4.17.11", "pretty-error": "^2.1.1", - "tapable": "^1.1.3", + "tapable": "^1.1.0", "util.promisify": "1.0.0" } }, @@ -14408,30 +13658,30 @@ "dev": true }, "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, "requires": { - "ansi-escapes": "^4.2.1", + "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", + "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { @@ -14454,62 +13704,14 @@ "supports-color": "^5.3.0" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } }, "supports-color": { "version": "5.5.0", @@ -14790,12 +13992,6 @@ "path-is-inside": "^1.0.2" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -15909,139 +15105,16 @@ } }, "jest-environment-jsdom-fourteen": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz", - "integrity": "sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-0.1.0.tgz", + "integrity": "sha512-4vtoRMg7jAstitRzL4nbw83VmGH8Rs13wrND3Ud2o1fczDhMUF32iIrNKwYGgeOPUdfvZU4oy8Bbv+ni1fgVCA==", "dev": true, "requires": { - "@jest/environment": "^24.3.0", - "@jest/fake-timers": "^24.3.0", - "@jest/types": "^24.3.0", - "jest-mock": "^24.0.0", - "jest-util": "^24.0.0", - "jsdom": "^14.1.0" + "jest-mock": "^24.5.0", + "jest-util": "^24.5.0", + "jsdom": "^14.0.0" }, "dependencies": { - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "jsdom": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", @@ -16076,15 +15149,6 @@ "xml-name-validator": "^3.0.0" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -16863,12 +15927,12 @@ "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==" }, "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.7.1.tgz", + "integrity": "sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw==", "dev": true, "requires": { - "@jest/types": "^24.9.0", + "@jest/types": "^24.7.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -17893,17 +16957,16 @@ } }, "jest-watch-typeahead": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", - "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.3.0.tgz", + "integrity": "sha512-+uOtlppt9ysST6k6ZTqsPI0WNz2HLa8bowiZylZoQCQaAVn7XsVmHhZREkz73FhKelrFrpne4hQQjdq42nFEmA==", "dev": true, "requires": { - "ansi-escapes": "^4.2.1", + "ansi-escapes": "^3.0.0", "chalk": "^2.4.1", - "jest-regex-util": "^24.9.0", "jest-watcher": "^24.3.0", - "slash": "^3.0.0", - "string-length": "^3.1.0", + "slash": "^2.0.0", + "string-length": "^2.0.0", "strip-ansi": "^5.0.0" }, "dependencies": { @@ -17933,28 +16996,6 @@ "supports-color": "^5.3.0" } }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "dev": true, - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -18001,12 +17042,6 @@ "@types/yargs": "^13.0.0" } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -18550,6 +17585,12 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -18569,6 +17610,12 @@ "lodash._reinterpolate": "^3.0.0" } }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -18616,9 +17663,9 @@ } }, "loglevel": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", - "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", "dev": true }, "lolex": { @@ -18945,9 +17992,9 @@ } }, "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "min-indent": { @@ -18956,13 +18003,12 @@ "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=" }, "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", + "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==", "dev": true, "requires": { "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", "schema-utils": "^1.0.0", "webpack-sources": "^1.1.0" } @@ -18992,50 +18038,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -19478,9 +18480,9 @@ } }, "node-releases": { - "version": "1.1.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", - "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", + "version": "1.1.48", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.48.tgz", + "integrity": "sha512-Hr8BbmUl1ujAST0K0snItzEA5zkJTQup8VNTKNfT6Zw8vTJkIiagUPNfxHmgDOyfFYNfKAul40sD0UEYTvwebw==", "dev": true, "requires": { "semver": "^6.3.0" @@ -19521,16 +18523,10 @@ "dev": true }, "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true }, "now-and-later": { "version": "2.0.1", @@ -19660,9 +18656,9 @@ } }, "object-hash": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.1.tgz", - "integrity": "sha512-HgcGMooY4JC2PBt9sdUdJ6PMzpin+YtY3r/7wg0uTifP+HJWW8rammseSEHuyt0UeShI183UGssCJqm1bJR7QA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", "dev": true }, "object-inspect": { @@ -19682,12 +18678,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", - "dev": true - }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -19991,12 +18981,12 @@ } }, "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^1.0.0" } }, "open": { @@ -20017,12 +19007,12 @@ } }, "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A==", "dev": true, "requires": { - "cssnano": "^4.1.10", + "cssnano": "^4.1.0", "last-call-webpack-plugin": "^3.0.0" } }, @@ -20152,15 +19142,6 @@ "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", "dev": true }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -20448,12 +19429,57 @@ } }, "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } } }, "plugin-error": { @@ -20514,12 +19540,12 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, "pnp-webpack-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.0.tgz", - "integrity": "sha512-ZcMGn/xF/fCOq+9kWMP9vVVxjIkMCja72oy3lziR7UHy0hHFZ57iVpQ71OtveVbmzeCmphBg8pxNdk/hlK99aQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.2.1.tgz", + "integrity": "sha512-W6GctK7K2qQiVR+gYSv/Gyt6jwwIH4vwdviFqx+Y2jAtVf5eZyYIDf5Ac2NCDMBiX5yWscBLZElPTsyA1UtVVA==", "dev": true, "requires": { - "ts-pnp": "^1.1.2" + "ts-pnp": "^1.0.0" } }, "portfinder": { @@ -20651,12 +19677,12 @@ } }, "postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-2.0.0.tgz", + "integrity": "sha512-xGG0UvoxwBc4Yx4JX3gc0RuDl1kc4bVihCzzk6UC72YPfq5fu3c717Nu8Un3nvnq1BJ31gBnFXIG/OaUTnpHgA==", "dev": true, "requires": { - "postcss": "^7" + "postcss": "^7.0.2" }, "dependencies": { "ansi-styles": { @@ -23183,16 +22209,15 @@ } }, "postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-7.0.1.tgz", + "integrity": "sha512-NOp1fwrG+6kVXWo7P9SizCHX6QvioxFD/hZcI2MLxPmVnFJFC0j0DDpIuNw2tUDeCFMni59gCVgeJ1/hYhj2OQ==", "dev": true, "requires": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" + "@csstools/normalize.css": "^9.0.1", + "browserslist": "^4.1.1", + "postcss": "^7.0.2", + "postcss-browser-comments": "^2.0.0" }, "dependencies": { "ansi-styles": { @@ -23739,12 +22764,6 @@ } } }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, "postcss": { "version": "7.0.26", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", @@ -24082,27 +23101,27 @@ } }, "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.6.0.tgz", + "integrity": "sha512-I3zAiycfqXpPIFD6HXhLfWXIewAWO8emOKz+QSsxaUZb9Dp8HbF5kUf+4Wy/AxR33o+LRoO8blEWCHth0ZsCLA==", "dev": true, "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", + "autoprefixer": "^9.4.9", + "browserslist": "^4.4.2", + "caniuse-lite": "^1.0.30000939", "css-blank-pseudo": "^0.1.4", "css-has-pseudo": "^0.10.0", "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", + "cssdb": "^4.3.0", + "postcss": "^7.0.14", "postcss-attribute-case-insensitive": "^4.0.1", "postcss-color-functional-notation": "^2.0.1", "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-hex-alpha": "^5.0.2", "postcss-color-mod-function": "^3.0.3", "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", + "postcss-custom-media": "^7.0.7", + "postcss-custom-properties": "^8.0.9", "postcss-custom-selectors": "^5.1.2", "postcss-dir-pseudo-class": "^5.0.0", "postcss-double-position-gradients": "^1.0.0", @@ -24809,12 +23828,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, "prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", @@ -25029,16 +24042,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -25153,80 +24156,51 @@ } }, "react-dev-utils": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.1.0.tgz", - "integrity": "sha512-KmZChqxY6l+ed28IHetGrY8J9yZSvzlAHyFXduEIhQ42EBGtqftlbqQZ+dDTaC7CwNW2tuXN+66bRKE5h2HgrQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.1.0.tgz", + "integrity": "sha512-X2KYF/lIGyGwP/F/oXgGDF24nxDA2KC4b7AFto+eqzc/t838gpSGiaU8trTqHXOohuLxxc5qi1eDzsl9ucPDpg==", "dev": true, "requires": { - "@babel/code-frame": "7.8.3", + "@babel/code-frame": "7.5.5", "address": "1.1.2", - "browserslist": "4.8.6", - "chalk": "3.0.0", - "cross-spawn": "7.0.1", + "browserslist": "4.7.0", + "chalk": "2.4.2", + "cross-spawn": "6.0.5", "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.0.1", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "3.1.1", + "escape-string-regexp": "1.0.5", + "filesize": "3.6.1", + "find-up": "3.0.0", + "fork-ts-checker-webpack-plugin": "1.5.0", "global-modules": "2.0.0", "globby": "8.0.2", "gzip-size": "5.1.1", "immer": "1.10.0", - "inquirer": "7.0.4", + "inquirer": "6.5.0", "is-root": "2.1.0", "loader-utils": "1.2.3", - "open": "^6.4.0", - "pkg-up": "3.1.0", - "react-error-overlay": "^6.0.5", + "open": "^6.3.0", + "pkg-up": "2.0.0", + "react-error-overlay": "^6.0.3", "recursive-readdir": "2.2.2", "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", + "sockjs-client": "1.4.0", + "strip-ansi": "5.2.0", "text-table": "0.2.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } + "@babel/highlight": "^7.0.0" } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { @@ -25238,130 +24212,49 @@ "color-convert": "^1.9.0" } }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "browserslist": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" } }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, "shell-quote": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", @@ -25369,12 +24262,12 @@ "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^4.1.0" } }, "supports-color": { @@ -25385,15 +24278,6 @@ "requires": { "has-flag": "^3.0.0" } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -25437,218 +24321,70 @@ "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" }, "react-scripts": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.3.1.tgz", - "integrity": "sha512-DHvc+/QN0IsLvmnPQqd+H70ol+gdFD3p/SS2tX8M6z1ysjtRGvOwLWy72co1nphYGpq1NqV/Ti5dviU8SCAXpA==", - "dev": true, - "requires": { - "@babel/core": "7.8.4", - "@svgr/webpack": "4.3.3", - "@typescript-eslint/eslint-plugin": "^2.10.0", - "@typescript-eslint/parser": "^2.10.0", - "babel-eslint": "10.0.3", - "babel-jest": "^24.9.0", - "babel-loader": "8.0.6", - "babel-plugin-named-asset-import": "^0.3.6", - "babel-preset-react-app": "^9.1.1", - "camelcase": "^5.3.1", - "case-sensitive-paths-webpack-plugin": "2.3.0", - "css-loader": "3.4.2", - "dotenv": "8.2.0", - "dotenv-expand": "5.1.0", - "eslint": "^6.6.0", - "eslint-config-react-app": "^5.2.0", - "eslint-loader": "3.0.3", - "eslint-plugin-flowtype": "4.6.0", - "eslint-plugin-import": "2.20.0", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.18.0", - "eslint-plugin-react-hooks": "^1.6.1", - "file-loader": "4.3.0", - "fs-extra": "^8.1.0", - "fsevents": "2.1.2", - "html-webpack-plugin": "4.0.0-beta.11", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.0.1.tgz", + "integrity": "sha512-LKEjBhVpEB+c312NeJhzF+NATxF7JkHNr5GhtwMeRS1cMeLElMeIu8Ye7WGHtDP7iz7ra4ryy48Zpo6G/cwWUw==", + "dev": true, + "requires": { + "@babel/core": "7.4.3", + "@svgr/webpack": "4.1.0", + "@typescript-eslint/eslint-plugin": "1.6.0", + "@typescript-eslint/parser": "1.6.0", + "babel-eslint": "10.0.1", + "babel-jest": "^24.8.0", + "babel-loader": "8.0.5", + "babel-plugin-named-asset-import": "^0.3.2", + "babel-preset-react-app": "^9.0.0", + "camelcase": "^5.2.0", + "case-sensitive-paths-webpack-plugin": "2.2.0", + "css-loader": "2.1.1", + "dotenv": "6.2.0", + "dotenv-expand": "4.2.0", + "eslint": "^5.16.0", + "eslint-config-react-app": "^4.0.1", + "eslint-loader": "2.1.2", + "eslint-plugin-flowtype": "2.50.1", + "eslint-plugin-import": "2.16.0", + "eslint-plugin-jsx-a11y": "6.2.1", + "eslint-plugin-react": "7.12.4", + "eslint-plugin-react-hooks": "^1.5.0", + "file-loader": "3.0.1", + "fs-extra": "7.0.1", + "fsevents": "2.0.6", + "html-webpack-plugin": "4.0.0-beta.5", "identity-obj-proxy": "3.0.0", - "jest": "24.9.0", - "jest-environment-jsdom-fourteen": "1.0.1", - "jest-resolve": "24.9.0", - "jest-watch-typeahead": "0.4.2", - "mini-css-extract-plugin": "0.9.0", - "optimize-css-assets-webpack-plugin": "5.0.3", - "pnp-webpack-plugin": "1.6.0", + "is-wsl": "^1.1.0", + "jest": "24.7.1", + "jest-environment-jsdom-fourteen": "0.1.0", + "jest-resolve": "24.7.1", + "jest-watch-typeahead": "0.3.0", + "mini-css-extract-plugin": "0.5.0", + "optimize-css-assets-webpack-plugin": "5.0.1", + "pnp-webpack-plugin": "1.2.1", "postcss-flexbugs-fixes": "4.1.0", "postcss-loader": "3.0.0", - "postcss-normalize": "8.0.1", - "postcss-preset-env": "6.7.0", + "postcss-normalize": "7.0.1", + "postcss-preset-env": "6.6.0", "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.6", - "react-dev-utils": "^10.1.0", - "resolve": "1.15.0", - "resolve-url-loader": "3.1.1", - "sass-loader": "8.0.2", - "semver": "6.3.0", - "style-loader": "1.1.3", - "terser-webpack-plugin": "2.3.4", - "ts-pnp": "1.1.5", - "url-loader": "2.3.0", - "webpack": "4.41.5", - "webpack-dev-server": "3.10.1", - "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "4.3.1" + "react-app-polyfill": "^1.0.1", + "react-dev-utils": "^9.0.1", + "resolve": "1.10.0", + "sass-loader": "7.1.0", + "semver": "6.0.0", + "style-loader": "0.23.1", + "terser-webpack-plugin": "1.2.3", + "ts-pnp": "1.1.2", + "url-loader": "1.1.2", + "webpack": "4.29.6", + "webpack-dev-server": "3.2.1", + "webpack-manifest-plugin": "2.0.4", + "workbox-webpack-plugin": "4.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "dev": true, "requires": { "@jest/console": "^24.7.1", @@ -25679,6 +24415,21 @@ "rimraf": "^2.5.4", "slash": "^2.0.0", "strip-ansi": "^5.0.0" + }, + "dependencies": { + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + } } }, "@jest/environment": { @@ -25722,11 +24473,18 @@ "string-length": "^2.0.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } } } }, @@ -25764,14 +24522,6 @@ "slash": "^2.0.0", "source-map": "^0.6.1", "write-file-atomic": "2.4.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@jest/types": { @@ -25791,30 +24541,6 @@ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -25864,40 +24590,6 @@ "babel-plugin-jest-hoist": "^24.9.0" } }, - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - } - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -25909,12 +24601,6 @@ "supports-color": "^5.3.0" } }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true - }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -25926,41 +24612,25 @@ "wrap-ansi": "^5.1.0" } }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", "dev": true, "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", "loader-utils": "^1.2.3", "normalize-path": "^3.0.0", - "postcss": "^7.0.23", + "postcss": "^7.0.14", "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" } }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, "expect": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", @@ -25975,38 +24645,10 @@ "jest-regex-util": "^24.9.0" } }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - } - } - }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.6.tgz", + "integrity": "sha512-vfmKZp3XPM36DNF0qhW+Cdxk7xm7gTEHY1clv1Xq1arwRQuKZgAhw+NZNWbJBtuaNxzNXwhfdPYRrvIbjfS33A==", "dev": true, "optional": true }, @@ -26058,14 +24700,6 @@ "make-dir": "^2.1.0", "rimraf": "^2.6.3", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "istanbul-reports": { @@ -26078,13 +24712,13 @@ } }, "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.7.1.tgz", + "integrity": "sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.9.0" + "jest-cli": "^24.7.1" }, "dependencies": { "jest-cli": { @@ -26144,6 +24778,21 @@ "micromatch": "^3.1.10", "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" + }, + "dependencies": { + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + } } }, "jest-docblock": { @@ -26851,6 +25500,21 @@ "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" + }, + "dependencies": { + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + } } }, "jest-runtime": { @@ -26882,6 +25546,21 @@ "slash": "^2.0.0", "strip-bom": "^3.0.0", "yargs": "^13.3.0" + }, + "dependencies": { + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + } } }, "jest-serializer": { @@ -26909,6 +25588,27 @@ "natural-compare": "^1.4.0", "pretty-format": "^24.9.0", "semver": "^6.2.0" + }, + "dependencies": { + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "jest-validate": { @@ -26980,61 +25680,6 @@ "xml-name-validator": "^3.0.0" } }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, "node-notifier": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", @@ -27068,75 +25713,15 @@ "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", "dev": true, "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - } + "p-reduce": "^1.0.0" } }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, "postcss": { "version": "7.0.26", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", @@ -27148,12 +25733,6 @@ "supports-color": "^6.1.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -27175,15 +25754,14 @@ } }, "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", "dev": true, "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" } }, "postcss-modules-scope": { @@ -27197,31 +25775,19 @@ } }, "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", "dev": true, "requires": { - "icss-utils": "^4.0.0", + "icss-replace-symbols": "^1.1.0", "postcss": "^7.0.6" } }, - "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -27236,44 +25802,12 @@ "glob": "^7.1.3" } }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", "dev": true }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -27295,13 +25829,13 @@ } }, "style-loader": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", - "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", "dev": true, "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.6.4" + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" } }, "supports-color": { @@ -27313,73 +25847,20 @@ "has-flag": "^3.0.0" } }, - "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "terser-webpack-plugin": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.4.tgz", - "integrity": "sha512-Nv96Nws2R2nrFOpbzF6IxRDpIkkIfmhvOws+IqMvYdFLO7o6wAILWFKONFgaYy8+T4LVz77DQW0f7wOeDEAjrg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz", + "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==", "dev": true, "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.2.0", - "jest-worker": "^25.1.0", - "p-limit": "^2.2.2", - "schema-utils": "^2.6.4", - "serialize-javascript": "^2.1.2", + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", "source-map": "^0.6.1", - "terser": "^4.4.3", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "terser": "^3.16.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" } }, "throat": { @@ -27388,50 +25869,36 @@ "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", "dev": true }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, "webpack": { - "version": "4.41.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", - "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", + "version": "4.29.6", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.6.tgz", + "integrity": "sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/wasm-edit": "1.8.5", "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", + "eslint-scope": "^4.0.0", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" }, "dependencies": { "acorn": { @@ -27439,110 +25906,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", "dev": true - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - } - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -27757,12 +26120,6 @@ "safe-regex": "^1.1.0" } }, - "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", - "dev": true - }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", @@ -27827,9 +26184,9 @@ } }, "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, "regexpu-core": { @@ -28019,6 +26376,12 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, + "requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -28097,93 +26460,13 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, - "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "2.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "^5.1.0", + "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, @@ -28192,36 +26475,6 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -28318,89 +26571,64 @@ "walker": "~1.0.5" } }, - "sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==", - "dev": true - }, "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", + "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", "dev": true, "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.0" }, "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" } }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "for-in": "^1.0.1" } }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", "dev": true, "requires": { - "kind-of": "^6.0.2" + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } } } @@ -28508,6 +26736,12 @@ } } }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -28966,6 +27200,17 @@ "requires": { "faye-websocket": "^0.10.0", "uuid": "^3.0.1" + }, + "dependencies": { + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } } }, "sockjs-client": { @@ -28990,27 +27235,9 @@ "requires": { "ms": "^2.1.1" } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } } } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -29284,12 +27511,6 @@ "readable-stream": "^2.0.2" } }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, "string-hash": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", @@ -29749,6 +27970,17 @@ } } }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + } + }, "terser-webpack-plugin": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", @@ -30119,9 +28351,9 @@ } }, "ts-pnp": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", - "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.2.tgz", + "integrity": "sha512-f5Knjh7XCyRIzoC/z1Su1yLLRrPrFCgtUAh/9fCSP6NKbATwpOL1+idQVXQokK9GRFURn/jYPGPfegIctwunoA==", "dev": true }, "tslib": { @@ -30364,6 +28596,24 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -30582,55 +28832,21 @@ "dev": true }, "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", "dev": true, "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" }, "dependencies": { - "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, "mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } } } }, @@ -31279,84 +29495,163 @@ } }, "webpack-dev-server": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.1.tgz", - "integrity": "sha512-AGG4+XrrXn4rbZUueyNrQgO4KGnol+0wm3MPdqGLmmA+NofZl3blZQKxZ9BND6RDNuvAK9OMYClhjOSnxpWRoA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.2.1.tgz", + "integrity": "sha512-sjuE4mnmx6JOh9kvSbPYw3u/6uxCLHNWfhWaIPwcXWsvWOPN+nc5baq4i9jui3oOBRXGonK9+OI0jVkaz6/rCw==", "dev": true, "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "0.19.1", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "^0.19.1", "import-local": "^2.0.0", - "internal-ip": "^4.3.0", + "internal-ip": "^4.2.0", "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.6", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.25", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", + "selfsigned": "^1.9.1", + "semver": "^5.6.0", + "serve-index": "^1.7.2", "sockjs": "0.3.19", - "sockjs-client": "1.4.0", - "spdy": "^4.0.1", - "strip-ansi": "^3.0.1", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", "supports-color": "^6.1.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", + "webpack-dev-middleware": "^3.5.1", "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "12.0.5" + "yargs": "12.0.2" }, "dependencies": { - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "xregexp": "4.0.0" } }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", "dev": true }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -31366,13 +29661,33 @@ "has-flag": "^3.0.0" } }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "yargs": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", "dev": true, "requires": { - "async-limiter": "~1.0.0" + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" } } } @@ -31388,28 +29703,14 @@ } }, "webpack-manifest-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.0.4.tgz", + "integrity": "sha512-nejhOHexXDBKQOj/5v5IZSfCeTO3x1Dt1RZEcGfBSul891X/eLIcIVH31gwxPDdsi2Z8LKKFGpM4w9+oTBOSCg==", "dev": true, "requires": { "fs-extra": "^7.0.0", "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", "tapable": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "webpack-sources": { @@ -31490,12 +29791,6 @@ "string-width": "^1.0.2 || 2" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -31660,14 +29955,14 @@ "dev": true }, "workbox-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.2.0.tgz", + "integrity": "sha512-YZsiA+y/ns/GdWRaBsfYv8dln1ebWtGnJcTOg1ppO0pO1tScAHX0yGtHIjndxz3L/UUhE8b0NQE9KeLNwJwA5A==", "dev": true, "requires": { "@babel/runtime": "^7.0.0", "json-stable-stringify": "^1.0.1", - "workbox-build": "^4.3.1" + "workbox-build": "^4.2.0" } }, "workbox-window": { @@ -31790,6 +30085,12 @@ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "dev": true + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/src/view/components/cpx/Cpx.tsx b/src/view/components/cpx/Cpx.tsx index 57afaadd0..dd9f1db84 100644 --- a/src/view/components/cpx/Cpx.tsx +++ b/src/view/components/cpx/Cpx.tsx @@ -2,7 +2,7 @@ // Licensed under the MIT license. import * as React from "react"; -import { TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; +import { CPX_TOOLBAR_ICON_ID } from "../../components/toolbar/SensorModalUtils"; import ToolBar from "../../components/toolbar/ToolBar"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; import Simulator from "./CpxSimulator"; @@ -23,46 +23,46 @@ export class Cpx extends React.Component { const CPX_TOOLBAR_BUTTONS: Array<{ label: any; image: any }> = [ { image: TOOLBAR_SVG.SLIDER_SWITCH_SVG, - label: TOOLBAR_ICON_ID.SWITCH, + label: CPX_TOOLBAR_ICON_ID.SWITCH, }, { image: TOOLBAR_SVG.PUSH_BUTTON_SVG, - label: TOOLBAR_ICON_ID.PUSH_BUTTON, + label: CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, }, { image: TOOLBAR_SVG.RED_LED_SVG, - label: TOOLBAR_ICON_ID.RED_LED, + label: CPX_TOOLBAR_ICON_ID.RED_LED, }, { image: TOOLBAR_SVG.SOUND_SVG, - label: TOOLBAR_ICON_ID.SOUND, + label: CPX_TOOLBAR_ICON_ID.SOUND, }, { image: TOOLBAR_SVG.TEMPERATURE_SVG, - label: TOOLBAR_ICON_ID.TEMPERATURE, + label: CPX_TOOLBAR_ICON_ID.TEMPERATURE, }, { image: TOOLBAR_SVG.LIGHT_SVG, - label: TOOLBAR_ICON_ID.LIGHT, + label: CPX_TOOLBAR_ICON_ID.LIGHT, }, { image: TOOLBAR_SVG.NEO_PIXEL_SVG, - label: TOOLBAR_ICON_ID.NEO_PIXEL, + label: CPX_TOOLBAR_ICON_ID.NEO_PIXEL, }, { image: TOOLBAR_SVG.SPEAKER_SVG, - label: TOOLBAR_ICON_ID.SPEAKER, + label: CPX_TOOLBAR_ICON_ID.SPEAKER, }, { image: TOOLBAR_SVG.MOTION_SVG, - label: TOOLBAR_ICON_ID.MOTION, + label: CPX_TOOLBAR_ICON_ID.MOTION, }, { image: TOOLBAR_SVG.IR_SVG, - label: TOOLBAR_ICON_ID.IR, + label: CPX_TOOLBAR_ICON_ID.IR, }, { image: TOOLBAR_SVG.GPIO_SVG, - label: TOOLBAR_ICON_ID.GPIO, + label: CPX_TOOLBAR_ICON_ID.GPIO, }, ]; diff --git a/src/view/components/microbit/Microbit.tsx b/src/view/components/microbit/Microbit.tsx index d7e906429..a4bc21473 100644 --- a/src/view/components/microbit/Microbit.tsx +++ b/src/view/components/microbit/Microbit.tsx @@ -4,6 +4,9 @@ import * as React from "react"; import "../../styles/Simulator.css"; import { MicrobitSimulator } from "./MicrobitSimulator"; +import ToolBar from "../toolbar/ToolBar"; +import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; +import { MICROBIT_TOOLBAR_ID } from "../../components/toolbar/SensorModalUtils"; // Component grouping the functionality for micro:bit functionalities @@ -12,8 +15,23 @@ export class Microbit extends React.Component { return ( - {/* Implement toolbar here */} + ); } } + +const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ + { + image: TOOLBAR_SVG.TEMPERATURE_SVG, + label: MICROBIT_TOOLBAR_ID.TEMPERATURE, + }, + { + image: TOOLBAR_SVG.LIGHT_SVG, + label: MICROBIT_TOOLBAR_ID.LIGHT, + }, + { + image: TOOLBAR_SVG.MOTION_SVG, + label: MICROBIT_TOOLBAR_ID.ACCELEROMETER, + }, +]; diff --git a/src/view/components/toolbar/MotionSensorBar.tsx b/src/view/components/toolbar/MotionSensorBar.tsx deleted file mode 100644 index da1eab010..000000000 --- a/src/view/components/toolbar/MotionSensorBar.tsx +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import * as React from "react"; -import svg from "../cpx/Svg_utils"; -import InputSlider from "./InputSlider"; -import SensorButton from "./SensorButton"; - -import { CONSTANTS } from "../../constants"; -import "../../styles/MotionSensorBar.css"; -import { - ISensorProps, - ISliderProps, - X_SLIDER_INDEX, - Y_SLIDER_INDEX, - Z_SLIDER_INDEX, -} from "../../viewUtils"; - -interface vscode { - postMessage(message: any): void; -} - -declare const vscode: vscode; - -const sendMessage = (state: any) => { - vscode.postMessage({ command: "sensor-changed", text: state }); -}; - -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 78, - minLabel: "Left", - minValue: -78, - type: "motion_x", -}; -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 78, - minLabel: "Back", - minValue: -78, - type: "motion_y", -}; -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - maxValue: 78, - minValue: -78, - minLabel: "Up", - maxLabel: "Down", - type: "motion_z", - axisLabel: "Z", -}; - -const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "Lux", -}; - -class MotionSensorBar extends React.Component { - constructor(props: any) { - super(props); - } - - render() { - return ( -
- -
- -
- -
- -
-
- ); - } - - private onMouseDown = (event: React.PointerEvent) => { - this.updateShakePress(true, event.currentTarget.id); - this.handleOnclick(true, "shake"); - }; - - private onKeyUp = (event: React.KeyboardEvent) => - this.onKeyEvent(event, false); - - private onKeyDown = (event: React.KeyboardEvent) => - this.onKeyEvent(event, true); - - private onMouseUp = (event: React.PointerEvent) => { - this.updateShakePress(false, event.currentTarget.id); - this.handleOnclick(false, "shake"); - }; - - private handleOnclick = (active: boolean, type: string) => { - const messageState = { [type]: active }; - sendMessage(messageState); - }; - - private onKeyEvent( - event: React.KeyboardEvent, - active: boolean - ) { - if ( - [event.keyCode, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) - ) { - this.handleOnclick(active, "shake"); - } - } - - private updateShakePress = (shakeState: boolean, id: string): void => { - const svgElement = window.document.getElementById("cpx_svg"); - const buttonElement = window.document.getElementById(id); - const cpxSvg: SVGElement = (svgElement as unknown) as SVGElement; - - if (svgElement && cpxSvg && buttonElement) { - buttonElement.setAttribute("aria-pressed", shakeState.toString()); - shakeState - ? svg.addClass(cpxSvg, "shake-pressed") - : svg.removeClass(cpxSvg, "shake-pressed"); - } - }; -} - -export default MotionSensorBar; diff --git a/src/view/components/toolbar/SensorModalUtils.tsx b/src/view/components/toolbar/SensorModalUtils.tsx index 134e7dcc1..a5a9a2514 100644 --- a/src/view/components/toolbar/SensorModalUtils.tsx +++ b/src/view/components/toolbar/SensorModalUtils.tsx @@ -5,8 +5,9 @@ import { ARROW_RIGHT_SVG } from "../../svgs/arrow_right_svg"; import { TAG_INPUT_SVG } from "../../svgs/tag_input_svg"; import { TAG_OUTPUT_SVG } from "../../svgs/tag_output_svg"; import LightSensorBar from "./LightSensorBar"; -import MotionSensorBar from "./MotionSensorBar"; +import MotionSensorBar from "./motion/MotionSensorBar"; import TemperatureSensorBar from "./TemperatureSensorBar"; +import { Accelerometer } from "./motion/Accelerometer"; export const TRY_IT_MAKE_CODE = (
@@ -33,7 +34,7 @@ export const TOOLBAR_ICON_LABEL = { TAG_OUTPUT: "Tag Output", TEMPERATURE: "Temperature Sensor", }; -export const TOOLBAR_ICON_ID = { +export const CPX_TOOLBAR_ICON_ID = { GPIO: "toolbar-gpio", IR: "toolbar-ir-sensor", LEFT_EDGE: "left-edge", @@ -49,6 +50,12 @@ export const TOOLBAR_ICON_ID = { TEMPERATURE: "toolbar-temperature-sensor", }; +export const MICROBIT_TOOLBAR_ID = { + TEMPERATURE: "toolbar-temperature-sensor", + LIGHT: "toolbar-light-sensor", + ACCELEROMETER: "toolbar-accelerometer", +}; + export interface IModalContent { component: any; descriptionText: string; @@ -182,16 +189,28 @@ export const TEMPERATURE_MODAL_CONTENT: IModalContent = { tryItTitle: "Try it on the Simulator!", }; +export const ACCELEROMETER_MODAL_CONTENT: IModalContent = { + component: , + descriptionText: "toolbar-accelerometer-sensor.description", + descriptionTitle: "toolbar-accelerometer-sensor.title", + id: "temperature", + tagInput: TAG_INPUT_SVG, + tagOutput: undefined, + tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", + tryItTitle: "Try it on the Simulator!", +}; + export const LABEL_TO_MODAL_CONTENT = new Map([ - [TOOLBAR_ICON_ID.GPIO, GPIO_MODAL_CONTENT], - [TOOLBAR_ICON_ID.IR, IR_MODAL_CONTENT], - [TOOLBAR_ICON_ID.LIGHT, LIGHT_MODAL_CONTENT], - [TOOLBAR_ICON_ID.MOTION, MOTION_MODAL_CONTENT], - [TOOLBAR_ICON_ID.NEO_PIXEL, NEOP_MODAL_CONTENT], - [TOOLBAR_ICON_ID.PUSH_BUTTON, PUSHB_MODAL_CONTENT], - [TOOLBAR_ICON_ID.RED_LED, RED_LED_MODAL_CONTENT], - [TOOLBAR_ICON_ID.SOUND, SOUND_MODAL_CONTENT], - [TOOLBAR_ICON_ID.SPEAKER, SPEAKER_MODAL_CONTENT], - [TOOLBAR_ICON_ID.SWITCH, SWITCH_MODAL_CONTENT], - [TOOLBAR_ICON_ID.TEMPERATURE, TEMPERATURE_MODAL_CONTENT], + [CPX_TOOLBAR_ICON_ID.GPIO, GPIO_MODAL_CONTENT], + [CPX_TOOLBAR_ICON_ID.IR, IR_MODAL_CONTENT], + [CPX_TOOLBAR_ICON_ID.LIGHT, LIGHT_MODAL_CONTENT], + [CPX_TOOLBAR_ICON_ID.MOTION, MOTION_MODAL_CONTENT], + [CPX_TOOLBAR_ICON_ID.NEO_PIXEL, NEOP_MODAL_CONTENT], + [CPX_TOOLBAR_ICON_ID.PUSH_BUTTON, PUSHB_MODAL_CONTENT], + [CPX_TOOLBAR_ICON_ID.RED_LED, RED_LED_MODAL_CONTENT], + [CPX_TOOLBAR_ICON_ID.SOUND, SOUND_MODAL_CONTENT], + [CPX_TOOLBAR_ICON_ID.SPEAKER, SPEAKER_MODAL_CONTENT], + [CPX_TOOLBAR_ICON_ID.SWITCH, SWITCH_MODAL_CONTENT], + [CPX_TOOLBAR_ICON_ID.TEMPERATURE, TEMPERATURE_MODAL_CONTENT], + [MICROBIT_TOOLBAR_ID.ACCELEROMETER, ACCELEROMETER_MODAL_CONTENT], ]); diff --git a/src/view/components/toolbar/motion/Accelerometer.tsx b/src/view/components/toolbar/motion/Accelerometer.tsx new file mode 100644 index 000000000..71cb25ee3 --- /dev/null +++ b/src/view/components/toolbar/motion/Accelerometer.tsx @@ -0,0 +1,11 @@ +import * as React from "react"; +import { ThreeDimensionSlider } from "./threeDimensionSlider/ThreeDimensionSlider"; + +export const Accelerometer: React.FC<{}> = () => { + return ( +
+
+ +
+ ); +}; diff --git a/src/view/components/toolbar/motion/MotionSensorBar.tsx b/src/view/components/toolbar/motion/MotionSensorBar.tsx new file mode 100644 index 000000000..bb9435be0 --- /dev/null +++ b/src/view/components/toolbar/motion/MotionSensorBar.tsx @@ -0,0 +1,133 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as React from "react"; +import svg from "../../cpx/Svg_utils"; +import InputSlider from "../InputSlider"; +import SensorButton from "../SensorButton"; +import { ThreeDimensionSlider } from "./threeDimensionSlider/ThreeDimensionSlider"; +import { CONSTANTS } from "../../../constants"; +import "../../../styles/MotionSensorBar.css"; +import { + ISensorProps, + ISliderProps, + X_SLIDER_INDEX, + Y_SLIDER_INDEX, + Z_SLIDER_INDEX, +} from "../../../viewUtils"; + +interface vscode { + postMessage(message: any): void; +} + +declare const vscode: vscode; + +const sendMessage = (state: any) => { + vscode.postMessage({ command: "sensor-changed", text: state }); +}; + +const MOTION_SLIDER_PROPS_X: ISliderProps = { + axisLabel: "X", + maxLabel: "Right", + maxValue: 78, + minLabel: "Left", + minValue: -78, + type: "motion_x", +}; +const MOTION_SLIDER_PROPS_Y: ISliderProps = { + axisLabel: "Y", + maxLabel: "Front", + maxValue: 78, + minLabel: "Back", + minValue: -78, + type: "motion_y", +}; +const MOTION_SLIDER_PROPS_Z: ISliderProps = { + maxValue: 78, + minValue: -78, + minLabel: "Up", + maxLabel: "Down", + type: "motion_z", + axisLabel: "Z", +}; + +const MOTION_SENSOR_PROPERTIES: ISensorProps = { + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "Lux", +}; + +class MotionSensorBar extends React.Component { + constructor(props: any) { + super(props); + } + + render() { + return ( +
+ +
+ +
+
+ ); + } + + private onMouseDown = (event: React.PointerEvent) => { + this.updateShakePress(true, event.currentTarget.id); + this.handleOnclick(true, "shake"); + }; + + private onKeyUp = (event: React.KeyboardEvent) => + this.onKeyEvent(event, false); + + private onKeyDown = (event: React.KeyboardEvent) => + this.onKeyEvent(event, true); + + private onMouseUp = (event: React.PointerEvent) => { + this.updateShakePress(false, event.currentTarget.id); + this.handleOnclick(false, "shake"); + }; + + private handleOnclick = (active: boolean, type: string) => { + const messageState = { [type]: active }; + sendMessage(messageState); + }; + + private onKeyEvent( + event: React.KeyboardEvent, + active: boolean + ) { + if ( + [event.keyCode, event.key].includes(CONSTANTS.KEYBOARD_KEYS.ENTER) + ) { + this.handleOnclick(active, "shake"); + } + } + + private updateShakePress = (shakeState: boolean, id: string): void => { + const svgElement = window.document.getElementById("cpx_svg"); + const buttonElement = window.document.getElementById(id); + const cpxSvg: SVGElement = (svgElement as unknown) as SVGElement; + + if (svgElement && cpxSvg && buttonElement) { + buttonElement.setAttribute("aria-pressed", shakeState.toString()); + shakeState + ? svg.addClass(cpxSvg, "shake-pressed") + : svg.removeClass(cpxSvg, "shake-pressed"); + } + }; +} + +export default MotionSensorBar; diff --git a/src/view/components/toolbar/motion/threeDimensionSlider/ThreeDimensionSlider.tsx b/src/view/components/toolbar/motion/threeDimensionSlider/ThreeDimensionSlider.tsx new file mode 100644 index 000000000..06404be5c --- /dev/null +++ b/src/view/components/toolbar/motion/threeDimensionSlider/ThreeDimensionSlider.tsx @@ -0,0 +1,121 @@ +import * as React from "react"; +import { + ISensorProps, + ISliderProps, + X_SLIDER_INDEX, + Y_SLIDER_INDEX, + Z_SLIDER_INDEX, +} from "../../../../viewUtils"; +import InputSlider from "../../InputSlider"; + +const MOTION_SLIDER_PROPS_X: ISliderProps = { + axisLabel: "X", + maxLabel: "Right", + maxValue: 78, + minLabel: "Left", + minValue: -78, + type: "motion_x", +}; +const MOTION_SLIDER_PROPS_Y: ISliderProps = { + axisLabel: "Y", + maxLabel: "Front", + maxValue: 78, + minLabel: "Back", + minValue: -78, + type: "motion_y", +}; +const MOTION_SLIDER_PROPS_Z: ISliderProps = { + maxValue: 78, + minValue: -78, + minLabel: "Up", + maxLabel: "Down", + type: "motion_z", + axisLabel: "Z", +}; + +const MOTION_SENSOR_PROPERTIES: ISensorProps = { + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "Lux", +}; +export const ThreeDimensionSlider: React.FC<{}> = () => { + return ( +
+ +
+ +
+ +
+ ); +}; diff --git a/src/view/translations/en.json b/src/view/translations/en.json index 0cd7f7f98..a0381df4a 100644 --- a/src/view/translations/en.json +++ b/src/view/translations/en.json @@ -1,36 +1,39 @@ -{ - "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", - "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT+”1” - “7”", - "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", - "toolbar-ir-sensor.title": "IR Transmit & Receiver", - "toolbar-ir-sensor.tryItDescription": "We’re working hard to support this sensor on the simulator in the Device Simulator Express. You can try it on MakeCode!", - "toolbar-ir-sensor.tryItTitle": "We’re working hard to support this sensor on the simulator in the Device Simulator Express. You can try it on MakeCode!", - "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", - "toolbar-light-sensor.title": "Light Sensor", - "toolbar-light-sensor.tryItDescription": "Change the brightness from 0 - 255 here!", - "toolbar-motion-sensor.description": "Detects acceleration in XYZ orientations. And can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", - "toolbar-motion-sensor.title": "Motion Sensor", - "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake.The tap feature is not supported by the Device Simulator Express. You can try it on MakeCode!", - "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", - "toolbar-neo-pixels.title": "NeoPixels", - "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-push-button.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", - "toolbar-push-button.title": "Push Buttons", - "toolbar-push-button.tryItDescription": "Click them with your mouse or by pressing “A” “B” on your keyboard!", - "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", - "toolbar-red-led.title": "Red LED", - "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", - "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", - "toolbar-sound-sensor.title": "Sound Sensor", - "toolbar-sound-sensor.tryItDescription": "We’re working hard to support this sensor on the simulator in the Device Simulator Express. You can try it on MakeCode!", - "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", - "toolbar-slider-switch.title": "Slider Switch", - "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", - "toolbar-speaker.description": "This speaker can play .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", - "toolbar-speaker.title": "Speaker", - "toolbar-speaker.tryItDescription": "Right now the tones are not supported yet on the simulator, but you can play it on your device!", - "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", - "toolbar-temperature-sensor.title": "Temperature Sensor", - "toolbar-temperature-sensor.tryItDescription": "You can set the temperature range from your code!" -} +{ + "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", + "toolbar-gpio.title": "GPIO", + "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT+”1” - “7”", + "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", + "toolbar-ir-sensor.title": "IR Transmit & Receiver", + "toolbar-ir-sensor.tryItDescription": "We’re working hard to support this sensor on the simulator in the Device Simulator Express. You can try it on MakeCode!", + "toolbar-ir-sensor.tryItTitle": "We’re working hard to support this sensor on the simulator in the Device Simulator Express. You can try it on MakeCode!", + "toolbar-light-sensor.description": "An analog light sensor can be used to detect ambient light, with similar spectral response to the human eye.", + "toolbar-light-sensor.title": "Light Sensor", + "toolbar-light-sensor.tryItDescription": "Change the brightness from 0 - 255 here!", + "toolbar-motion-sensor.description": "Detects acceleration in XYZ orientations. And can also detect 'tap' and 'double tap' strikes on the board and when the board is shaken.", + "toolbar-motion-sensor.title": "Motion Sensor", + "toolbar-motion-sensor.tryItDescription": "Change the acceleration here and click or click on the button to simulate a shake.The tap feature is not supported by the Device Simulator Express. You can try it on MakeCode!", + "toolbar-neo-pixels.description": "The 10 full color RGB LEDs surrounding the outer edge of the boards can be set to any color. Great for beautiful lighting effects!", + "toolbar-neo-pixels.title": "NeoPixels", + "toolbar-neo-pixels.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-push-button.description": "Two push buttons A and B are connected to digital pin #4 (Left) and #5 (Right) each.", + "toolbar-push-button.title": "Push Buttons", + "toolbar-push-button.tryItDescription": "Click them with your mouse or by pressing “A” “B” on your keyboard!", + "toolbar-red-led.description": "This Red LED is connected to the digital #13 GPIO pin. It can be very handy when you want an indicator LED.", + "toolbar-red-led.title": "Red LED", + "toolbar-red-led.tryItDescription": "Run your code and see the cool effects on the simulator!", + "toolbar-sound-sensor.description": "A digital microphone can detect audio volume and even perform basic FFT functions but cannot read it like an analog voltage.", + "toolbar-sound-sensor.title": "Sound Sensor", + "toolbar-sound-sensor.tryItDescription": "We’re working hard to support this sensor on the simulator in the Device Simulator Express. You can try it on MakeCode!", + "toolbar-slider-switch.description": "This slide switch returns True or False depending on whether it's ON or OFF and can be used as a toggle switch in your code!", + "toolbar-slider-switch.title": "Slider Switch", + "toolbar-slider-switch.tryItDescription": "Click it with your mouse or press 'S' on your keyboard to switch it ON and OFF!", + "toolbar-speaker.description": "This speaker can play .wav file and different tones and also has a class D amplifier that is connected to an output A0 pin built in! You can turn it off using the shutdown control on pin #11 on the physical device.", + "toolbar-speaker.title": "Speaker", + "toolbar-speaker.tryItDescription": "Right now the tones are not supported yet on the simulator, but you can play it on your device!", + "toolbar-temperature-sensor.description": "This sensor uses an NTC thermistor to sense temperature an calculate it with the analog voltage on analog pin #A9.", + "toolbar-temperature-sensor.title": "Temperature Sensor", + "toolbar-temperature-sensor.tryItDescription": "You can set the temperature range from your code!", + "toolbar-accelerometer-sensor.title": "Accelerometer", + "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", + "toolbar-accelerometer-sensor.tryItDescription": "Change the acceleration here" +} From 0380c7a3afb35745dcfc354c053fe8886f83004b Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Mon, 10 Feb 2020 15:16:59 -0800 Subject: [PATCH 16/40] Added set_accel helper function --- src/microbit/__model/accelerometer.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/microbit/__model/accelerometer.py b/src/microbit/__model/accelerometer.py index 8655e147a..2b37afc29 100644 --- a/src/microbit/__model/accelerometer.py +++ b/src/microbit/__model/accelerometer.py @@ -109,6 +109,14 @@ def __get_accel(self, axis): elif axis == "z": return self.get_z() + def __set_accel(self, axis, accel): + if axis == "x": + self.__x = self.__get_valid_acceleration(x) + elif axis == "y": + self.__y = self.__get_valid_acceleration(y) + elif axis == "z": + self.__z = self.__get_valid_acceleration(z) + def __set_gesture(self, gesture): if gesture in CONSTANTS.GESTURES: self.__current_gesture = gesture From b5a523b7503cfb402197894c14b028f8d5658a75 Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Mon, 10 Feb 2020 15:17:32 -0800 Subject: [PATCH 17/40] Fixed bug --- src/microbit/__model/accelerometer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/microbit/__model/accelerometer.py b/src/microbit/__model/accelerometer.py index 2b37afc29..ae2aede07 100644 --- a/src/microbit/__model/accelerometer.py +++ b/src/microbit/__model/accelerometer.py @@ -111,11 +111,11 @@ def __get_accel(self, axis): def __set_accel(self, axis, accel): if axis == "x": - self.__x = self.__get_valid_acceleration(x) + self.__x = self.__get_valid_acceleration(accel) elif axis == "y": - self.__y = self.__get_valid_acceleration(y) + self.__y = self.__get_valid_acceleration(accel) elif axis == "z": - self.__z = self.__get_valid_acceleration(z) + self.__z = self.__get_valid_acceleration(accel) def __set_gesture(self, gesture): if gesture in CONSTANTS.GESTURES: From 9a9b1c15043cf884b02d2f340b5cbae762c11fad Mon Sep 17 00:00:00 2001 From: andreamah Date: Mon, 10 Feb 2020 15:21:01 -0800 Subject: [PATCH 18/40] more progress on connecting backend to listener --- src/process_user_code.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/process_user_code.py b/src/process_user_code.py index 6837babcf..d56d63c0e 100644 --- a/src/process_user_code.py +++ b/src/process_user_code.py @@ -81,8 +81,7 @@ def update_microbit(new_state): # set motion_x, motion_y, motion_z for name, direction in CONSTANTS.EXPECTED_INPUT_ACCEL_MICROBIT: - previous_motion_val = None - exec(f"previous_motion_val = mb.accelerometer.get_{direction}()") + previous_motion_val = mb.accelerometer._Accelerometer__get_accel(direction) new_motion_val = new_state.get(name, previous_motion_val) if new_motion_val != previous_motion_val: print("change motion val") @@ -90,16 +89,16 @@ def update_microbit(new_state): # set temperature previous_temp = mb.temperature() new_temp = new_state.get(CONSTANTS.EXPECTED_INPUT_TEMP_MICROBIT, previous_temp) - if new_temp != new_temp: - print("set temp value") + if new_temp != previous_temp: + mb._MicrobitModel__set_temperature(new_temp) # set light level previous_light_level = mb.display.read_light_level() new_light_level = new_state.get( CONSTANTS.EXPECTED_INPUT_LIGHT_MICROBIT, previous_light_level ) - if new_light_level != new_light_level: - print("set light value") + if new_light_level != previous_light_level: + mb.display._Display__set_light_level(new_light_level) user_input = UserInput() From 5f73a1612d7d77675c0d1e0cd3679b05134a0dd5 Mon Sep 17 00:00:00 2001 From: andreamah Date: Mon, 10 Feb 2020 15:27:34 -0800 Subject: [PATCH 19/40] preliminary backend for sensors --- src/process_user_code.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/process_user_code.py b/src/process_user_code.py index d56d63c0e..0ead30d79 100644 --- a/src/process_user_code.py +++ b/src/process_user_code.py @@ -84,7 +84,7 @@ def update_microbit(new_state): previous_motion_val = mb.accelerometer._Accelerometer__get_accel(direction) new_motion_val = new_state.get(name, previous_motion_val) if new_motion_val != previous_motion_val: - print("change motion val") + mb.accelerometer._Accelerometer__set_accel(direction, new_motion_val) # set temperature previous_temp = mb.temperature() From c20029b897a6c444eee5ee1a1043e025fc4010e8 Mon Sep 17 00:00:00 2001 From: andreamah Date: Mon, 10 Feb 2020 15:58:11 -0800 Subject: [PATCH 20/40] incorporated PR feedback --- src/adafruit_circuitplayground/constants.py | 13 +++++++++++ src/adafruit_circuitplayground/express.py | 6 +++++ src/microbit/__model/constants.py | 5 +++++ src/microbit/__model/microbit_model.py | 19 ++++++++++++++++ src/process_user_code.py | 25 +++------------------ src/python_constants.py | 17 -------------- 6 files changed, 46 insertions(+), 39 deletions(-) diff --git a/src/adafruit_circuitplayground/constants.py b/src/adafruit_circuitplayground/constants.py index 5cb698560..4e6100d97 100644 --- a/src/adafruit_circuitplayground/constants.py +++ b/src/adafruit_circuitplayground/constants.py @@ -47,3 +47,16 @@ EVENTS_BUTTON_PRESS = ["button_a", "button_b", "switch"] EVENTS_SENSOR_CHANGED = ["temperature", "light", "motion_x", "motion_y", "motion_z"] + +ALL_EXPECTED_INPUT_EVENTS = [ + "button_a", + "button_b", + "switch", + "temperature", + "light", + "shake", + "motion_x", + "motion_y", + "motion_z", + "touch", +] diff --git a/src/adafruit_circuitplayground/express.py b/src/adafruit_circuitplayground/express.py index 16b6807a6..9e20af4b2 100644 --- a/src/adafruit_circuitplayground/express.py +++ b/src/adafruit_circuitplayground/express.py @@ -194,5 +194,11 @@ def stop_tone(self): telemetry_py.send_telemetry("STOP_TONE") raise NotImplementedError(CONSTANTS.NOT_IMPLEMENTED_ERROR) + def update_state(self, new_state): + for event in CONSTANTS.ALL_EXPECTED_INPUT_EVENTS: + self._Express__state[event] = new_state.get( + event, self._Express__state[event] + ) + cpx = Express() diff --git a/src/microbit/__model/constants.py b/src/microbit/__model/constants.py index 7f566ea90..a93250140 100644 --- a/src/microbit/__model/constants.py +++ b/src/microbit/__model/constants.py @@ -122,3 +122,8 @@ SAME_SIZE_ERR = "images must be the same size" TIME_DELAY = 0.03 + +EXPECTED_INPUT_BUTTONS = [ + "button_a", + "button_b", +] diff --git a/src/microbit/__model/microbit_model.py b/src/microbit/__model/microbit_model.py index a1de5045d..a92763e34 100644 --- a/src/microbit/__model/microbit_model.py +++ b/src/microbit/__model/microbit_model.py @@ -2,6 +2,7 @@ from .button import Button from .display import Display +from . import constants as CONSTANTS class MicrobitModel: @@ -12,6 +13,11 @@ def __init__(self): self.__start_time = time.time() self.display = Display() + self.microbit_button_dict = { + "button_a": self.button_a, + "button_b": self.button_b, + } + def sleep(self, n): time.sleep(n / 1000) @@ -19,5 +25,18 @@ def running_time(self): print(f"time. time: {time.time()}") return time.time() - self.__start_time + def update_state(self, new_state): + for button_name in CONSTANTS.EXPECTED_INPUT_BUTTONS: + button = self.microbit_button_dict[button_name] + + previous_pressed = button.is_pressed() + button_pressed = new_state.get(button_name, previous_pressed) + + if button_pressed != previous_pressed: + if button_pressed: + button._Button__press_down() + else: + button._Button__release() + __mb = MicrobitModel() diff --git a/src/process_user_code.py b/src/process_user_code.py index 4c85c2165..486551e2b 100644 --- a/src/process_user_code.py +++ b/src/process_user_code.py @@ -42,6 +42,7 @@ def __init__(self): threading.Thread.__init__(self) def run(self): + device_dict = {CPX: cpx, MICROBIT: mb} while True: read_val = sys.stdin.readline() sys.stdin.flush() @@ -50,10 +51,8 @@ def run(self): device = new_state_message.get(CONSTANTS.ACTIVE_DEVICE_FIELD) new_state = new_state_message.get(CONSTANTS.STATE_FIELD, {}) - if device == CPX: - update_cpx(new_state) - elif device == MICROBIT: - update_microbit(new_state) + if device in device_dict: + device_dict[device].update_state(new_state) else: raise Exception(CONSTANTS.DEVICE_NOT_IMPLEMENTED_ERROR) @@ -61,24 +60,6 @@ def run(self): print(CONSTANTS.ERROR_SENDING_EVENT, e, file=sys.stderr, flush=True) -def update_cpx(new_state): - for event in CONSTANTS.EXPECTED_INPUT_EVENTS_CPX: - cpx._Express__state[event] = new_state.get(event, cpx._Express__state[event]) - - -def update_microbit(new_state): - for button in CONSTANTS.EXPECTED_INPUT_BUTTONS_MICROBIT: - previous_pressed = None - exec(f"previous_pressed = mb.{button}.get_presses()") - button_pressed = new_state.get(button, previous_pressed) - - if button_pressed != previous_pressed: - if button_pressed: - exec(f"mb.{button}._Button__press_down()") - else: - exec(f"mb.{button}._Button__release()") - - user_input = UserInput() threads.append(user_input) user_input.start() diff --git a/src/python_constants.py b/src/python_constants.py index ab91e278e..03b5b6b7a 100644 --- a/src/python_constants.py +++ b/src/python_constants.py @@ -8,23 +8,6 @@ DEVICE_NOT_IMPLEMENTED_ERROR = "Device not implemented." ENABLE_TELEMETRY = "enable_telemetry" -EXPECTED_INPUT_EVENTS_CPX = [ - "button_a", - "button_b", - "switch", - "temperature", - "light", - "shake", - "motion_x", - "motion_y", - "motion_z", - "touch", -] - -EXPECTED_INPUT_BUTTONS_MICROBIT = [ - "button_a", - "button_b", -] EXEC_COMMAND = "exec" ERROR_SENDING_EVENT = "Error trying to send event to the process : " From 69896ea81289d745f08719f2c06c417dea1977de Mon Sep 17 00:00:00 2001 From: xnkevinnguyen Date: Mon, 10 Feb 2020 16:24:30 -0800 Subject: [PATCH 21/40] Accelerometer and motion sensor pass props to three dimension sliders --- src/view/components/cpx/CpxSimulator.tsx | 2 +- src/view/components/microbit/Microbit.tsx | 6 +- .../components/microbit/MicrobitImage.tsx | 2 +- .../components/microbit/MicrobitSimulator.tsx | 4 +- .../components/toolbar/SensorModalUtils.tsx | 2 +- .../toolbar/motion/Accelerometer.tsx | 38 +++++++- .../toolbar/motion/MotionSensorBar.tsx | 17 ++-- .../ThreeDimensionSlider.tsx | 91 +++++-------------- 8 files changed, 73 insertions(+), 89 deletions(-) diff --git a/src/view/components/cpx/CpxSimulator.tsx b/src/view/components/cpx/CpxSimulator.tsx index d69c50abf..31bc067a1 100644 --- a/src/view/components/cpx/CpxSimulator.tsx +++ b/src/view/components/cpx/CpxSimulator.tsx @@ -2,7 +2,7 @@ // Licensed under the MIT license. import * as React from "react"; -import { CONSTANTS, WEBVIEW_MESSAGES, DEVICE_LIST_KEY } from "../../constants"; +import { CONSTANTS, DEVICE_LIST_KEY, WEBVIEW_MESSAGES } from "../../constants"; import { sendMessage } from "../../utils/MessageUtils"; import "../../styles/Simulator.css"; diff --git a/src/view/components/microbit/Microbit.tsx b/src/view/components/microbit/Microbit.tsx index a4bc21473..abcb9b12c 100644 --- a/src/view/components/microbit/Microbit.tsx +++ b/src/view/components/microbit/Microbit.tsx @@ -2,11 +2,11 @@ // Licensed under the MIT license. import * as React from "react"; +import { MICROBIT_TOOLBAR_ID } from "../../components/toolbar/SensorModalUtils"; import "../../styles/Simulator.css"; -import { MicrobitSimulator } from "./MicrobitSimulator"; -import ToolBar from "../toolbar/ToolBar"; import * as TOOLBAR_SVG from "../../svgs/toolbar_svg"; -import { MICROBIT_TOOLBAR_ID } from "../../components/toolbar/SensorModalUtils"; +import ToolBar from "../toolbar/ToolBar"; +import { MicrobitSimulator } from "./MicrobitSimulator"; // Component grouping the functionality for micro:bit functionalities diff --git a/src/view/components/microbit/MicrobitImage.tsx b/src/view/components/microbit/MicrobitImage.tsx index 08d1d83b3..df62aa509 100644 --- a/src/view/components/microbit/MicrobitImage.tsx +++ b/src/view/components/microbit/MicrobitImage.tsx @@ -61,7 +61,7 @@ const setupAllButtons = (eventTriggers: EventTriggers, buttonRefs: Object) => { }; const updateAllLeds = ( leds: number[][], - ledRefs: Array>[] + ledRefs: Array>> ) => { for (let j = 0; j < leds.length; j++) { for (let i = 0; i < leds[0].length; i++) { diff --git a/src/view/components/microbit/MicrobitSimulator.tsx b/src/view/components/microbit/MicrobitSimulator.tsx index a31d0e469..c4728e473 100644 --- a/src/view/components/microbit/MicrobitSimulator.tsx +++ b/src/view/components/microbit/MicrobitSimulator.tsx @@ -1,8 +1,8 @@ import * as React from "react"; import { - WEBVIEW_MESSAGES, - MICROBIT_BUTTONS_KEYS, DEVICE_LIST_KEY, + MICROBIT_BUTTONS_KEYS, + WEBVIEW_MESSAGES, } from "../../constants"; import PlayLogo from "../../svgs/play_svg"; import StopLogo from "../../svgs/stop_svg"; diff --git a/src/view/components/toolbar/SensorModalUtils.tsx b/src/view/components/toolbar/SensorModalUtils.tsx index a5a9a2514..ed39a1186 100644 --- a/src/view/components/toolbar/SensorModalUtils.tsx +++ b/src/view/components/toolbar/SensorModalUtils.tsx @@ -5,9 +5,9 @@ import { ARROW_RIGHT_SVG } from "../../svgs/arrow_right_svg"; import { TAG_INPUT_SVG } from "../../svgs/tag_input_svg"; import { TAG_OUTPUT_SVG } from "../../svgs/tag_output_svg"; import LightSensorBar from "./LightSensorBar"; +import { Accelerometer } from "./motion/Accelerometer"; import MotionSensorBar from "./motion/MotionSensorBar"; import TemperatureSensorBar from "./TemperatureSensorBar"; -import { Accelerometer } from "./motion/Accelerometer"; export const TRY_IT_MAKE_CODE = (
diff --git a/src/view/components/toolbar/motion/Accelerometer.tsx b/src/view/components/toolbar/motion/Accelerometer.tsx index 71cb25ee3..27a4c9878 100644 --- a/src/view/components/toolbar/motion/Accelerometer.tsx +++ b/src/view/components/toolbar/motion/Accelerometer.tsx @@ -1,11 +1,47 @@ import * as React from "react"; import { ThreeDimensionSlider } from "./threeDimensionSlider/ThreeDimensionSlider"; +import { ISliderProps, ISensorProps } from "../../../viewUtils"; +const MOTION_SLIDER_PROPS_X: ISliderProps = { + axisLabel: "X", + maxLabel: "Right", + maxValue: 1023, + minLabel: "Left", + minValue: -1023, + type: "motion_x", +}; +const MOTION_SLIDER_PROPS_Y: ISliderProps = { + axisLabel: "Y", + maxLabel: "Front", + maxValue: 1023, + minLabel: "Back", + minValue: -1023, + type: "motion_y", +}; +const MOTION_SLIDER_PROPS_Z: ISliderProps = { + maxValue: 1023, + minValue: -1023, + minLabel: "Up", + maxLabel: "Down", + type: "motion_z", + axisLabel: "Z", +}; + +const MOTION_SENSOR_PROPERTIES: ISensorProps = { + LABEL: "Motion sensor", + sliderProps: [ + MOTION_SLIDER_PROPS_X, + MOTION_SLIDER_PROPS_Y, + MOTION_SLIDER_PROPS_Z, + ], + unitLabel: "Lux", +}; export const Accelerometer: React.FC<{}> = () => { return (

- + {/* Implement Gestures Here */} +
); }; diff --git a/src/view/components/toolbar/motion/MotionSensorBar.tsx b/src/view/components/toolbar/motion/MotionSensorBar.tsx index bb9435be0..4e7987945 100644 --- a/src/view/components/toolbar/motion/MotionSensorBar.tsx +++ b/src/view/components/toolbar/motion/MotionSensorBar.tsx @@ -2,19 +2,12 @@ // Licensed under the MIT license. import * as React from "react"; +import { CONSTANTS } from "../../../constants"; +import "../../../styles/MotionSensorBar.css"; +import { ISensorProps, ISliderProps } from "../../../viewUtils"; import svg from "../../cpx/Svg_utils"; -import InputSlider from "../InputSlider"; import SensorButton from "../SensorButton"; import { ThreeDimensionSlider } from "./threeDimensionSlider/ThreeDimensionSlider"; -import { CONSTANTS } from "../../../constants"; -import "../../../styles/MotionSensorBar.css"; -import { - ISensorProps, - ISliderProps, - X_SLIDER_INDEX, - Y_SLIDER_INDEX, - Z_SLIDER_INDEX, -} from "../../../viewUtils"; interface vscode { postMessage(message: any): void; @@ -78,7 +71,9 @@ class MotionSensorBar extends React.Component { onKeyDown={this.onKeyDown} />
- +
); diff --git a/src/view/components/toolbar/motion/threeDimensionSlider/ThreeDimensionSlider.tsx b/src/view/components/toolbar/motion/threeDimensionSlider/ThreeDimensionSlider.tsx index 06404be5c..4ff3da796 100644 --- a/src/view/components/toolbar/motion/threeDimensionSlider/ThreeDimensionSlider.tsx +++ b/src/view/components/toolbar/motion/threeDimensionSlider/ThreeDimensionSlider.tsx @@ -1,119 +1,72 @@ import * as React from "react"; import { ISensorProps, - ISliderProps, X_SLIDER_INDEX, Y_SLIDER_INDEX, Z_SLIDER_INDEX, } from "../../../../viewUtils"; import InputSlider from "../../InputSlider"; -const MOTION_SLIDER_PROPS_X: ISliderProps = { - axisLabel: "X", - maxLabel: "Right", - maxValue: 78, - minLabel: "Left", - minValue: -78, - type: "motion_x", -}; -const MOTION_SLIDER_PROPS_Y: ISliderProps = { - axisLabel: "Y", - maxLabel: "Front", - maxValue: 78, - minLabel: "Back", - minValue: -78, - type: "motion_y", -}; -const MOTION_SLIDER_PROPS_Z: ISliderProps = { - maxValue: 78, - minValue: -78, - minLabel: "Up", - maxLabel: "Down", - type: "motion_z", - axisLabel: "Z", -}; - -const MOTION_SENSOR_PROPERTIES: ISensorProps = { - LABEL: "Motion sensor", - sliderProps: [ - MOTION_SLIDER_PROPS_X, - MOTION_SLIDER_PROPS_Y, - MOTION_SLIDER_PROPS_Z, - ], - unitLabel: "Lux", -}; -export const ThreeDimensionSlider: React.FC<{}> = () => { +interface IProps { + axisProperties: ISensorProps; +} +export const ThreeDimensionSlider: React.FC = props => { return (


From 26ee1a88bbf970747a48c3c5e704e2dac5fe6cb9 Mon Sep 17 00:00:00 2001 From: andreamah Date: Mon, 10 Feb 2020 17:05:34 -0800 Subject: [PATCH 22/40] added constants to microbit for sensors --- src/microbit/__model/constants.py | 8 ++++++++ src/python_constants.py | 8 -------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/microbit/__model/constants.py b/src/microbit/__model/constants.py index 6666325cf..5f43ddaee 100644 --- a/src/microbit/__model/constants.py +++ b/src/microbit/__model/constants.py @@ -152,3 +152,11 @@ "button_a", "button_b", ] + +EXPECTED_INPUT_LIGHT_MICROBIT = "light" + +EXPECTED_INPUT_SENSORS_MICROBIT = [ + "temperature", + "light", +] +EXPECTED_INPUT_TEMP_MICROBIT = "temperature" diff --git a/src/python_constants.py b/src/python_constants.py index f6715cbbc..03b5b6b7a 100644 --- a/src/python_constants.py +++ b/src/python_constants.py @@ -9,14 +9,6 @@ ENABLE_TELEMETRY = "enable_telemetry" -EXPECTED_INPUT_LIGHT_MICROBIT = "light" - -EXPECTED_INPUT_SENSORS_MICROBIT = [ - "temperature", - "light", -] -EXPECTED_INPUT_TEMP_MICROBIT = "temperature" - EXEC_COMMAND = "exec" ERROR_SENDING_EVENT = "Error trying to send event to the process : " ERROR_TRACEBACK = "\n\tTraceback of code execution : \n" From 5430209a9ba15a75dd5ed3663a2b0503b7625e3c Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Tue, 11 Feb 2020 10:18:55 -0800 Subject: [PATCH 23/40] Updated from PR comments --- src/microbit/__model/accelerometer.py | 2 -- src/microbit/test/test_shim.py | 27 --------------------------- 2 files changed, 29 deletions(-) delete mode 100644 src/microbit/test/test_shim.py diff --git a/src/microbit/__model/accelerometer.py b/src/microbit/__model/accelerometer.py index ae2aede07..6c4c35c0a 100644 --- a/src/microbit/__model/accelerometer.py +++ b/src/microbit/__model/accelerometer.py @@ -1,5 +1,3 @@ -import enum - from . import constants as CONSTANTS diff --git a/src/microbit/test/test_shim.py b/src/microbit/test/test_shim.py deleted file mode 100644 index fb25d2c16..000000000 --- a/src/microbit/test/test_shim.py +++ /dev/null @@ -1,27 +0,0 @@ -import time - -import pytest -from unittest import mock - -from .. import * -from ..__model.microbit_model import MicrobitModel - -# tests methods in __init__.py - - -class TestShim(object): - def test_sleep(self): - milliseconds = 100 - MicrobitModel.sleep = mock.Mock() - sleep(milliseconds) - MicrobitModel.sleep.assert_called_with(milliseconds) - - def test_running_time(self): - MicrobitModel.running_time = mock.Mock() - running_time() - MicrobitModel.running_time.assert_called_once() - - def test_temperature(self): - MicrobitModel.temperature = mock.Mock() - temperature() - MicrobitModel.temperature.asser_called_once() From 7411703ad515942c18e73da4348d09478790a7ee Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Tue, 11 Feb 2020 10:52:48 -0800 Subject: [PATCH 24/40] Updated accelerometer to throw exceptions when invalid acceleration --- src/microbit/__model/accelerometer.py | 25 +++-------- src/microbit/__model/constants.py | 3 ++ src/microbit/test/test_accelerometer.py | 58 ++++++++++++++----------- 3 files changed, 41 insertions(+), 45 deletions(-) diff --git a/src/microbit/__model/accelerometer.py b/src/microbit/__model/accelerometer.py index 6c4c35c0a..92fcafe4e 100644 --- a/src/microbit/__model/accelerometer.py +++ b/src/microbit/__model/accelerometer.py @@ -82,23 +82,6 @@ def get_gestures(self): # Helpers and Hidden Functions - def __set_x(self, x): - self.__x = self.__get_valid_acceleration(x) - - def __set_y(self, y): - self.__y = self.__get_valid_acceleration(y) - - def __set_z(self, z): - self.__z = self.__get_valid_acceleration(z) - - def __get_valid_acceleration(self, acceleration): - if acceleration < CONSTANTS.MIN_ACCELERATION: - return CONSTANTS.MIN_ACCELERATION - elif acceleration > CONSTANTS.MAX_ACCELERATION: - return CONSTANTS.MAX_ACCELERATION - else: - return acceleration - def __get_accel(self, axis): if axis == "x": return self.get_x() @@ -108,12 +91,14 @@ def __get_accel(self, axis): return self.get_z() def __set_accel(self, axis, accel): + if accel < CONSTANTS.MIN_ACCELERATION or accel > CONSTANTS.MAX_ACCELERATION: + raise ValueError("") if axis == "x": - self.__x = self.__get_valid_acceleration(accel) + self.__x = accel elif axis == "y": - self.__y = self.__get_valid_acceleration(accel) + self.__y = accel elif axis == "z": - self.__z = self.__get_valid_acceleration(accel) + self.__z = accel def __set_gesture(self, gesture): if gesture in CONSTANTS.GESTURES: diff --git a/src/microbit/__model/constants.py b/src/microbit/__model/constants.py index b8c87bf9c..4af762a34 100644 --- a/src/microbit/__model/constants.py +++ b/src/microbit/__model/constants.py @@ -145,5 +145,8 @@ UNSUPPORTED_ADD_TYPE = "unsupported types for __add__:" SAME_SIZE_ERR = "images must be the same size" INVALID_GESTURE_ERR = "invalid gesture" +INVALID_ACCEL_ERR = "invalid acceleration" +INVALID_LIGHT_LEVEL_ERR = "invalid light level" +INVALID_TEMPERATURE_ERR = "invalid temperature" TIME_DELAY = 0.03 diff --git a/src/microbit/test/test_accelerometer.py b/src/microbit/test/test_accelerometer.py index df9ea281c..db3ccae65 100644 --- a/src/microbit/test/test_accelerometer.py +++ b/src/microbit/test/test_accelerometer.py @@ -10,39 +10,47 @@ def setup_method(self): self.accelerometer = Accelerometer() @pytest.mark.parametrize( - "accel, expected", + "accel", [ - (CONSTANTS.MIN_ACCELERATION - 10, CONSTANTS.MIN_ACCELERATION), - (CONSTANTS.MIN_ACCELERATION, CONSTANTS.MIN_ACCELERATION), - (100, 100), - (CONSTANTS.MAX_ACCELERATION, CONSTANTS.MAX_ACCELERATION), - (CONSTANTS.MAX_ACCELERATION + 1, CONSTANTS.MAX_ACCELERATION), + CONSTANTS.MIN_ACCELERATION, + CONSTANTS.MIN_ACCELERATION + 1, + 100, + CONSTANTS.MAX_ACCELERATION - 1, + CONSTANTS.MAX_ACCELERATION, ], ) - def test_x_y_z(self, accel, expected): - self.accelerometer._Accelerometer__set_x(accel) - assert expected == self.accelerometer.get_x() - self.accelerometer._Accelerometer__set_y(accel) - assert expected == self.accelerometer.get_y() - self.accelerometer._Accelerometer__set_z(accel) - assert expected == self.accelerometer.get_z() + def test_x_y_z(self, accel): + self.accelerometer._Accelerometer__set_accel("x", accel) + assert accel == self.accelerometer.get_x() + self.accelerometer._Accelerometer__set_accel("y", accel) + assert accel == self.accelerometer.get_y() + self.accelerometer._Accelerometer__set_accel("z", accel) + assert accel == self.accelerometer.get_z() + + @pytest.mark.parametrize("axis", ["x", "y", "z"]) + def test_x_y_z_invalid_accel(self, axis): + with pytest.raises(ValueError): + self.accelerometer._Accelerometer__set_accel( + axis, CONSTANTS.MAX_ACCELERATION + 1 + ) + with pytest.raises(ValueError): + self.accelerometer._Accelerometer__set_accel( + axis, CONSTANTS.MIN_ACCELERATION - 1 + ) @pytest.mark.parametrize( - "accels, expected", + "accels", [ - ((23, 25, 26), (23, 25, 26)), - ((204, 234, -534), (204, 234, -534)), - ( - (CONSTANTS.MIN_ACCELERATION - 10, 234, CONSTANTS.MAX_ACCELERATION), - (CONSTANTS.MIN_ACCELERATION, 234, CONSTANTS.MAX_ACCELERATION), - ), + (23, 25, 26), + (204, 234, -534), + (CONSTANTS.MIN_ACCELERATION + 10, 234, CONSTANTS.MAX_ACCELERATION), ], ) - def test_get_values(self, accels, expected): - self.accelerometer._Accelerometer__set_x(accels[0]) - self.accelerometer._Accelerometer__set_y(accels[1]) - self.accelerometer._Accelerometer__set_z(accels[2]) - assert expected == self.accelerometer.get_values() + def test_get_values(self, accels): + self.accelerometer._Accelerometer__set_accel("x", accels[0]) + self.accelerometer._Accelerometer__set_accel("y", accels[1]) + self.accelerometer._Accelerometer__set_accel("z", accels[2]) + assert accels == self.accelerometer.get_values() @pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) def test_current_gesture(self, gesture): From d200b1bf67c28ee1ff2dee53041e3ede342ba26d Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Tue, 11 Feb 2020 11:01:04 -0800 Subject: [PATCH 25/40] Updated temp and light_level to raise exception for invalid values --- src/microbit/__model/display.py | 6 ++---- src/microbit/__model/microbit_model.py | 9 +++++---- src/microbit/test/test_display.py | 22 ++++++++++++---------- src/microbit/test/test_microbit_model.py | 21 +++++++++++---------- 4 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/microbit/__model/display.py b/src/microbit/__model/display.py index e5920a79f..c8402525b 100644 --- a/src/microbit/__model/display.py +++ b/src/microbit/__model/display.py @@ -234,10 +234,8 @@ def read_light_level(self): return self.__light_level def __set_light_level(self, level): - if level < CONSTANTS.MIN_LIGHT_LEVEL: - self.__light_level = CONSTANTS.MIN_LIGHT_LEVEL - elif level > CONSTANTS.MAX_LIGHT_LEVEL: - self.__light_level = CONSTANTS.MAX_LIGHT_LEVEL + if level < CONSTANTS.MIN_LIGHT_LEVEL or level > CONSTANTS.MAX_LIGHT_LEVEL: + raise ValueError(CONSTANTS.INVALID_LIGHT_LEVEL_ERR) else: self.__light_level = level diff --git a/src/microbit/__model/microbit_model.py b/src/microbit/__model/microbit_model.py index a6d585545..73695bb3b 100644 --- a/src/microbit/__model/microbit_model.py +++ b/src/microbit/__model/microbit_model.py @@ -28,10 +28,11 @@ def temperature(self): return self.__temperature def __set_temperature(self, temperature): - if temperature < CONSTANTS.MIN_TEMPERATURE: - self.__temperature = CONSTANTS.MIN_TEMPERATURE - elif temperature > CONSTANTS.MAX_TEMPERATURE: - self.__temperature = CONSTANTS.MAX_TEMPERATURE + if ( + temperature < CONSTANTS.MIN_TEMPERATURE + or temperature > CONSTANTS.MAX_TEMPERATURE + ): + raise ValueError(CONSTANTS.INVALID_TEMPERATURE_ERR) else: self.__temperature = temperature diff --git a/src/microbit/test/test_display.py b/src/microbit/test/test_display.py index dc5beafb1..42a4cf153 100644 --- a/src/microbit/test/test_display.py +++ b/src/microbit/test/test_display.py @@ -158,18 +158,20 @@ def test_async_tests(self): assert Image._Image__same_image(Image(STR_SIX), self.display._Display__image) @pytest.mark.parametrize( - "light_level, expected", - [ - (CONSTANTS.MIN_LIGHT_LEVEL - 10, CONSTANTS.MIN_LIGHT_LEVEL), - (CONSTANTS.MIN_LIGHT_LEVEL, CONSTANTS.MIN_LIGHT_LEVEL), - (100, 100), - (CONSTANTS.MAX_LIGHT_LEVEL, CONSTANTS.MAX_LIGHT_LEVEL), - (CONSTANTS.MAX_LIGHT_LEVEL + 10, CONSTANTS.MAX_LIGHT_LEVEL), - ], + "light_level", + [CONSTANTS.MIN_LIGHT_LEVEL + 10, 100, CONSTANTS.MAX_LIGHT_LEVEL,], ) - def test_temperature(self, light_level, expected): + def test_light_level(self, light_level): self.display._Display__set_light_level(light_level) - assert expected == self.display.read_light_level() + assert light_level == self.display.read_light_level() + + @pytest.mark.parametrize( + "invalid_light_level", + [CONSTANTS.MIN_LIGHT_LEVEL - 1, CONSTANTS.MAX_LIGHT_LEVEL + 1], + ) + def test_invalid_light_level(self, invalid_light_level): + with pytest.raises(ValueError): + self.display._Display__set_light_level(invalid_light_level) # Helpers def __is_clear(self): diff --git a/src/microbit/test/test_microbit_model.py b/src/microbit/test/test_microbit_model.py index a6436ec71..004727c07 100644 --- a/src/microbit/test/test_microbit_model.py +++ b/src/microbit/test/test_microbit_model.py @@ -27,15 +27,16 @@ def test_running_time(self): ) @pytest.mark.parametrize( - "temperature, expected", - [ - (CONSTANTS.MIN_TEMPERATURE - 10, CONSTANTS.MIN_TEMPERATURE), - (CONSTANTS.MIN_TEMPERATURE, CONSTANTS.MIN_TEMPERATURE), - (0, 0), - (CONSTANTS.MAX_TEMPERATURE, CONSTANTS.MAX_TEMPERATURE), - (CONSTANTS.MAX_TEMPERATURE + 5, CONSTANTS.MAX_TEMPERATURE), - ], + "temperature", [CONSTANTS.MIN_TEMPERATURE, 0, CONSTANTS.MAX_TEMPERATURE], ) - def test_temperature(self, temperature, expected): + def test_temperature(self, temperature): self.__mb._MicrobitModel__set_temperature(temperature) - assert expected == self.__mb.temperature() + assert temperature == self.__mb.temperature() + + @pytest.mark.parametrize( + "invalid_temperature", + [CONSTANTS.MIN_TEMPERATURE - 10, CONSTANTS.MAX_TEMPERATURE + 5], + ) + def test_invalid_temperature(self, invalid_temperature): + with pytest.raises(ValueError): + self.__mb._MicrobitModel__set_temperature(invalid_temperature) From 00cf23827eb28a7c8ed77447dbe8e5bcfe85136d Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Tue, 11 Feb 2020 11:02:50 -0800 Subject: [PATCH 26/40] Added init tests --- src/microbit/test/test_init.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/microbit/test/test_init.py diff --git a/src/microbit/test/test_init.py b/src/microbit/test/test_init.py new file mode 100644 index 000000000..fb25d2c16 --- /dev/null +++ b/src/microbit/test/test_init.py @@ -0,0 +1,27 @@ +import time + +import pytest +from unittest import mock + +from .. import * +from ..__model.microbit_model import MicrobitModel + +# tests methods in __init__.py + + +class TestShim(object): + def test_sleep(self): + milliseconds = 100 + MicrobitModel.sleep = mock.Mock() + sleep(milliseconds) + MicrobitModel.sleep.assert_called_with(milliseconds) + + def test_running_time(self): + MicrobitModel.running_time = mock.Mock() + running_time() + MicrobitModel.running_time.assert_called_once() + + def test_temperature(self): + MicrobitModel.temperature = mock.Mock() + temperature() + MicrobitModel.temperature.asser_called_once() From 0d6d021552f592770ef66ca08267a55335b6a5ac Mon Sep 17 00:00:00 2001 From: andreamah Date: Tue, 11 Feb 2020 11:10:09 -0800 Subject: [PATCH 27/40] got sensors working --- src/microbit/__model/constants.py | 14 ++++++++------ src/microbit/__model/microbit_model.py | 12 +++++------- src/process_user_code.py | 1 - 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/microbit/__model/constants.py b/src/microbit/__model/constants.py index 5f43ddaee..462bf29ee 100644 --- a/src/microbit/__model/constants.py +++ b/src/microbit/__model/constants.py @@ -153,10 +153,12 @@ "button_b", ] -EXPECTED_INPUT_LIGHT_MICROBIT = "light" +EXPECTED_INPUT_ACCEL = { + "motion_x":"x", + "motion_y":"y", + "motion_z":"z", +} -EXPECTED_INPUT_SENSORS_MICROBIT = [ - "temperature", - "light", -] -EXPECTED_INPUT_TEMP_MICROBIT = "temperature" +EXPECTED_INPUT_LIGHT = "light" + +EXPECTED_INPUT_TEMP = "temperature" diff --git a/src/microbit/__model/microbit_model.py b/src/microbit/__model/microbit_model.py index 9f81c407f..d92752379 100644 --- a/src/microbit/__model/microbit_model.py +++ b/src/microbit/__model/microbit_model.py @@ -16,7 +16,7 @@ def __init__(self): self.__start_time = time.time() self.__temperature = 0 - self.microbit_button_dict = { + self.__microbit_button_dict = { "button_a": self.button_a, "button_b": self.button_b, } @@ -41,7 +41,7 @@ def __set_temperature(self, temperature): def update_state(self, new_state): for button_name in CONSTANTS.EXPECTED_INPUT_BUTTONS: - button = self.microbit_button_dict[button_name] + button = self.__microbit_button_dict[button_name] previous_pressed = button.is_pressed() button_pressed = new_state.get(button_name, previous_pressed) @@ -53,7 +53,7 @@ def update_state(self, new_state): button._Button__release() # set motion_x, motion_y, motion_z - for name, direction in CONSTANTS.EXPECTED_INPUT_ACCEL_MICROBIT: + for name, direction in CONSTANTS.EXPECTED_INPUT_ACCEL.items(): previous_motion_val = self.accelerometer._Accelerometer__get_accel( direction ) @@ -65,16 +65,14 @@ def update_state(self, new_state): # set temperature previous_temp = self.temperature() - new_temp = new_state.get( - CONSTANTS.EXPECTED_INPUT_TEMP_MICROBIT, previous_temp - ) + new_temp = new_state.get(CONSTANTS.EXPECTED_INPUT_TEMP, previous_temp) if new_temp != previous_temp: self._MicrobitModel__set_temperature(new_temp) # set light level previous_light_level = self.display.read_light_level() new_light_level = new_state.get( - CONSTANTS.EXPECTED_INPUT_LIGHT_MICROBIT, previous_light_level + CONSTANTS.EXPECTED_INPUT_LIGHT, previous_light_level ) if new_light_level != previous_light_level: self.display._Display__set_light_level(new_light_level) diff --git a/src/process_user_code.py b/src/process_user_code.py index 486551e2b..e34c19c21 100644 --- a/src/process_user_code.py +++ b/src/process_user_code.py @@ -50,7 +50,6 @@ def run(self): new_state_message = json.loads(read_val) device = new_state_message.get(CONSTANTS.ACTIVE_DEVICE_FIELD) new_state = new_state_message.get(CONSTANTS.STATE_FIELD, {}) - if device in device_dict: device_dict[device].update_state(new_state) else: From 4c3fb2f1b7f72f3ff30b9214de54537655ee25e1 Mon Sep 17 00:00:00 2001 From: andreamah Date: Tue, 11 Feb 2020 11:10:31 -0800 Subject: [PATCH 28/40] reformatted --- src/microbit/__model/constants.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/microbit/__model/constants.py b/src/microbit/__model/constants.py index 462bf29ee..42595d755 100644 --- a/src/microbit/__model/constants.py +++ b/src/microbit/__model/constants.py @@ -154,9 +154,9 @@ ] EXPECTED_INPUT_ACCEL = { - "motion_x":"x", - "motion_y":"y", - "motion_z":"z", + "motion_x": "x", + "motion_y": "y", + "motion_z": "z", } EXPECTED_INPUT_LIGHT = "light" From d3309c2f1ba2a5351e99b5b48622656c3fa0eca0 Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Tue, 11 Feb 2020 11:14:21 -0800 Subject: [PATCH 29/40] removed comma --- src/microbit/test/test_display.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/microbit/test/test_display.py b/src/microbit/test/test_display.py index 42a4cf153..af283073b 100644 --- a/src/microbit/test/test_display.py +++ b/src/microbit/test/test_display.py @@ -158,8 +158,7 @@ def test_async_tests(self): assert Image._Image__same_image(Image(STR_SIX), self.display._Display__image) @pytest.mark.parametrize( - "light_level", - [CONSTANTS.MIN_LIGHT_LEVEL + 10, 100, CONSTANTS.MAX_LIGHT_LEVEL,], + "light_level", [CONSTANTS.MIN_LIGHT_LEVEL + 10, 100, CONSTANTS.MAX_LIGHT_LEVEL], ) def test_light_level(self, light_level): self.display._Display__set_light_level(light_level) From 1fc609a067c4898c609cd95e64ddb6e062706405 Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Tue, 11 Feb 2020 11:16:08 -0800 Subject: [PATCH 30/40] accel error message changed --- src/microbit/__model/accelerometer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/microbit/__model/accelerometer.py b/src/microbit/__model/accelerometer.py index 92fcafe4e..50407828e 100644 --- a/src/microbit/__model/accelerometer.py +++ b/src/microbit/__model/accelerometer.py @@ -92,7 +92,7 @@ def __get_accel(self, axis): def __set_accel(self, axis, accel): if accel < CONSTANTS.MIN_ACCELERATION or accel > CONSTANTS.MAX_ACCELERATION: - raise ValueError("") + raise ValueError(CONSTANTS.INVALID_ACCEL_ERR) if axis == "x": self.__x = accel elif axis == "y": From 933b4ad5367c8d783218284285a698f92cbc3300 Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Tue, 11 Feb 2020 11:21:40 -0800 Subject: [PATCH 31/40] sorted imports --- src/microbit/test/test_accelerometer.py | 2 +- src/microbit/test/test_microbit_model.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/microbit/test/test_accelerometer.py b/src/microbit/test/test_accelerometer.py index db3ccae65..0e654727c 100644 --- a/src/microbit/test/test_accelerometer.py +++ b/src/microbit/test/test_accelerometer.py @@ -1,8 +1,8 @@ import pytest from unittest import mock -from ..__model import constants as CONSTANTS from ..__model.accelerometer import Accelerometer +from ..__model import constants as CONSTANTS class TestAccelerometer(object): diff --git a/src/microbit/test/test_microbit_model.py b/src/microbit/test/test_microbit_model.py index 004727c07..9ad05772c 100644 --- a/src/microbit/test/test_microbit_model.py +++ b/src/microbit/test/test_microbit_model.py @@ -2,8 +2,8 @@ import pytest from unittest import mock -from ..__model.microbit_model import MicrobitModel from ..__model import constants as CONSTANTS +from ..__model.microbit_model import MicrobitModel class TestMicrobitModel(object): From b46af052caf86ed0d5851ab4bfd07232bf64ee60 Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Tue, 11 Feb 2020 13:34:19 -0800 Subject: [PATCH 32/40] Updated tests --- src/microbit/test/test_init.py | 18 ++++++++++++++++++ src/microbit/test/test_microbit_model.py | 1 - 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/microbit/test/test_init.py b/src/microbit/test/test_init.py index fb25d2c16..c6882ac75 100644 --- a/src/microbit/test/test_init.py +++ b/src/microbit/test/test_init.py @@ -11,17 +11,35 @@ class TestShim(object): def test_sleep(self): + # Save pointer to function about to be mocked + real_function = MicrobitModel.sleep + milliseconds = 100 MicrobitModel.sleep = mock.Mock() sleep(milliseconds) MicrobitModel.sleep.assert_called_with(milliseconds) + # Restore original function + MicrobitModel.sleep = real_function + def test_running_time(self): + # Save pointer to function about to be mocked + real_function = MicrobitModel.running_time + MicrobitModel.running_time = mock.Mock() running_time() MicrobitModel.running_time.assert_called_once() + # Restore original function + MicrobitModel.running_time = real_function + def test_temperature(self): + # Save pointer to function about to be mocked + real_function = MicrobitModel.temperature + MicrobitModel.temperature = mock.Mock() temperature() MicrobitModel.temperature.asser_called_once() + + # Restore original function + MicrobitModel.temperature = real_function diff --git a/src/microbit/test/test_microbit_model.py b/src/microbit/test/test_microbit_model.py index 9ad05772c..8d1917e57 100644 --- a/src/microbit/test/test_microbit_model.py +++ b/src/microbit/test/test_microbit_model.py @@ -21,7 +21,6 @@ def test_running_time(self): mock_end_time = 300 self.__mb._MicrobitModel__start_time = mock_start_time time.time = mock.MagicMock(return_value=mock_end_time) - print(time.time()) assert mock_end_time - mock_start_time == pytest.approx( self.__mb.running_time() ) From 8c8651261f01470d4ab9e073b9be96ba7983f359 Mon Sep 17 00:00:00 2001 From: xnkevinnguyen Date: Tue, 11 Feb 2020 15:02:42 -0800 Subject: [PATCH 33/40] Update tests for snapshot with added toolbar --- src/view/components/microbit/Microbit.tsx | 8 + src/view/components/toolbar/InputSlider.tsx | 2 +- .../components/toolbar/SensorModalUtils.tsx | 39 ++- .../toolbar/motion/Accelerometer.tsx | 2 +- .../toolbar/motion/MotionSensorBar.tsx | 6 +- .../device/__snapshots__/Device.spec.tsx.snap | 296 ++++++++++++++++++ src/view/translations/en.json | 10 +- 7 files changed, 341 insertions(+), 22 deletions(-) diff --git a/src/view/components/microbit/Microbit.tsx b/src/view/components/microbit/Microbit.tsx index abcb9b12c..fb918df4b 100644 --- a/src/view/components/microbit/Microbit.tsx +++ b/src/view/components/microbit/Microbit.tsx @@ -22,6 +22,14 @@ export class Microbit extends React.Component { } const MICROBIT_TOOLBAR_BUTTONS: Array<{ label: string; image: JSX.Element }> = [ + { + image: TOOLBAR_SVG.PUSH_BUTTON_SVG, + label: MICROBIT_TOOLBAR_ID.PUSH_BUTTON, + }, + { + image: TOOLBAR_SVG.RED_LED_SVG, + label: MICROBIT_TOOLBAR_ID.LEDS, + }, { image: TOOLBAR_SVG.TEMPERATURE_SVG, label: MICROBIT_TOOLBAR_ID.TEMPERATURE, diff --git a/src/view/components/toolbar/InputSlider.tsx b/src/view/components/toolbar/InputSlider.tsx index 52bb643b9..c9f547a87 100644 --- a/src/view/components/toolbar/InputSlider.tsx +++ b/src/view/components/toolbar/InputSlider.tsx @@ -63,7 +63,7 @@ class InputSlider extends React.Component { value={this.state.value} onInput={this.handleOnChange} defaultValue={this.props.minValue.toLocaleString()} - pattern="^-?[0-9]{0,3}$" + pattern="^-?[0-9]{0,4}$" onKeyUp={this.handleOnChange} aria-label={`${this.props.type} sensor input ${this.props.axisLabel}`} /> diff --git a/src/view/components/toolbar/SensorModalUtils.tsx b/src/view/components/toolbar/SensorModalUtils.tsx index ed39a1186..51c274b8c 100644 --- a/src/view/components/toolbar/SensorModalUtils.tsx +++ b/src/view/components/toolbar/SensorModalUtils.tsx @@ -54,6 +54,8 @@ export const MICROBIT_TOOLBAR_ID = { TEMPERATURE: "toolbar-temperature-sensor", LIGHT: "toolbar-light-sensor", ACCELEROMETER: "toolbar-accelerometer", + LEDS: "toolbar-microbit-led", + PUSH_BUTTON: "toolbar-microbit-button", }; export interface IModalContent { @@ -64,7 +66,6 @@ export interface IModalContent { tagInput: any; tagOutput: any; tryItDescription: string; - tryItTitle: string; } export const DEFAULT_MODAL_CONTENT: IModalContent = { @@ -72,7 +73,6 @@ export const DEFAULT_MODAL_CONTENT: IModalContent = { tagInput: undefined, tagOutput: undefined, descriptionText: "none", - tryItTitle: "none", tryItDescription: "none", component: undefined, id: "none", @@ -82,7 +82,6 @@ export const GPIO_MODAL_CONTENT: IModalContent = { tagInput: TAG_INPUT_SVG, tagOutput: TAG_OUTPUT_SVG, descriptionText: "toolbar-gpio.description", - tryItTitle: "Simulation Coming Soon!", tryItDescription: "toolbar-gpio.tryItDescription", component: undefined, id: "GPIO", @@ -93,7 +92,6 @@ export const IR_MODAL_CONTENT: IModalContent = { tagInput: TAG_INPUT_SVG, tagOutput: TAG_OUTPUT_SVG, descriptionText: "toolbar-ir-sensor.description", - tryItTitle: "Simulation Coming Soon!", tryItDescription: "toolbar-ir-sensor.tryItDescription", component: TRY_IT_MAKE_CODE, id: "IR", @@ -103,7 +101,6 @@ export const LIGHT_MODAL_CONTENT: IModalContent = { tagInput: TAG_INPUT_SVG, tagOutput: undefined, descriptionText: "toolbar-light-sensor.description", - tryItTitle: "Try it on the Simulator!", tryItDescription: "toolbar-light-sensor.tryItDescription", component: , id: "light_sensor", @@ -113,7 +110,6 @@ export const MOTION_MODAL_CONTENT: IModalContent = { tagInput: TAG_INPUT_SVG, tagOutput: undefined, descriptionText: "toolbar-motion-sensor.description", - tryItTitle: "Try it on the Simulator!", tryItDescription: "toolbar-motion-sensor.tryItDescription", component: , id: "motion_sensor", @@ -123,7 +119,6 @@ export const NEOP_MODAL_CONTENT: IModalContent = { tagInput: undefined, tagOutput: TAG_OUTPUT_SVG, descriptionText: "toolbar-neo-pixels.description", - tryItTitle: "Try it on the Simulator!", tryItDescription: "toolbar-neo-pixels.tryItDescription", component: undefined, id: "neon_pixel", @@ -133,7 +128,6 @@ export const PUSHB_MODAL_CONTENT: IModalContent = { tagInput: TAG_INPUT_SVG, tagOutput: undefined, descriptionText: "toolbar-push-button.description", - tryItTitle: "Try it on the Simulator!", tryItDescription: "toolbar-push-button.tryItDescription", component: undefined, id: "push_btn", @@ -143,7 +137,6 @@ export const RED_LED_MODAL_CONTENT: IModalContent = { tagInput: undefined, tagOutput: TAG_OUTPUT_SVG, descriptionText: "toolbar-red-led.description", - tryItTitle: "Try it on the Simulator!", tryItDescription: "toolbar-red-led.tryItDescription", component: undefined, id: "red_LED", @@ -153,7 +146,6 @@ export const SOUND_MODAL_CONTENT: IModalContent = { tagInput: TAG_INPUT_SVG, tagOutput: undefined, descriptionText: "toolbar-sound-sensor.description", - tryItTitle: "Simulation Coming Soon!", tryItDescription: "toolbar-sound-sensor.tryItDescription", component: TRY_IT_MAKE_CODE, id: "sound_sensor", @@ -163,7 +155,6 @@ export const SWITCH_MODAL_CONTENT: IModalContent = { tagInput: TAG_INPUT_SVG, tagOutput: undefined, descriptionText: "toolbar-slider-switch.description", - tryItTitle: "Try it on the Simulator!", tryItDescription: "toolbar-slider-switch.tryItDescription", component: undefined, id: "slider_switch", @@ -173,7 +164,6 @@ export const SPEAKER_MODAL_CONTENT: IModalContent = { tagInput: undefined, tagOutput: TAG_OUTPUT_SVG, descriptionText: "toolbar-speaker.description", - tryItTitle: "Try it on the Simulator!", tryItDescription: "toolbar-speaker.tryItDescription", component: undefined, id: "speaker", @@ -186,18 +176,35 @@ export const TEMPERATURE_MODAL_CONTENT: IModalContent = { tagInput: TAG_INPUT_SVG, tagOutput: undefined, tryItDescription: "toolbar-temperature-sensor.tryItDescription", - tryItTitle: "Try it on the Simulator!", }; export const ACCELEROMETER_MODAL_CONTENT: IModalContent = { component: , descriptionText: "toolbar-accelerometer-sensor.description", descriptionTitle: "toolbar-accelerometer-sensor.title", - id: "temperature", + id: "accelerometer", tagInput: TAG_INPUT_SVG, tagOutput: undefined, tryItDescription: "toolbar-accelerometer-sensor.tryItDescription", - tryItTitle: "Try it on the Simulator!", +}; +export const MICROBIT_LED_CONTENT: IModalContent = { + descriptionTitle: "toolbar-microbit-led.title", + tagInput: undefined, + tagOutput: TAG_OUTPUT_SVG, + descriptionText: "toolbar-microbit-led.description", + tryItDescription: "toolbar-microbit-led.tryItDescription", + component: undefined, + id: "microbit_LED", +}; + +export const MICROBIT_BUTTON_CONTENT: IModalContent = { + descriptionTitle: "toolbar-microbit-button.title", + tagInput: undefined, + tagOutput: TAG_INPUT_SVG, + descriptionText: "toolbar-microbit-button.description", + tryItDescription: "toolbar-microbit-button.tryItDescription", + component: undefined, + id: "microbit_button", }; export const LABEL_TO_MODAL_CONTENT = new Map([ @@ -213,4 +220,6 @@ export const LABEL_TO_MODAL_CONTENT = new Map([ [CPX_TOOLBAR_ICON_ID.SWITCH, SWITCH_MODAL_CONTENT], [CPX_TOOLBAR_ICON_ID.TEMPERATURE, TEMPERATURE_MODAL_CONTENT], [MICROBIT_TOOLBAR_ID.ACCELEROMETER, ACCELEROMETER_MODAL_CONTENT], + [MICROBIT_TOOLBAR_ID.LEDS, MICROBIT_LED_CONTENT], + [MICROBIT_TOOLBAR_ID.PUSH_BUTTON, MICROBIT_BUTTON_CONTENT], ]); diff --git a/src/view/components/toolbar/motion/Accelerometer.tsx b/src/view/components/toolbar/motion/Accelerometer.tsx index 27a4c9878..5976ac97b 100644 --- a/src/view/components/toolbar/motion/Accelerometer.tsx +++ b/src/view/components/toolbar/motion/Accelerometer.tsx @@ -1,6 +1,6 @@ import * as React from "react"; +import { ISensorProps, ISliderProps } from "../../../viewUtils"; import { ThreeDimensionSlider } from "./threeDimensionSlider/ThreeDimensionSlider"; -import { ISliderProps, ISensorProps } from "../../../viewUtils"; const MOTION_SLIDER_PROPS_X: ISliderProps = { axisLabel: "X", diff --git a/src/view/components/toolbar/motion/MotionSensorBar.tsx b/src/view/components/toolbar/motion/MotionSensorBar.tsx index 4e7987945..6700afe9d 100644 --- a/src/view/components/toolbar/motion/MotionSensorBar.tsx +++ b/src/view/components/toolbar/motion/MotionSensorBar.tsx @@ -36,12 +36,12 @@ const MOTION_SLIDER_PROPS_Y: ISliderProps = { type: "motion_y", }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { + axisLabel: "Z", + maxLabel: "Down", maxValue: 78, - minValue: -78, minLabel: "Up", - maxLabel: "Down", + minValue: -78, type: "motion_z", - axisLabel: "Z", }; const MOTION_SENSOR_PROPERTIES: ISensorProps = { diff --git a/src/view/container/device/__snapshots__/Device.spec.tsx.snap b/src/view/container/device/__snapshots__/Device.spec.tsx.snap index dc4d9fbd9..5b04be945 100644 --- a/src/view/container/device/__snapshots__/Device.spec.tsx.snap +++ b/src/view/container/device/__snapshots__/Device.spec.tsx.snap @@ -2625,5 +2625,301 @@ exports[`Device component should render correctly 1`] = `
+
+
+
+ + + + + +
+
+
`; diff --git a/src/view/translations/en.json b/src/view/translations/en.json index a0381df4a..0a60d3d0d 100644 --- a/src/view/translations/en.json +++ b/src/view/translations/en.json @@ -1,7 +1,7 @@ { "toolbar-gpio.description": "8 GPIOs on the device! Pin A1 - A7 can also be used as capacitive touch sensors, and A0 is a true analog output pin.", "toolbar-gpio.title": "GPIO", - "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT+”1” - “7”", + "toolbar-gpio.tryItDescription": "Use your mouse to interact with the pin A1 - A7 or use your keyboard SHIFT+”1” - “7”.", "toolbar-ir-sensor.description": "Allows you to send commands to the device with a remote control, or even send messages between multiple devices! You can also do very simple proximity sensing since it reads the reflected light.", "toolbar-ir-sensor.title": "IR Transmit & Receiver", "toolbar-ir-sensor.tryItDescription": "We’re working hard to support this sensor on the simulator in the Device Simulator Express. You can try it on MakeCode!", @@ -35,5 +35,11 @@ "toolbar-temperature-sensor.tryItDescription": "You can set the temperature range from your code!", "toolbar-accelerometer-sensor.title": "Accelerometer", "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", - "toolbar-accelerometer-sensor.tryItDescription": "Change the acceleration here" + "toolbar-accelerometer-sensor.tryItDescription": "Change the acceleration here.", + "toolbar-microbit-led.title": "LEDs", + "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 level of brightness.", + "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", + "toolbar-microbit-button.title": "Buttons", + "toolbar-microbit-button.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", + "toolbar-microbit-button.tryItDescription": "Click them with your mouse or by pressing “A” “B” on your keyboard!" } From d00ca9b2f51e720e44af5b3a78b5fbd017bde3e0 Mon Sep 17 00:00:00 2001 From: andreamah Date: Tue, 11 Feb 2020 15:43:11 -0800 Subject: [PATCH 34/40] incorporated PR feedback --- src/microbit/__model/microbit_model.py | 64 +++++++++++++++----------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/src/microbit/__model/microbit_model.py b/src/microbit/__model/microbit_model.py index 645298c92..91b11ab3d 100644 --- a/src/microbit/__model/microbit_model.py +++ b/src/microbit/__model/microbit_model.py @@ -41,42 +41,52 @@ def __set_temperature(self, temperature): self.__temperature = temperature def update_state(self, new_state): + self.__update_buttons(new_state) + self.__update_motion(new_state) + self.__update_light(new_state) + self.__update_temp(new_state) + + # helpers + def __update_buttons(self, new_state): + # get button pushes for button_name in CONSTANTS.EXPECTED_INPUT_BUTTONS: button = self.__microbit_button_dict[button_name] - previous_pressed = button.is_pressed() - button_pressed = new_state.get(button_name, previous_pressed) + was_button_pressed = button.is_pressed() + is_button_pressed = new_state.get(button_name, was_button_pressed) - if button_pressed != previous_pressed: - if button_pressed: + if is_button_pressed != was_button_pressed: + if is_button_pressed: button._Button__press_down() else: button._Button__release() - # set motion_x, motion_y, motion_z - for name, direction in CONSTANTS.EXPECTED_INPUT_ACCEL.items(): - previous_motion_val = self.accelerometer._Accelerometer__get_accel( - direction - ) - new_motion_val = new_state.get(name, previous_motion_val) - if new_motion_val != previous_motion_val: - self.accelerometer._Accelerometer__set_accel( - direction, new_motion_val - ) - - # set temperature - previous_temp = self.temperature() - new_temp = new_state.get(CONSTANTS.EXPECTED_INPUT_TEMP, previous_temp) - if new_temp != previous_temp: - self._MicrobitModel__set_temperature(new_temp) - - # set light level - previous_light_level = self.display.read_light_level() - new_light_level = new_state.get( - CONSTANTS.EXPECTED_INPUT_LIGHT, previous_light_level + def __update_motion(self, new_state): + # set motion_x, motion_y, motion_z + for name, direction in CONSTANTS.EXPECTED_INPUT_ACCEL.items(): + previous_motion_val = self.accelerometer._Accelerometer__get_accel( + direction ) - if new_light_level != previous_light_level: - self.display._Display__set_light_level(new_light_level) + new_motion_val = new_state.get(name, previous_motion_val) + if new_motion_val != previous_motion_val: + self.accelerometer._Accelerometer__set_accel( + direction, new_motion_val + ) + def __update_light(self, new_state): + # set light level + previous_light_level = self.display.read_light_level() + new_light_level = new_state.get( + CONSTANTS.EXPECTED_INPUT_LIGHT, previous_light_level + ) + if new_light_level != previous_light_level: + self.display._Display__set_light_level(new_light_level) + + def __update_temp(self, new_state): + # set temperature + previous_temp = self.temperature() + new_temp = new_state.get(CONSTANTS.EXPECTED_INPUT_TEMP, previous_temp) + if new_temp != previous_temp: + self._MicrobitModel__set_temperature(new_temp) __mb = MicrobitModel() From 7b75f7656ec07e2ddb909849d9fdc81a08209e23 Mon Sep 17 00:00:00 2001 From: andreamah Date: Tue, 11 Feb 2020 15:43:44 -0800 Subject: [PATCH 35/40] reformatting --- src/microbit/__model/microbit_model.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/microbit/__model/microbit_model.py b/src/microbit/__model/microbit_model.py index 91b11ab3d..d78aedeec 100644 --- a/src/microbit/__model/microbit_model.py +++ b/src/microbit/__model/microbit_model.py @@ -69,9 +69,7 @@ def __update_motion(self, new_state): ) new_motion_val = new_state.get(name, previous_motion_val) if new_motion_val != previous_motion_val: - self.accelerometer._Accelerometer__set_accel( - direction, new_motion_val - ) + self.accelerometer._Accelerometer__set_accel(direction, new_motion_val) def __update_light(self, new_state): # set light level @@ -81,7 +79,7 @@ def __update_light(self, new_state): ) if new_light_level != previous_light_level: self.display._Display__set_light_level(new_light_level) - + def __update_temp(self, new_state): # set temperature previous_temp = self.temperature() @@ -89,4 +87,5 @@ def __update_temp(self, new_state): if new_temp != previous_temp: self._MicrobitModel__set_temperature(new_temp) + __mb = MicrobitModel() From 58f97a5d0eb01b7450b508ea641cd6f09b7b67de Mon Sep 17 00:00:00 2001 From: xnkevinnguyen Date: Tue, 11 Feb 2020 16:09:52 -0800 Subject: [PATCH 36/40] Remove any declerations of vscode that are duplicate to utils --- src/view/components/toolbar/InputSlider.tsx | 19 ++++--------------- .../toolbar/motion/MotionSensorBar.tsx | 15 +++------------ 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/src/view/components/toolbar/InputSlider.tsx b/src/view/components/toolbar/InputSlider.tsx index c9f547a87..260be15c9 100644 --- a/src/view/components/toolbar/InputSlider.tsx +++ b/src/view/components/toolbar/InputSlider.tsx @@ -2,19 +2,11 @@ // Licensed under the MIT license. import * as React from "react"; +import { WEBVIEW_MESSAGES } from "../../constants"; import "../../styles/InputSlider.css"; +import { sendMessage } from "../../utils/MessageUtils"; import { ISliderProps } from "../../viewUtils"; -interface vscode { - postMessage(message: any): void; -} - -declare const vscode: vscode; - -const sendMessage = (state: any) => { - vscode.postMessage({ command: "sensor-changed", text: state }); -}; - class InputSlider extends React.Component { constructor(props: ISliderProps) { super(props); @@ -100,7 +92,7 @@ class InputSlider extends React.Component { const validatedValue = this.validateRange(this.updateValue(event)); const newSensorState = this.writeMessage(validatedValue); if (newSensorState) { - sendMessage(newSensorState); + sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, newSensorState); } }; @@ -124,10 +116,7 @@ class InputSlider extends React.Component { }; private sendTelemetry = () => { - vscode.postMessage({ - command: "slider-telemetry", - text: this.props.type, - }); + sendMessage(WEBVIEW_MESSAGES.SLIDER_TELEMETRY, this.props.type); }; private validateRange = (valueString: string) => { diff --git a/src/view/components/toolbar/motion/MotionSensorBar.tsx b/src/view/components/toolbar/motion/MotionSensorBar.tsx index 6700afe9d..08d959e12 100644 --- a/src/view/components/toolbar/motion/MotionSensorBar.tsx +++ b/src/view/components/toolbar/motion/MotionSensorBar.tsx @@ -2,23 +2,14 @@ // Licensed under the MIT license. import * as React from "react"; -import { CONSTANTS } from "../../../constants"; +import { CONSTANTS, WEBVIEW_MESSAGES } from "../../../constants"; import "../../../styles/MotionSensorBar.css"; +import { sendMessage } from "../../../utils/MessageUtils"; import { ISensorProps, ISliderProps } from "../../../viewUtils"; import svg from "../../cpx/Svg_utils"; import SensorButton from "../SensorButton"; import { ThreeDimensionSlider } from "./threeDimensionSlider/ThreeDimensionSlider"; -interface vscode { - postMessage(message: any): void; -} - -declare const vscode: vscode; - -const sendMessage = (state: any) => { - vscode.postMessage({ command: "sensor-changed", text: state }); -}; - const MOTION_SLIDER_PROPS_X: ISliderProps = { axisLabel: "X", maxLabel: "Right", @@ -97,7 +88,7 @@ class MotionSensorBar extends React.Component { private handleOnclick = (active: boolean, type: string) => { const messageState = { [type]: active }; - sendMessage(messageState); + sendMessage(WEBVIEW_MESSAGES.SENSOR_CHANGED, messageState); }; private onKeyEvent( From d7ff9f44727f32b359ead8ea975562827c4dbd36 Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Tue, 11 Feb 2020 16:13:35 -0800 Subject: [PATCH 37/40] Updated for PR comments --- src/microbit/__model/accelerometer.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/microbit/__model/accelerometer.py b/src/microbit/__model/accelerometer.py index 50407828e..29ddb9124 100644 --- a/src/microbit/__model/accelerometer.py +++ b/src/microbit/__model/accelerometer.py @@ -103,8 +103,10 @@ def __set_accel(self, axis, accel): def __set_gesture(self, gesture): if gesture in CONSTANTS.GESTURES: self.__current_gesture = gesture - else: + elif gesture == "": self.__current_gesture = "" + else: + raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) def __add_current_gesture_to_gesture_lists(self): if self.__current_gesture in CONSTANTS.GESTURES: From df5edafc34bec39e0c77eb3462443093986e932d Mon Sep 17 00:00:00 2001 From: Vandy Liu Date: Tue, 11 Feb 2020 16:32:07 -0800 Subject: [PATCH 38/40] updated from pr comments --- src/view/components/toolbar/motion/Accelerometer.tsx | 6 +++--- src/view/translations/en.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/view/components/toolbar/motion/Accelerometer.tsx b/src/view/components/toolbar/motion/Accelerometer.tsx index 5976ac97b..434688010 100644 --- a/src/view/components/toolbar/motion/Accelerometer.tsx +++ b/src/view/components/toolbar/motion/Accelerometer.tsx @@ -19,12 +19,12 @@ const MOTION_SLIDER_PROPS_Y: ISliderProps = { type: "motion_y", }; const MOTION_SLIDER_PROPS_Z: ISliderProps = { + axisLabel: "Z", + maxLabel: "Down", maxValue: 1023, - minValue: -1023, minLabel: "Up", - maxLabel: "Down", + minValue: -1023, type: "motion_z", - axisLabel: "Z", }; const MOTION_SENSOR_PROPERTIES: ISensorProps = { diff --git a/src/view/translations/en.json b/src/view/translations/en.json index 0a60d3d0d..ecd96d80f 100644 --- a/src/view/translations/en.json +++ b/src/view/translations/en.json @@ -37,9 +37,9 @@ "toolbar-accelerometer-sensor.description": "An accelerometer measures the acceleration of your micro:bit; this component senses when the micro:bit is moved.", "toolbar-accelerometer-sensor.tryItDescription": "Change the acceleration here.", "toolbar-microbit-led.title": "LEDs", - "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 level of brightness.", + "toolbar-microbit-led.description": "The microbit has 25 LEDs for you to play with. The LEDs have 9 levels of brightness.", "toolbar-microbit-led.tryItDescription": "Run your code and see the LEDs light up!", "toolbar-microbit-button.title": "Buttons", "toolbar-microbit-button.description": "There are two buttons on the front of the micro:bit (labelled A and B). The third button is to trigger both A and B buttons. You can detect when these buttons are pressed, allowing you to trigger code on the device.", - "toolbar-microbit-button.tryItDescription": "Click them with your mouse or by pressing “A” “B” on your keyboard!" + "toolbar-microbit-button.tryItDescription": "Click them with your mouse. Pressing “A” “B” on your keyboard will be implemented soon!" } From 65d9d63eb1d89b5870f6674b6d32fc717f40bc9a Mon Sep 17 00:00:00 2001 From: andreamah Date: Tue, 11 Feb 2020 20:40:32 -0800 Subject: [PATCH 39/40] abstracted away updating into components --- src/microbit/__model/accelerometer.py | 9 +++++++ src/microbit/__model/button.py | 11 +++++++++ src/microbit/__model/display.py | 6 +++++ src/microbit/__model/microbit_model.py | 34 ++++++++------------------ 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/microbit/__model/accelerometer.py b/src/microbit/__model/accelerometer.py index 51dabea0d..05b0f7e8c 100644 --- a/src/microbit/__model/accelerometer.py +++ b/src/microbit/__model/accelerometer.py @@ -112,3 +112,12 @@ def __add_current_gesture_to_gesture_lists(self): if self.__current_gesture in CONSTANTS.GESTURES: self.__gestures.append(self.__current_gesture) self.__prev_gestures.add(self.__current_gesture) + + def __update(self, axis, accel): + if accel is not None: + previous_accel = self.__get_accel( + axis + ) + if accel != previous_accel: + self.__set_accel(axis, accel) + \ No newline at end of file diff --git a/src/microbit/__model/button.py b/src/microbit/__model/button.py index ee00ad350..5282cf6cf 100644 --- a/src/microbit/__model/button.py +++ b/src/microbit/__model/button.py @@ -40,3 +40,14 @@ def __press_down(self): def __release(self): self.__pressed = False + + + def __update(self, is_button_pressed): + if is_button_pressed is not None: + was_button_pressed = self.is_pressed() + + if is_button_pressed != was_button_pressed: + if is_button_pressed: + self.__press_down() + else: + self.__release() diff --git a/src/microbit/__model/display.py b/src/microbit/__model/display.py index c8402525b..20bc58a2a 100644 --- a/src/microbit/__model/display.py +++ b/src/microbit/__model/display.py @@ -338,6 +338,12 @@ def __update_client(self): sendable_json = {"leds": self.__get_array()} utils.send_to_simulator(sendable_json, CONSTANTS.MICROBIT) + def __update_light_level(self,new_light_level): + if new_light_level is not None: + previous_light_level = self.read_light_level() + if new_light_level != previous_light_level: + self.__set_light_level(new_light_level) + @staticmethod def sleep_ms(ms): time.sleep(ms / 1000) diff --git a/src/microbit/__model/microbit_model.py b/src/microbit/__model/microbit_model.py index d78aedeec..9829b3e09 100644 --- a/src/microbit/__model/microbit_model.py +++ b/src/microbit/__model/microbit_model.py @@ -51,41 +51,27 @@ def __update_buttons(self, new_state): # get button pushes for button_name in CONSTANTS.EXPECTED_INPUT_BUTTONS: button = self.__microbit_button_dict[button_name] - - was_button_pressed = button.is_pressed() - is_button_pressed = new_state.get(button_name, was_button_pressed) - - if is_button_pressed != was_button_pressed: - if is_button_pressed: - button._Button__press_down() - else: - button._Button__release() + button._Button__update(new_state.get(button_name)) def __update_motion(self, new_state): # set motion_x, motion_y, motion_z for name, direction in CONSTANTS.EXPECTED_INPUT_ACCEL.items(): - previous_motion_val = self.accelerometer._Accelerometer__get_accel( - direction - ) - new_motion_val = new_state.get(name, previous_motion_val) - if new_motion_val != previous_motion_val: - self.accelerometer._Accelerometer__set_accel(direction, new_motion_val) - + self.accelerometer._Accelerometer__update(direction, new_state.get(name)) + def __update_light(self, new_state): # set light level - previous_light_level = self.display.read_light_level() new_light_level = new_state.get( - CONSTANTS.EXPECTED_INPUT_LIGHT, previous_light_level + CONSTANTS.EXPECTED_INPUT_LIGHT ) - if new_light_level != previous_light_level: - self.display._Display__set_light_level(new_light_level) + self.display._Display__update_light_level(new_light_level) def __update_temp(self, new_state): # set temperature - previous_temp = self.temperature() - new_temp = new_state.get(CONSTANTS.EXPECTED_INPUT_TEMP, previous_temp) - if new_temp != previous_temp: - self._MicrobitModel__set_temperature(new_temp) + new_temp = new_state.get(CONSTANTS.EXPECTED_INPUT_TEMP) + if new_temp is not None: + previous_temp = self.temperature() + if new_temp != previous_temp: + self._MicrobitModel__set_temperature(new_temp) __mb = MicrobitModel() From f760dc9c21215e4c4dfb72f8bb83823e2b4c612a Mon Sep 17 00:00:00 2001 From: andreamah Date: Tue, 11 Feb 2020 21:21:33 -0800 Subject: [PATCH 40/40] reformatting --- src/microbit/__model/accelerometer.py | 5 +---- src/microbit/__model/button.py | 1 - src/microbit/__model/display.py | 2 +- src/microbit/__model/microbit_model.py | 6 ++---- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/microbit/__model/accelerometer.py b/src/microbit/__model/accelerometer.py index 05b0f7e8c..919d3c9db 100644 --- a/src/microbit/__model/accelerometer.py +++ b/src/microbit/__model/accelerometer.py @@ -115,9 +115,6 @@ def __add_current_gesture_to_gesture_lists(self): def __update(self, axis, accel): if accel is not None: - previous_accel = self.__get_accel( - axis - ) + previous_accel = self.__get_accel(axis) if accel != previous_accel: self.__set_accel(axis, accel) - \ No newline at end of file diff --git a/src/microbit/__model/button.py b/src/microbit/__model/button.py index 5282cf6cf..32689f485 100644 --- a/src/microbit/__model/button.py +++ b/src/microbit/__model/button.py @@ -41,7 +41,6 @@ def __press_down(self): def __release(self): self.__pressed = False - def __update(self, is_button_pressed): if is_button_pressed is not None: was_button_pressed = self.is_pressed() diff --git a/src/microbit/__model/display.py b/src/microbit/__model/display.py index 20bc58a2a..ff62e4e59 100644 --- a/src/microbit/__model/display.py +++ b/src/microbit/__model/display.py @@ -338,7 +338,7 @@ def __update_client(self): sendable_json = {"leds": self.__get_array()} utils.send_to_simulator(sendable_json, CONSTANTS.MICROBIT) - def __update_light_level(self,new_light_level): + def __update_light_level(self, new_light_level): if new_light_level is not None: previous_light_level = self.read_light_level() if new_light_level != previous_light_level: diff --git a/src/microbit/__model/microbit_model.py b/src/microbit/__model/microbit_model.py index 9829b3e09..cf00452be 100644 --- a/src/microbit/__model/microbit_model.py +++ b/src/microbit/__model/microbit_model.py @@ -57,12 +57,10 @@ def __update_motion(self, new_state): # set motion_x, motion_y, motion_z for name, direction in CONSTANTS.EXPECTED_INPUT_ACCEL.items(): self.accelerometer._Accelerometer__update(direction, new_state.get(name)) - + def __update_light(self, new_state): # set light level - new_light_level = new_state.get( - CONSTANTS.EXPECTED_INPUT_LIGHT - ) + new_light_level = new_state.get(CONSTANTS.EXPECTED_INPUT_LIGHT) self.display._Display__update_light_level(new_light_level) def __update_temp(self, new_state):