Move style source files to src and build to dist

Keith Simmons and Nate Butler created

Co-authored-by: Nate Butler <nate@zed.dev>

Change summary

crates/editor/src/context_menu.rs     |  272 +
styles/buildFigmaTokens.ts            |  115 
styles/dist/figma/core.json           | 1155 ++++++
styles/package-lock.json              | 5156 ++++++++++++++--------------
styles/package.json                   |   39 
styles/src/buildFigmaTokens.ts        |  110 
styles/src/buildThemes.ts             |    6 
styles/src/figma/core.json            |    0 
styles/src/figma/dark.json            |  192 
styles/src/figma/light.json           |  182 
styles/src/figma/tokens.json          |  324 
styles/src/styleTree/app.ts           |    4 
styles/src/styleTree/chatPanel.ts     |  108 
styles/src/styleTree/components.ts    |   96 
styles/src/styleTree/contactsPanel.ts |    0 
styles/src/styleTree/editor.ts        |    6 
styles/src/styleTree/projectPanel.ts  |   37 
styles/src/styleTree/search.ts        |   79 
styles/src/styleTree/selectorModal.ts |   59 
styles/src/styleTree/workspace.ts     |  151 
styles/src/themes/dark.ts             |   74 
styles/src/themes/light.ts            |  228 +
styles/src/themes/theme.ts            |   14 
styles/src/tokens.ts                  |    0 
styles/src/utils/color.ts             |   52 
styles/src/utils/snakeCase.ts         |   35 
styles/styleTree/chatPanel.ts         |  108 
styles/styleTree/components.ts        |   91 
styles/styleTree/projectPanel.ts      |   37 
styles/styleTree/search.ts            |   79 
styles/styleTree/selectorModal.ts     |   59 
styles/styleTree/workspace.ts         |  151 
styles/themes/light.ts                |  273 -
styles/utils/color.ts                 |   44 
styles/utils/decamelizeTree.ts        |   21 
35 files changed, 5,364 insertions(+), 3,993 deletions(-)

Detailed changes

crates/editor/src/context_menu.rs 🔗

@@ -0,0 +1,272 @@
+pub enum ContextMenu {
+    Completions(CompletionsMenu),
+    CodeActions(CodeActionsMenu),
+}
+
+impl ContextMenu {
+    pub fn select_prev(&mut self, cx: &mut ViewContext<Editor>) -> bool {
+        if self.visible() {
+            match self {
+                ContextMenu::Completions(menu) => menu.select_prev(cx),
+                ContextMenu::CodeActions(menu) => menu.select_prev(cx),
+            }
+            true
+        } else {
+            false
+        }
+    }
+
+    pub fn select_next(&mut self, cx: &mut ViewContext<Editor>) -> bool {
+        if self.visible() {
+            match self {
+                ContextMenu::Completions(menu) => menu.select_next(cx),
+                ContextMenu::CodeActions(menu) => menu.select_next(cx),
+            }
+            true
+        } else {
+            false
+        }
+    }
+
+    pub fn visible(&self) -> bool {
+        match self {
+            ContextMenu::Completions(menu) => menu.visible(),
+            ContextMenu::CodeActions(menu) => menu.visible(),
+        }
+    }
+
+    pub fn render(
+        &self,
+        cursor_position: DisplayPoint,
+        style: EditorStyle,
+        cx: &AppContext,
+    ) -> (DisplayPoint, ElementBox) {
+        match self {
+            ContextMenu::Completions(menu) => (cursor_position, menu.render(style, cx)),
+            ContextMenu::CodeActions(menu) => menu.render(cursor_position, style),
+        }
+    }
+}
+
+struct CompletionsMenu {
+    id: CompletionId,
+    initial_position: Anchor,
+    buffer: ModelHandle<Buffer>,
+    completions: Arc<[Completion]>,
+    match_candidates: Vec<StringMatchCandidate>,
+    matches: Arc<[StringMatch]>,
+    selected_item: usize,
+    list: UniformListState,
+}
+
+impl CompletionsMenu {
+    fn select_prev(&mut self, cx: &mut ViewContext<Editor>) {
+        if self.selected_item > 0 {
+            self.selected_item -= 1;
+            self.list.scroll_to(ScrollTarget::Show(self.selected_item));
+        }
+        cx.notify();
+    }
+
+    fn select_next(&mut self, cx: &mut ViewContext<Editor>) {
+        if self.selected_item + 1 < self.matches.len() {
+            self.selected_item += 1;
+            self.list.scroll_to(ScrollTarget::Show(self.selected_item));
+        }
+        cx.notify();
+    }
+
+    fn visible(&self) -> bool {
+        !self.matches.is_empty()
+    }
+
+    fn render(&self, style: EditorStyle, _: &AppContext) -> ElementBox {
+        enum CompletionTag {}
+
+        let completions = self.completions.clone();
+        let matches = self.matches.clone();
+        let selected_item = self.selected_item;
+        let container_style = style.autocomplete.container;
+        UniformList::new(self.list.clone(), matches.len(), move |range, items, cx| {
+            let start_ix = range.start;
+            for (ix, mat) in matches[range].iter().enumerate() {
+                let completion = &completions[mat.candidate_id];
+                let item_ix = start_ix + ix;
+                items.push(
+                    MouseEventHandler::new::<CompletionTag, _, _>(
+                        mat.candidate_id,
+                        cx,
+                        |state, _| {
+                            let item_style = if item_ix == selected_item {
+                                style.autocomplete.selected_item
+                            } else if state.hovered {
+                                style.autocomplete.hovered_item
+                            } else {
+                                style.autocomplete.item
+                            };
+
+                            Text::new(completion.label.text.clone(), style.text.clone())
+                                .with_soft_wrap(false)
+                                .with_highlights(combine_syntax_and_fuzzy_match_highlights(
+                                    &completion.label.text,
+                                    style.text.color.into(),
+                                    styled_runs_for_code_label(&completion.label, &style.syntax),
+                                    &mat.positions,
+                                ))
+                                .contained()
+                                .with_style(item_style)
+                                .boxed()
+                        },
+                    )
+                    .with_cursor_style(CursorStyle::PointingHand)
+                    .on_mouse_down(move |cx| {
+                        cx.dispatch_action(ConfirmCompletion(Some(item_ix)));
+                    })
+                    .boxed(),
+                );
+            }
+        })
+        .with_width_from_item(
+            self.matches
+                .iter()
+                .enumerate()
+                .max_by_key(|(_, mat)| {
+                    self.completions[mat.candidate_id]
+                        .label
+                        .text
+                        .chars()
+                        .count()
+                })
+                .map(|(ix, _)| ix),
+        )
+        .contained()
+        .with_style(container_style)
+        .boxed()
+    }
+
+    pub async fn filter(&mut self, query: Option<&str>, executor: Arc<executor::Background>) {
+        let mut matches = if let Some(query) = query {
+            fuzzy::match_strings(
+                &self.match_candidates,
+                query,
+                false,
+                100,
+                &Default::default(),
+                executor,
+            )
+            .await
+        } else {
+            self.match_candidates
+                .iter()
+                .enumerate()
+                .map(|(candidate_id, candidate)| StringMatch {
+                    candidate_id,
+                    score: Default::default(),
+                    positions: Default::default(),
+                    string: candidate.string.clone(),
+                })
+                .collect()
+        };
+        matches.sort_unstable_by_key(|mat| {
+            (
+                Reverse(OrderedFloat(mat.score)),
+                self.completions[mat.candidate_id].sort_key(),
+            )
+        });
+
+        for mat in &mut matches {
+            let filter_start = self.completions[mat.candidate_id].label.filter_range.start;
+            for position in &mut mat.positions {
+                *position += filter_start;
+            }
+        }
+
+        self.matches = matches.into();
+    }
+}
+
+#[derive(Clone)]
+struct CodeActionsMenu {
+    actions: Arc<[CodeAction]>,
+    buffer: ModelHandle<Buffer>,
+    selected_item: usize,
+    list: UniformListState,
+    deployed_from_indicator: bool,
+}
+
+impl CodeActionsMenu {
+    fn select_prev(&mut self, cx: &mut ViewContext<Editor>) {
+        if self.selected_item > 0 {
+            self.selected_item -= 1;
+            cx.notify()
+        }
+    }
+
+    fn select_next(&mut self, cx: &mut ViewContext<Editor>) {
+        if self.selected_item + 1 < self.actions.len() {
+            self.selected_item += 1;
+            cx.notify()
+        }
+    }
+
+    fn visible(&self) -> bool {
+        !self.actions.is_empty()
+    }
+
+    fn render(
+        &self,
+        mut cursor_position: DisplayPoint,
+        style: EditorStyle,
+    ) -> (DisplayPoint, ElementBox) {
+        enum ActionTag {}
+
+        let container_style = style.autocomplete.container;
+        let actions = self.actions.clone();
+        let selected_item = self.selected_item;
+        let element =
+            UniformList::new(self.list.clone(), actions.len(), move |range, items, cx| {
+                let start_ix = range.start;
+                for (ix, action) in actions[range].iter().enumerate() {
+                    let item_ix = start_ix + ix;
+                    items.push(
+                        MouseEventHandler::new::<ActionTag, _, _>(item_ix, cx, |state, _| {
+                            let item_style = if item_ix == selected_item {
+                                style.autocomplete.selected_item
+                            } else if state.hovered {
+                                style.autocomplete.hovered_item
+                            } else {
+                                style.autocomplete.item
+                            };
+
+                            Text::new(action.lsp_action.title.clone(), style.text.clone())
+                                .with_soft_wrap(false)
+                                .contained()
+                                .with_style(item_style)
+                                .boxed()
+                        })
+                        .with_cursor_style(CursorStyle::PointingHand)
+                        .on_mouse_down(move |cx| {
+                            cx.dispatch_action(ConfirmCodeAction(Some(item_ix)));
+                        })
+                        .boxed(),
+                    );
+                }
+            })
+            .with_width_from_item(
+                self.actions
+                    .iter()
+                    .enumerate()
+                    .max_by_key(|(_, action)| action.lsp_action.title.chars().count())
+                    .map(|(ix, _)| ix),
+            )
+            .contained()
+            .with_style(container_style)
+            .boxed();
+
+        if self.deployed_from_indicator {
+            *cursor_position.column_mut() = 0;
+        }
+
+        (cursor_position, element)
+    }
+}

styles/buildFigmaTokens.ts 🔗

@@ -1,115 +0,0 @@
-import * as fs from "fs";
-import * as path from "path";
-import dark from "./themes/dark";
-import light from "./themes/light";
-import Theme from "./themes/theme";
-import { colors, fontFamilies, fontSizes, fontWeights } from "./tokens";
-
-let themes = [
-  dark, 
-  light
-];
-
-// Organize theme tokens
-function themeTokens(theme: Theme) {
-  return {
-    meta: {
-      themeName: theme.name,
-    },
-    text: theme.textColor,
-    icon: theme.iconColor,
-    background: theme.backgroundColor,
-    border: theme.borderColor,
-    editor: theme.editor,
-    syntax: {
-      primary: {
-        value: theme.syntax.primary.color.value,
-        type: "color",
-      },
-      comment: {
-        value: theme.syntax.comment.color.value,
-        type: "color",
-      },
-      keyword: {
-        value: theme.syntax.keyword.color.value,
-        type: "color",
-      },
-      function: {
-        value: theme.syntax.function.color.value,
-        type: "color",
-      },
-      type: {
-        value: theme.syntax.type.color.value,
-        type: "color",
-      },
-      variant: {
-        value: theme.syntax.variant.color.value,
-        type: "color",
-      },
-      property: {
-        value: theme.syntax.property.color.value,
-        type: "color",
-      },
-      enum: {
-        value: theme.syntax.enum.color.value,
-        type: "color",
-      },
-      operator: {
-        value: theme.syntax.operator.color.value,
-        type: "color",
-      },
-      string: {
-        value: theme.syntax.string.color.value,
-        type: "color",
-      },
-      number: {
-        value: theme.syntax.number.color.value,
-        type: "color",
-      },
-      boolean: {
-        value: theme.syntax.boolean.color.value,
-        type: "color",
-      },
-    },
-    player: theme.player,
-    shadowAlpha: theme.shadowAlpha,
-  };
-}
-
-// Organize core tokens
-const coreTokens = {
-  color: {
-    ...colors,
-  },
-  text: {
-    family: fontFamilies,
-    weight: fontWeights,
-  },
-  size: fontSizes,
-};
-
-const combinedTokens = {
-  core: coreTokens,
-  dark: themeTokens(dark),
-  light: themeTokens(light)
-}
-
-// Create core.json
-const corePath = path.resolve(`${__dirname}/figma/core.json`);
-const coreJSON = JSON.stringify(coreTokens, null, 2);
-fs.writeFileSync(corePath, coreJSON);
-console.log(`- Core: core.json created`);
-
-// Create {theme}.json
-const themePath = path.resolve(`${__dirname}/figma`);
-themes.forEach((theme) => {
-  const tokenJSON = JSON.stringify(themeTokens(theme), null, 2);
-  fs.writeFileSync(`${themePath}/${theme.name}.json`, tokenJSON);
-  console.log(`- Theme: ${theme.name}.json created`);
-});
-
-// Create combined tokens.json
-const combinedPath = path.resolve(`${__dirname}/figma/tokens.json`);
-const combinedJSON = JSON.stringify(combinedTokens, null, 2);
-fs.writeFileSync(combinedPath, combinedJSON);
-console.log(`- Combined: tokens.json created`);

styles/dist/figma/core.json 🔗

@@ -0,0 +1,1155 @@
+{
+  "color": {
+    "neutral": {
+      "0": {
+        "value": "#ffffff",
+        "step": 0,
+        "type": "color"
+      },
+      "25": {
+        "value": "#f8f8f8",
+        "step": 25,
+        "type": "color"
+      },
+      "50": {
+        "value": "#f1f1f1",
+        "step": 50,
+        "type": "color"
+      },
+      "75": {
+        "value": "#eaeaea",
+        "step": 75,
+        "type": "color"
+      },
+      "100": {
+        "value": "#e3e3e3",
+        "step": 100,
+        "type": "color"
+      },
+      "125": {
+        "value": "#dcdcdc",
+        "step": 125,
+        "type": "color"
+      },
+      "150": {
+        "value": "#d5d5d5",
+        "step": 150,
+        "type": "color"
+      },
+      "175": {
+        "value": "#cdcdcd",
+        "step": 175,
+        "type": "color"
+      },
+      "200": {
+        "value": "#c6c6c6",
+        "step": 200,
+        "type": "color"
+      },
+      "225": {
+        "value": "#bfbfbf",
+        "step": 225,
+        "type": "color"
+      },
+      "250": {
+        "value": "#b8b8b8",
+        "step": 250,
+        "type": "color"
+      },
+      "275": {
+        "value": "#b1b1b1",
+        "step": 275,
+        "type": "color"
+      },
+      "300": {
+        "value": "#aaaaaa",
+        "step": 300,
+        "type": "color"
+      },
+      "325": {
+        "value": "#a3a3a3",
+        "step": 325,
+        "type": "color"
+      },
+      "350": {
+        "value": "#9c9c9c",
+        "step": 350,
+        "type": "color"
+      },
+      "375": {
+        "value": "#959595",
+        "step": 375,
+        "type": "color"
+      },
+      "400": {
+        "value": "#8e8e8e",
+        "step": 400,
+        "type": "color"
+      },
+      "425": {
+        "value": "#878787",
+        "step": 425,
+        "type": "color"
+      },
+      "450": {
+        "value": "#808080",
+        "step": 450,
+        "type": "color"
+      },
+      "475": {
+        "value": "#787878",
+        "step": 475,
+        "type": "color"
+      },
+      "500": {
+        "value": "#717171",
+        "step": 500,
+        "type": "color"
+      },
+      "525": {
+        "value": "#6a6a6a",
+        "step": 525,
+        "type": "color"
+      },
+      "550": {
+        "value": "#636363",
+        "step": 550,
+        "type": "color"
+      },
+      "575": {
+        "value": "#5c5c5c",
+        "step": 575,
+        "type": "color"
+      },
+      "600": {
+        "value": "#555555",
+        "step": 600,
+        "type": "color"
+      },
+      "625": {
+        "value": "#4e4e4e",
+        "step": 625,
+        "type": "color"
+      },
+      "650": {
+        "value": "#474747",
+        "step": 650,
+        "type": "color"
+      },
+      "675": {
+        "value": "#404040",
+        "step": 675,
+        "type": "color"
+      },
+      "700": {
+        "value": "#393939",
+        "step": 700,
+        "type": "color"
+      },
+      "725": {
+        "value": "#323232",
+        "step": 725,
+        "type": "color"
+      },
+      "750": {
+        "value": "#2b2b2b",
+        "step": 750,
+        "type": "color"
+      },
+      "775": {
+        "value": "#232323",
+        "step": 775,
+        "type": "color"
+      },
+      "800": {
+        "value": "#1c1c1c",
+        "step": 800,
+        "type": "color"
+      },
+      "825": {
+        "value": "#151515",
+        "step": 825,
+        "type": "color"
+      },
+      "850": {
+        "value": "#0e0e0e",
+        "step": 850,
+        "type": "color"
+      },
+      "875": {
+        "value": "#070707",
+        "step": 875,
+        "type": "color"
+      },
+      "900": {
+        "value": "#000000",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "rose": {
+      "0": {
+        "value": "#feecef",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#fcc5cf",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#fa9fae",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#f8788e",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#f5526e",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#f0284a",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#cd1434",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#97142a",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#64101e",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#330a11",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "red": {
+      "0": {
+        "value": "#feecec",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#fcc6c6",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#f9a0a0",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#f57b7b",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#f15656",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#eb2d2d",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#c91818",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#951515",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#631111",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#330a0a",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "orange": {
+      "0": {
+        "value": "#fef3ec",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#fcd6bd",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#fab98e",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#f99d5f",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#f9812e",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#ee670a",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#bb550e",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#8b4210",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#5d2f0e",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#331b0a",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "amber": {
+      "0": {
+        "value": "#fef7ec",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#fce2ba",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#f9ce89",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#f7bb57",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#f6a724",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#de900c",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#b0740f",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#845910",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#5a3e0e",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#33240a",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "yellow": {
+      "0": {
+        "value": "#fef9ec",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#fce9b7",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#f9da82",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#f8cc4d",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#f7bf17",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#d3a20b",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#a8820e",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#7e630f",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#58460e",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#33290a",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "lime": {
+      "0": {
+        "value": "#f7feec",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#dffab5",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#c7f57f",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#aeef4b",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#96e818",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#79ba16",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#639714",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#4e7412",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#38530f",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#23330a",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "green": {
+      "0": {
+        "value": "#ecfef2",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#b7f9ce",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#84f2ab",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#54e989",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#27dd69",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#20b456",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#1b9447",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#157338",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#105328",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#0a3319",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "emerald": {
+      "0": {
+        "value": "#ecfef8",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#b0fae1",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#74f6cb",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#39f0b3",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#12d796",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#10a977",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#118a62",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#106c4e",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#0d4f3a",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#0a3326",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "teal": {
+      "0": {
+        "value": "#ecfefc",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#b1faf2",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#76f5e7",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#3eeeda",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#16d6c1",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#14a898",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#138a7d",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#116c62",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#0e4f48",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#0a332f",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "cyan": {
+      "0": {
+        "value": "#ecfcfe",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#b2f3fb",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#78eaf9",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#3de2f8",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#07d5f1",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#09aac0",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#0c8a9a",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#0e6a75",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#0d4c53",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#0a2f33",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "sky": {
+      "0": {
+        "value": "#ecf8fe",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#b9e5fb",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#86d3f8",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#53c1f5",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#20b0f2",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#1096d3",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#1179a8",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#115c7f",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#0e4158",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#0a2633",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "blue": {
+      "0": {
+        "value": "#ecf3fe",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#c5dafc",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#9ec1fa",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#76a8f8",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#4f8ff7",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#2472f2",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#135acd",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#134697",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#103063",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#0a1a33",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "indigo": {
+      "0": {
+        "value": "#ececfe",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#cdcdfc",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#aeaff9",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#9091f6",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#7274f3",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#484bed",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#1b1edc",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#1819a1",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#121269",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#0a0a33",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "violet": {
+      "0": {
+        "value": "#f1ecfe",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#daccfc",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#c3acfb",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#ac8cf9",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#966cf7",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#7741f2",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#5316e0",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#3f15a3",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#2b116a",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#160a33",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "purple": {
+      "0": {
+        "value": "#f5ecfe",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#e4cbfc",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#d2a9fb",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#c188f9",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#b066f8",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#993bf3",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#7b14dd",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#5c14a1",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#3e1169",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#1f0a33",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "fuschia": {
+      "0": {
+        "value": "#fdecfe",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#f8c5fb",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#f19ff6",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#e87af0",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#de57e8",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#d430e0",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#b31fbc",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#87198e",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#5c1260",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#310a33",
+        "step": 900,
+        "type": "color"
+      }
+    },
+    "pink": {
+      "0": {
+        "value": "#feecf5",
+        "step": 0,
+        "type": "color"
+      },
+      "100": {
+        "value": "#fbc6e1",
+        "step": 100,
+        "type": "color"
+      },
+      "200": {
+        "value": "#f8a1cc",
+        "step": 200,
+        "type": "color"
+      },
+      "300": {
+        "value": "#f47db8",
+        "step": 300,
+        "type": "color"
+      },
+      "400": {
+        "value": "#ef59a3",
+        "step": 400,
+        "type": "color"
+      },
+      "500": {
+        "value": "#e8318c",
+        "step": 500,
+        "type": "color"
+      },
+      "600": {
+        "value": "#c71a71",
+        "step": 600,
+        "type": "color"
+      },
+      "700": {
+        "value": "#941756",
+        "step": 700,
+        "type": "color"
+      },
+      "800": {
+        "value": "#63113b",
+        "step": 800,
+        "type": "color"
+      },
+      "900": {
+        "value": "#330a1f",
+        "step": 900,
+        "type": "color"
+      }
+    }
+  },
+  "text": {
+    "family": {
+      "sans": {
+        "value": "Zed Sans",
+        "type": "fontFamily"
+      },
+      "mono": {
+        "value": "Zed Mono",
+        "type": "fontFamily"
+      }
+    },
+    "weight": {
+      "thin": {
+        "value": "thin",
+        "type": "fontWeight"
+      },
+      "extra_light": {
+        "value": "extra_light",
+        "type": "fontWeight"
+      },
+      "light": {
+        "value": "light",
+        "type": "fontWeight"
+      },
+      "normal": {
+        "value": "normal",
+        "type": "fontWeight"
+      },
+      "medium": {
+        "value": "medium",
+        "type": "fontWeight"
+      },
+      "semibold": {
+        "value": "semibold",
+        "type": "fontWeight"
+      },
+      "bold": {
+        "value": "bold",
+        "type": "fontWeight"
+      },
+      "extra_bold": {
+        "value": "extra_bold",
+        "type": "fontWeight"
+      },
+      "black": {
+        "value": "black",
+        "type": "fontWeight"
+      }
+    }
+  },
+  "size": {
+    "3xs": {
+      "value": 8,
+      "type": "fontSize"
+    },
+    "2xs": {
+      "value": 10,
+      "type": "fontSize"
+    },
+    "xs": {
+      "value": 12,
+      "type": "fontSize"
+    },
+    "sm": {
+      "value": 14,
+      "type": "fontSize"
+    },
+    "md": {
+      "value": 16,
+      "type": "fontSize"
+    },
+    "lg": {
+      "value": 18,
+      "type": "fontSize"
+    },
+    "xl": {
+      "value": 20,
+      "type": "fontSize"
+    }
+  }
+}

styles/package-lock.json 🔗

@@ -1,2589 +1,2589 @@
 {
-  "name": "styles",
-  "version": "1.0.0",
-  "lockfileVersion": 2,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "styles",
-      "version": "1.0.0",
-      "license": "ISC",
-      "dependencies": {
-        "@types/chroma-js": "^2.1.3",
-        "@types/node": "^17.0.23",
-        "case-anything": "^2.1.10",
-        "chroma-js": "^2.4.2"
-      },
-      "devDependencies": {
-        "nodemon": "^2.0.15",
-        "ts-node": "^10.7.0"
-      }
-    },
-    "node_modules/@cspotcode/source-map-consumer": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
-      "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 12"
-      }
-    },
-    "node_modules/@cspotcode/source-map-support": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
-      "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
-      "dev": true,
-      "dependencies": {
-        "@cspotcode/source-map-consumer": "0.8.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@sindresorhus/is": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
-      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@szmarczak/http-timer": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
-      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
-      "dev": true,
-      "dependencies": {
-        "defer-to-connect": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@tsconfig/node10": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
-      "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
-      "dev": true
-    },
-    "node_modules/@tsconfig/node12": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
-      "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
-      "dev": true
-    },
-    "node_modules/@tsconfig/node14": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
-      "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
-      "dev": true
-    },
-    "node_modules/@tsconfig/node16": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
-      "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
-      "dev": true
-    },
-    "node_modules/@types/chroma-js": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.1.3.tgz",
-      "integrity": "sha512-1xGPhoSGY1CPmXLCBcjVZSQinFjL26vlR8ZqprsBWiFyED4JacJJ9zHhh5aaUXqbY9B37mKQ73nlydVAXmr1+g=="
-    },
-    "node_modules/@types/node": {
-      "version": "17.0.23",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
-      "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
-    },
-    "node_modules/abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "dev": true
-    },
-    "node_modules/acorn": {
-      "version": "8.7.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
-      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
-      "dev": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/acorn-walk": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
-      "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/ansi-align": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
-      "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^4.1.0"
-      }
-    },
-    "node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/anymatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
-      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
-      "dev": true,
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/arg": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
-      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
-      "dev": true
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "node_modules/binary-extensions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/boxen": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
-      "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-align": "^3.0.0",
-        "camelcase": "^6.2.0",
-        "chalk": "^4.1.0",
-        "cli-boxes": "^2.2.1",
-        "string-width": "^4.2.2",
-        "type-fest": "^0.20.2",
-        "widest-line": "^3.1.0",
-        "wrap-ansi": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "dev": true,
-      "dependencies": {
-        "fill-range": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cacheable-request": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
-      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
-      "dev": true,
-      "dependencies": {
-        "clone-response": "^1.0.2",
-        "get-stream": "^5.1.0",
-        "http-cache-semantics": "^4.0.0",
-        "keyv": "^3.0.0",
-        "lowercase-keys": "^2.0.0",
-        "normalize-url": "^4.1.0",
-        "responselike": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cacheable-request/node_modules/get-stream": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-      "dev": true,
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/cacheable-request/node_modules/lowercase-keys": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
-      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/camelcase": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/case-anything": {
-      "version": "2.1.10",
-      "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz",
-      "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==",
-      "engines": {
-        "node": ">=12.13"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mesqueeb"
-      }
-    },
-    "node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/chalk/node_modules/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,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/chalk/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/chokidar": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
-      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://paulmillr.com/funding/"
-        }
-      ],
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/chroma-js": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz",
-      "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
-    },
-    "node_modules/ci-info": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-      "dev": true
-    },
-    "node_modules/cli-boxes": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
-      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/clone-response": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
-      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
-      "dev": true,
-      "dependencies": {
-        "mimic-response": "^1.0.0"
-      }
-    },
-    "node_modules/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,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/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
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "node_modules/configstore": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
-      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
-      "dev": true,
-      "dependencies": {
-        "dot-prop": "^5.2.0",
-        "graceful-fs": "^4.1.2",
-        "make-dir": "^3.0.0",
-        "unique-string": "^2.0.0",
-        "write-file-atomic": "^3.0.0",
-        "xdg-basedir": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/create-require": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
-      "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
-      "dev": true
-    },
-    "node_modules/crypto-random-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
-      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/debug": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "^2.1.1"
-      }
-    },
-    "node_modules/decompress-response": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
-      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
-      "dev": true,
-      "dependencies": {
-        "mimic-response": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/deep-extend": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/defer-to-connect": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
-      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
-      "dev": true
-    },
-    "node_modules/diff": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.3.1"
-      }
-    },
-    "node_modules/dot-prop": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
-      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
-      "dev": true,
-      "dependencies": {
-        "is-obj": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/duplexer3": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
-      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
-      "dev": true
-    },
-    "node_modules/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
-    },
-    "node_modules/end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
-      "dependencies": {
-        "once": "^1.4.0"
-      }
-    },
-    "node_modules/escape-goat": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
-      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/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,
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/get-stream": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-      "dev": true,
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "dev": true,
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/global-dirs": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
-      "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
-      "dev": true,
-      "dependencies": {
-        "ini": "2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/got": {
-      "version": "9.6.0",
-      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
-      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
-      "dev": true,
-      "dependencies": {
-        "@sindresorhus/is": "^0.14.0",
-        "@szmarczak/http-timer": "^1.1.2",
-        "cacheable-request": "^6.0.0",
-        "decompress-response": "^3.3.0",
-        "duplexer3": "^0.1.4",
-        "get-stream": "^4.1.0",
-        "lowercase-keys": "^1.0.1",
-        "mimic-response": "^1.0.1",
-        "p-cancelable": "^1.0.0",
-        "to-readable-stream": "^1.0.0",
-        "url-parse-lax": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "version": "4.2.9",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
-      "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
-      "dev": true
-    },
-    "node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/has-yarn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
-      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/http-cache-semantics": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
-      "dev": true
-    },
-    "node_modules/ignore-by-default": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
-      "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
-      "dev": true
-    },
-    "node_modules/import-lazy": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
-      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.19"
-      }
-    },
-    "node_modules/ini": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
-      "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/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,
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-ci": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
-      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
-      "dev": true,
-      "dependencies": {
-        "ci-info": "^2.0.0"
-      },
-      "bin": {
-        "is-ci": "bin.js"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/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,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-installed-globally": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
-      "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
-      "dev": true,
-      "dependencies": {
-        "global-dirs": "^3.0.0",
-        "is-path-inside": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-npm": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
-      "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/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,
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/is-obj": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
-      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-path-inside": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
-      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
-    },
-    "node_modules/is-yarn-global": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
-      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
-      "dev": true
-    },
-    "node_modules/json-buffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
-      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
-      "dev": true
-    },
-    "node_modules/keyv": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
-      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
-      "dev": true,
-      "dependencies": {
-        "json-buffer": "3.0.0"
-      }
-    },
-    "node_modules/latest-version": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
-      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
-      "dev": true,
-      "dependencies": {
-        "package-json": "^6.3.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/lowercase-keys": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/make-dir": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-      "dev": true,
-      "dependencies": {
-        "semver": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/make-dir/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/make-error": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
-      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
-      "dev": true
-    },
-    "node_modules/mimic-response": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
-      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/minimist": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
-      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
-      "dev": true
-    },
-    "node_modules/ms": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "dev": true
-    },
-    "node_modules/nodemon": {
-      "version": "2.0.15",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz",
-      "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==",
-      "dev": true,
-      "hasInstallScript": true,
-      "dependencies": {
-        "chokidar": "^3.5.2",
-        "debug": "^3.2.7",
-        "ignore-by-default": "^1.0.1",
-        "minimatch": "^3.0.4",
-        "pstree.remy": "^1.1.8",
-        "semver": "^5.7.1",
-        "supports-color": "^5.5.0",
-        "touch": "^3.1.0",
-        "undefsafe": "^2.0.5",
-        "update-notifier": "^5.1.0"
-      },
-      "bin": {
-        "nodemon": "bin/nodemon.js"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/nodemon"
-      }
-    },
-    "node_modules/nopt": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
-      "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
-      "dev": true,
-      "dependencies": {
-        "abbrev": "1"
-      },
-      "bin": {
-        "nopt": "bin/nopt.js"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/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,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/normalize-url": {
-      "version": "4.5.1",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
-      "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/p-cancelable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
-      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/package-json": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
-      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
-      "dev": true,
-      "dependencies": {
-        "got": "^9.6.0",
-        "registry-auth-token": "^4.0.0",
-        "registry-url": "^5.0.0",
-        "semver": "^6.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/package-json/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/prepend-http": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/pstree.remy": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
-      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
-      "dev": true
-    },
-    "node_modules/pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
-      "dependencies": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "node_modules/pupa": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
-      "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
-      "dev": true,
-      "dependencies": {
-        "escape-goat": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/rc": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
-      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
-      "dev": true,
-      "dependencies": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
-      },
-      "bin": {
-        "rc": "cli.js"
-      }
-    },
-    "node_modules/rc/node_modules/ini": {
-      "version": "1.3.8",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
-      "dev": true
-    },
-    "node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dev": true,
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/registry-auth-token": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
-      "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
-      "dev": true,
-      "dependencies": {
-        "rc": "^1.2.8"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/registry-url": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
-      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
-      "dev": true,
-      "dependencies": {
-        "rc": "^1.2.8"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/responselike": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
-      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
-      "dev": true,
-      "dependencies": {
-        "lowercase-keys": "^1.0.0"
-      }
-    },
-    "node_modules/semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/semver-diff": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
-      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
-      "dev": true,
-      "dependencies": {
-        "semver": "^6.3.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/semver-diff/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-      "dev": true
-    },
-    "node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-json-comments": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/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,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/to-readable-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
-      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/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,
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/touch": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
-      "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
-      "dev": true,
-      "dependencies": {
-        "nopt": "~1.0.10"
-      },
-      "bin": {
-        "nodetouch": "bin/nodetouch.js"
-      }
-    },
-    "node_modules/ts-node": {
-      "version": "10.7.0",
-      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz",
-      "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==",
-      "dev": true,
-      "dependencies": {
-        "@cspotcode/source-map-support": "0.7.0",
-        "@tsconfig/node10": "^1.0.7",
-        "@tsconfig/node12": "^1.0.7",
-        "@tsconfig/node14": "^1.0.0",
-        "@tsconfig/node16": "^1.0.2",
-        "acorn": "^8.4.1",
-        "acorn-walk": "^8.1.1",
-        "arg": "^4.1.0",
-        "create-require": "^1.1.0",
-        "diff": "^4.0.1",
-        "make-error": "^1.1.1",
-        "v8-compile-cache-lib": "^3.0.0",
-        "yn": "3.1.1"
-      },
-      "bin": {
-        "ts-node": "dist/bin.js",
-        "ts-node-cwd": "dist/bin-cwd.js",
-        "ts-node-esm": "dist/bin-esm.js",
-        "ts-node-script": "dist/bin-script.js",
-        "ts-node-transpile-only": "dist/bin-transpile.js",
-        "ts-script": "dist/bin-script-deprecated.js"
-      },
-      "peerDependencies": {
-        "@swc/core": ">=1.2.50",
-        "@swc/wasm": ">=1.2.50",
-        "@types/node": "*",
-        "typescript": ">=2.7"
-      },
-      "peerDependenciesMeta": {
-        "@swc/core": {
-          "optional": true
-        },
-        "@swc/wasm": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/type-fest": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/typedarray-to-buffer": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
-      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
-      "dev": true,
-      "dependencies": {
-        "is-typedarray": "^1.0.0"
-      }
-    },
-    "node_modules/typescript": {
-      "version": "4.6.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz",
-      "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
-      "dev": true,
-      "peer": true,
-      "bin": {
-        "tsc": "bin/tsc",
-        "tsserver": "bin/tsserver"
-      },
-      "engines": {
-        "node": ">=4.2.0"
-      }
-    },
-    "node_modules/undefsafe": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
-      "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
-      "dev": true
-    },
-    "node_modules/unique-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
-      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
-      "dev": true,
-      "dependencies": {
-        "crypto-random-string": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/update-notifier": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
-      "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
-      "dev": true,
-      "dependencies": {
-        "boxen": "^5.0.0",
-        "chalk": "^4.1.0",
-        "configstore": "^5.0.1",
-        "has-yarn": "^2.1.0",
-        "import-lazy": "^2.1.0",
-        "is-ci": "^2.0.0",
-        "is-installed-globally": "^0.4.0",
-        "is-npm": "^5.0.0",
-        "is-yarn-global": "^0.3.0",
-        "latest-version": "^5.1.0",
-        "pupa": "^2.1.1",
-        "semver": "^7.3.4",
-        "semver-diff": "^3.1.1",
-        "xdg-basedir": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/yeoman/update-notifier?sponsor=1"
-      }
-    },
-    "node_modules/update-notifier/node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/url-parse-lax": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
-      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
-      "dev": true,
-      "dependencies": {
-        "prepend-http": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/v8-compile-cache-lib": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz",
-      "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==",
-      "dev": true
-    },
-    "node_modules/widest-line": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
-      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "node_modules/write-file-atomic": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
-      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
-      "dev": true,
-      "dependencies": {
-        "imurmurhash": "^0.1.4",
-        "is-typedarray": "^1.0.0",
-        "signal-exit": "^3.0.2",
-        "typedarray-to-buffer": "^3.1.5"
-      }
-    },
-    "node_modules/xdg-basedir": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
-      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
-    "node_modules/yn": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
-      "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    }
-  },
-  "dependencies": {
-    "@cspotcode/source-map-consumer": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
-      "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
-      "dev": true
-    },
-    "@cspotcode/source-map-support": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
-      "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
-      "dev": true,
-      "requires": {
-        "@cspotcode/source-map-consumer": "0.8.0"
-      }
-    },
-    "@sindresorhus/is": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
-      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
-      "dev": true
-    },
-    "@szmarczak/http-timer": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
-      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
-      "dev": true,
-      "requires": {
-        "defer-to-connect": "^1.0.1"
-      }
-    },
-    "@tsconfig/node10": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
-      "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
-      "dev": true
-    },
-    "@tsconfig/node12": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
-      "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
-      "dev": true
-    },
-    "@tsconfig/node14": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
-      "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
-      "dev": true
-    },
-    "@tsconfig/node16": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
-      "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
-      "dev": true
-    },
-    "@types/chroma-js": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.1.3.tgz",
-      "integrity": "sha512-1xGPhoSGY1CPmXLCBcjVZSQinFjL26vlR8ZqprsBWiFyED4JacJJ9zHhh5aaUXqbY9B37mKQ73nlydVAXmr1+g=="
-    },
-    "@types/node": {
-      "version": "17.0.23",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
-      "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
-    },
-    "abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "dev": true
-    },
-    "acorn": {
-      "version": "8.7.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
-      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
-      "dev": true
-    },
-    "acorn-walk": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
-      "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
-      "dev": true
-    },
-    "ansi-align": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
-      "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
-      "dev": true,
-      "requires": {
-        "string-width": "^4.1.0"
-      }
-    },
-    "ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "requires": {
-        "color-convert": "^2.0.1"
-      }
-    },
-    "anymatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
-      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
-      "dev": true,
-      "requires": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      }
-    },
-    "arg": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
-      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
-      "dev": true
-    },
-    "balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "binary-extensions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
-      "dev": true
-    },
-    "boxen": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
-      "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
-      "dev": true,
-      "requires": {
-        "ansi-align": "^3.0.0",
-        "camelcase": "^6.2.0",
-        "chalk": "^4.1.0",
-        "cli-boxes": "^2.2.1",
-        "string-width": "^4.2.2",
-        "type-fest": "^0.20.2",
-        "widest-line": "^3.1.0",
-        "wrap-ansi": "^7.0.0"
-      }
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "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"
-      }
-    },
-    "cacheable-request": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
-      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
-      "dev": true,
-      "requires": {
-        "clone-response": "^1.0.2",
-        "get-stream": "^5.1.0",
-        "http-cache-semantics": "^4.0.0",
-        "keyv": "^3.0.0",
-        "lowercase-keys": "^2.0.0",
-        "normalize-url": "^4.1.0",
-        "responselike": "^1.0.2"
-      },
-      "dependencies": {
-        "get-stream": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
+    "name": "styles",
+    "version": "1.0.0",
+    "lockfileVersion": 2,
+    "requires": true,
+    "packages": {
+        "": {
+            "name": "styles",
+            "version": "1.0.0",
+            "license": "ISC",
+            "dependencies": {
+                "@types/chroma-js": "^2.1.3",
+                "@types/node": "^17.0.23",
+                "case-anything": "^2.1.10",
+                "chroma-js": "^2.4.2"
+            },
+            "devDependencies": {
+                "nodemon": "^2.0.15",
+                "ts-node": "^10.7.0"
+            }
+        },
+        "node_modules/@cspotcode/source-map-consumer": {
+            "version": "0.8.0",
+            "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
+            "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 12"
+            }
+        },
+        "node_modules/@cspotcode/source-map-support": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
+            "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
+            "dev": true,
+            "dependencies": {
+                "@cspotcode/source-map-consumer": "0.8.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@sindresorhus/is": {
+            "version": "0.14.0",
+            "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+            "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/@szmarczak/http-timer": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+            "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+            "dev": true,
+            "dependencies": {
+                "defer-to-connect": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/@tsconfig/node10": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
+            "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
+            "dev": true
+        },
+        "node_modules/@tsconfig/node12": {
+            "version": "1.0.9",
+            "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
+            "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
+            "dev": true
+        },
+        "node_modules/@tsconfig/node14": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
+            "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
+            "dev": true
+        },
+        "node_modules/@tsconfig/node16": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
+            "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
+            "dev": true
+        },
+        "node_modules/@types/chroma-js": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.1.3.tgz",
+            "integrity": "sha512-1xGPhoSGY1CPmXLCBcjVZSQinFjL26vlR8ZqprsBWiFyED4JacJJ9zHhh5aaUXqbY9B37mKQ73nlydVAXmr1+g=="
+        },
+        "node_modules/@types/node": {
+            "version": "17.0.23",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
+            "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
+        },
+        "node_modules/abbrev": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+            "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+            "dev": true
+        },
+        "node_modules/acorn": {
+            "version": "8.7.0",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+            "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
+            "dev": true,
+            "bin": {
+                "acorn": "bin/acorn"
+            },
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/acorn-walk": {
+            "version": "8.2.0",
+            "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+            "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/ansi-align": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+            "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+            "dev": true,
+            "dependencies": {
+                "string-width": "^4.1.0"
+            }
+        },
+        "node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/anymatch": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+            "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+            "dev": true,
+            "dependencies": {
+                "normalize-path": "^3.0.0",
+                "picomatch": "^2.0.4"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/arg": {
+            "version": "4.1.3",
+            "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+            "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+            "dev": true
+        },
+        "node_modules/balanced-match": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+            "dev": true
+        },
+        "node_modules/binary-extensions": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+            "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/boxen": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
+            "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
+            "dev": true,
+            "dependencies": {
+                "ansi-align": "^3.0.0",
+                "camelcase": "^6.2.0",
+                "chalk": "^4.1.0",
+                "cli-boxes": "^2.2.1",
+                "string-width": "^4.2.2",
+                "type-fest": "^0.20.2",
+                "widest-line": "^3.1.0",
+                "wrap-ansi": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/brace-expansion": {
+            "version": "1.1.11",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+            "dev": true,
+            "dependencies": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+            }
+        },
+        "node_modules/braces": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+            "dev": true,
+            "dependencies": {
+                "fill-range": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/cacheable-request": {
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+            "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+            "dev": true,
+            "dependencies": {
+                "clone-response": "^1.0.2",
+                "get-stream": "^5.1.0",
+                "http-cache-semantics": "^4.0.0",
+                "keyv": "^3.0.0",
+                "lowercase-keys": "^2.0.0",
+                "normalize-url": "^4.1.0",
+                "responselike": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/cacheable-request/node_modules/get-stream": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+            "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+            "dev": true,
+            "dependencies": {
+                "pump": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/cacheable-request/node_modules/lowercase-keys": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+            "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/camelcase": {
+            "version": "6.3.0",
+            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+            "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/case-anything": {
+            "version": "2.1.10",
+            "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz",
+            "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==",
+            "engines": {
+                "node": ">=12.13"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/mesqueeb"
+            }
+        },
+        "node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/chalk/node_modules/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,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/chalk/node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/chokidar": {
+            "version": "3.5.3",
+            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+            "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://paulmillr.com/funding/"
+                }
+            ],
+            "dependencies": {
+                "anymatch": "~3.1.2",
+                "braces": "~3.0.2",
+                "glob-parent": "~5.1.2",
+                "is-binary-path": "~2.1.0",
+                "is-glob": "~4.0.1",
+                "normalize-path": "~3.0.0",
+                "readdirp": "~3.6.0"
+            },
+            "engines": {
+                "node": ">= 8.10.0"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.2"
+            }
+        },
+        "node_modules/chroma-js": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz",
+            "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
+        },
+        "node_modules/ci-info": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+            "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+            "dev": true
+        },
+        "node_modules/cli-boxes": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
+            "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/clone-response": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+            "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+            "dev": true,
+            "dependencies": {
+                "mimic-response": "^1.0.0"
+            }
+        },
+        "node_modules/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,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/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
+        },
+        "node_modules/concat-map": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+            "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+            "dev": true
+        },
+        "node_modules/configstore": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+            "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+            "dev": true,
+            "dependencies": {
+                "dot-prop": "^5.2.0",
+                "graceful-fs": "^4.1.2",
+                "make-dir": "^3.0.0",
+                "unique-string": "^2.0.0",
+                "write-file-atomic": "^3.0.0",
+                "xdg-basedir": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/create-require": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+            "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+            "dev": true
+        },
+        "node_modules/crypto-random-string": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+            "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/debug": {
+            "version": "3.2.7",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+            "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "^2.1.1"
+            }
+        },
+        "node_modules/decompress-response": {
+            "version": "3.3.0",
+            "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+            "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+            "dev": true,
+            "dependencies": {
+                "mimic-response": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/deep-extend": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+            "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/defer-to-connect": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+            "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
+            "dev": true
+        },
+        "node_modules/diff": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+            "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.3.1"
+            }
+        },
+        "node_modules/dot-prop": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+            "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+            "dev": true,
+            "dependencies": {
+                "is-obj": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/duplexer3": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+            "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+            "dev": true
+        },
+        "node_modules/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
+        },
+        "node_modules/end-of-stream": {
+            "version": "1.4.4",
+            "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+            "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+            "dev": true,
+            "dependencies": {
+                "once": "^1.4.0"
+            }
+        },
+        "node_modules/escape-goat": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
+            "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/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,
+            "dependencies": {
+                "to-regex-range": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/fsevents": {
+            "version": "2.3.2",
+            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+            "dev": true,
+            "hasInstallScript": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+            }
+        },
+        "node_modules/get-stream": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+            "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+            "dev": true,
+            "dependencies": {
+                "pump": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/glob-parent": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+            "dev": true,
+            "dependencies": {
+                "is-glob": "^4.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/global-dirs": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
+            "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+            "dev": true,
+            "dependencies": {
+                "ini": "2.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/got": {
+            "version": "9.6.0",
+            "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+            "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+            "dev": true,
+            "dependencies": {
+                "@sindresorhus/is": "^0.14.0",
+                "@szmarczak/http-timer": "^1.1.2",
+                "cacheable-request": "^6.0.0",
+                "decompress-response": "^3.3.0",
+                "duplexer3": "^0.1.4",
+                "get-stream": "^4.1.0",
+                "lowercase-keys": "^1.0.1",
+                "mimic-response": "^1.0.1",
+                "p-cancelable": "^1.0.0",
+                "to-readable-stream": "^1.0.0",
+                "url-parse-lax": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8.6"
+            }
+        },
+        "node_modules/graceful-fs": {
+            "version": "4.2.9",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
+            "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+            "dev": true
+        },
+        "node_modules/has-flag": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+            "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/has-yarn": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
+            "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/http-cache-semantics": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+            "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+            "dev": true
+        },
+        "node_modules/ignore-by-default": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+            "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
+            "dev": true
+        },
+        "node_modules/import-lazy": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+            "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/imurmurhash": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+            "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.8.19"
+            }
+        },
+        "node_modules/ini": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+            "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/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,
+            "dependencies": {
+                "binary-extensions": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-ci": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+            "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+            "dev": true,
+            "dependencies": {
+                "ci-info": "^2.0.0"
+            },
+            "bin": {
+                "is-ci": "bin.js"
+            }
+        },
+        "node_modules/is-extglob": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+            "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/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,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-glob": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+            "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+            "dev": true,
+            "dependencies": {
+                "is-extglob": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-installed-globally": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+            "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+            "dev": true,
+            "dependencies": {
+                "global-dirs": "^3.0.0",
+                "is-path-inside": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/is-npm": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
+            "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/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,
+            "engines": {
+                "node": ">=0.12.0"
+            }
+        },
+        "node_modules/is-obj": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+            "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-path-inside": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+            "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-typedarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+            "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+            "dev": true
+        },
+        "node_modules/is-yarn-global": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
+            "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
+            "dev": true
+        },
+        "node_modules/json-buffer": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+            "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
+            "dev": true
+        },
+        "node_modules/keyv": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+            "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+            "dev": true,
+            "dependencies": {
+                "json-buffer": "3.0.0"
+            }
+        },
+        "node_modules/latest-version": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
+            "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+            "dev": true,
+            "dependencies": {
+                "package-json": "^6.3.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/lowercase-keys": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+            "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/make-dir": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+            "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+            "dev": true,
+            "dependencies": {
+                "semver": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/make-dir/node_modules/semver": {
+            "version": "6.3.0",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+            "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+            "dev": true,
+            "bin": {
+                "semver": "bin/semver.js"
+            }
+        },
+        "node_modules/make-error": {
+            "version": "1.3.6",
+            "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+            "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+            "dev": true
+        },
+        "node_modules/mimic-response": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+            "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/minimatch": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+            "dev": true,
+            "dependencies": {
+                "brace-expansion": "^1.1.7"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/minimist": {
+            "version": "1.2.6",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+            "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+            "dev": true
+        },
+        "node_modules/ms": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+            "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+            "dev": true
+        },
+        "node_modules/nodemon": {
+            "version": "2.0.15",
+            "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz",
+            "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==",
+            "dev": true,
+            "hasInstallScript": true,
+            "dependencies": {
+                "chokidar": "^3.5.2",
+                "debug": "^3.2.7",
+                "ignore-by-default": "^1.0.1",
+                "minimatch": "^3.0.4",
+                "pstree.remy": "^1.1.8",
+                "semver": "^5.7.1",
+                "supports-color": "^5.5.0",
+                "touch": "^3.1.0",
+                "undefsafe": "^2.0.5",
+                "update-notifier": "^5.1.0"
+            },
+            "bin": {
+                "nodemon": "bin/nodemon.js"
+            },
+            "engines": {
+                "node": ">=8.10.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/nodemon"
+            }
+        },
+        "node_modules/nopt": {
+            "version": "1.0.10",
+            "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+            "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+            "dev": true,
+            "dependencies": {
+                "abbrev": "1"
+            },
+            "bin": {
+                "nopt": "bin/nopt.js"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/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,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/normalize-url": {
+            "version": "4.5.1",
+            "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
+            "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/once": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+            "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+            "dev": true,
+            "dependencies": {
+                "wrappy": "1"
+            }
+        },
+        "node_modules/p-cancelable": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+            "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/package-json": {
+            "version": "6.5.0",
+            "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
+            "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
+            "dev": true,
+            "dependencies": {
+                "got": "^9.6.0",
+                "registry-auth-token": "^4.0.0",
+                "registry-url": "^5.0.0",
+                "semver": "^6.2.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/package-json/node_modules/semver": {
+            "version": "6.3.0",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+            "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+            "dev": true,
+            "bin": {
+                "semver": "bin/semver.js"
+            }
+        },
+        "node_modules/picomatch": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+            "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/jonschlinkert"
+            }
+        },
+        "node_modules/prepend-http": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+            "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/pstree.remy": {
+            "version": "1.1.8",
+            "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
+            "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
+            "dev": true
+        },
+        "node_modules/pump": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+            "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+            "dev": true,
+            "dependencies": {
+                "end-of-stream": "^1.1.0",
+                "once": "^1.3.1"
+            }
+        },
+        "node_modules/pupa": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
+            "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
+            "dev": true,
+            "dependencies": {
+                "escape-goat": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/rc": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+            "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+            "dev": true,
+            "dependencies": {
+                "deep-extend": "^0.6.0",
+                "ini": "~1.3.0",
+                "minimist": "^1.2.0",
+                "strip-json-comments": "~2.0.1"
+            },
+            "bin": {
+                "rc": "cli.js"
+            }
+        },
+        "node_modules/rc/node_modules/ini": {
+            "version": "1.3.8",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+            "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+            "dev": true
+        },
+        "node_modules/readdirp": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+            "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+            "dev": true,
+            "dependencies": {
+                "picomatch": "^2.2.1"
+            },
+            "engines": {
+                "node": ">=8.10.0"
+            }
+        },
+        "node_modules/registry-auth-token": {
+            "version": "4.2.1",
+            "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
+            "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
+            "dev": true,
+            "dependencies": {
+                "rc": "^1.2.8"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/registry-url": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
+            "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
+            "dev": true,
+            "dependencies": {
+                "rc": "^1.2.8"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/responselike": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+            "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+            "dev": true,
+            "dependencies": {
+                "lowercase-keys": "^1.0.0"
+            }
+        },
+        "node_modules/semver": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+            "dev": true,
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
+        "node_modules/semver-diff": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
+            "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+            "dev": true,
+            "dependencies": {
+                "semver": "^6.3.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/semver-diff/node_modules/semver": {
+            "version": "6.3.0",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+            "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+            "dev": true,
+            "bin": {
+                "semver": "bin/semver.js"
+            }
+        },
+        "node_modules/signal-exit": {
+            "version": "3.0.7",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+            "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+            "dev": true
+        },
+        "node_modules/string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dev": true,
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dev": true,
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-json-comments": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+            "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/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,
+            "dependencies": {
+                "has-flag": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/to-readable-stream": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+            "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/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,
+            "dependencies": {
+                "is-number": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=8.0"
+            }
+        },
+        "node_modules/touch": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
+            "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
+            "dev": true,
+            "dependencies": {
+                "nopt": "~1.0.10"
+            },
+            "bin": {
+                "nodetouch": "bin/nodetouch.js"
+            }
+        },
+        "node_modules/ts-node": {
+            "version": "10.7.0",
+            "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz",
+            "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==",
+            "dev": true,
+            "dependencies": {
+                "@cspotcode/source-map-support": "0.7.0",
+                "@tsconfig/node10": "^1.0.7",
+                "@tsconfig/node12": "^1.0.7",
+                "@tsconfig/node14": "^1.0.0",
+                "@tsconfig/node16": "^1.0.2",
+                "acorn": "^8.4.1",
+                "acorn-walk": "^8.1.1",
+                "arg": "^4.1.0",
+                "create-require": "^1.1.0",
+                "diff": "^4.0.1",
+                "make-error": "^1.1.1",
+                "v8-compile-cache-lib": "^3.0.0",
+                "yn": "3.1.1"
+            },
+            "bin": {
+                "ts-node": "dist/bin.js",
+                "ts-node-cwd": "dist/bin-cwd.js",
+                "ts-node-esm": "dist/bin-esm.js",
+                "ts-node-script": "dist/bin-script.js",
+                "ts-node-transpile-only": "dist/bin-transpile.js",
+                "ts-script": "dist/bin-script-deprecated.js"
+            },
+            "peerDependencies": {
+                "@swc/core": ">=1.2.50",
+                "@swc/wasm": ">=1.2.50",
+                "@types/node": "*",
+                "typescript": ">=2.7"
+            },
+            "peerDependenciesMeta": {
+                "@swc/core": {
+                    "optional": true
+                },
+                "@swc/wasm": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/type-fest": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+            "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
         },
-        "lowercase-keys": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
-          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
-          "dev": true
+        "node_modules/typedarray-to-buffer": {
+            "version": "3.1.5",
+            "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+            "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+            "dev": true,
+            "dependencies": {
+                "is-typedarray": "^1.0.0"
+            }
+        },
+        "node_modules/typescript": {
+            "version": "4.6.3",
+            "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz",
+            "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
+            "dev": true,
+            "peer": true,
+            "bin": {
+                "tsc": "bin/tsc",
+                "tsserver": "bin/tsserver"
+            },
+            "engines": {
+                "node": ">=4.2.0"
+            }
+        },
+        "node_modules/undefsafe": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
+            "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
+            "dev": true
+        },
+        "node_modules/unique-string": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+            "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+            "dev": true,
+            "dependencies": {
+                "crypto-random-string": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/update-notifier": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
+            "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
+            "dev": true,
+            "dependencies": {
+                "boxen": "^5.0.0",
+                "chalk": "^4.1.0",
+                "configstore": "^5.0.1",
+                "has-yarn": "^2.1.0",
+                "import-lazy": "^2.1.0",
+                "is-ci": "^2.0.0",
+                "is-installed-globally": "^0.4.0",
+                "is-npm": "^5.0.0",
+                "is-yarn-global": "^0.3.0",
+                "latest-version": "^5.1.0",
+                "pupa": "^2.1.1",
+                "semver": "^7.3.4",
+                "semver-diff": "^3.1.1",
+                "xdg-basedir": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/yeoman/update-notifier?sponsor=1"
+            }
+        },
+        "node_modules/update-notifier/node_modules/semver": {
+            "version": "7.3.5",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+            "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+            "dev": true,
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/url-parse-lax": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+            "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+            "dev": true,
+            "dependencies": {
+                "prepend-http": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/v8-compile-cache-lib": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz",
+            "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==",
+            "dev": true
+        },
+        "node_modules/widest-line": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+            "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+            "dev": true,
+            "dependencies": {
+                "string-width": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/wrap-ansi": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+            "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
+        "node_modules/wrappy": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+            "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+            "dev": true
+        },
+        "node_modules/write-file-atomic": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+            "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+            "dev": true,
+            "dependencies": {
+                "imurmurhash": "^0.1.4",
+                "is-typedarray": "^1.0.0",
+                "signal-exit": "^3.0.2",
+                "typedarray-to-buffer": "^3.1.5"
+            }
+        },
+        "node_modules/xdg-basedir": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+            "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
+        "node_modules/yn": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+            "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
         }
-      }
-    },
-    "camelcase": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
-      "dev": true
     },
-    "case-anything": {
-      "version": "2.1.10",
-      "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz",
-      "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ=="
-    },
-    "chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "dependencies": {
+    "dependencies": {
+        "@cspotcode/source-map-consumer": {
+            "version": "0.8.0",
+            "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
+            "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
+            "dev": true
+        },
+        "@cspotcode/source-map-support": {
+            "version": "0.7.0",
+            "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
+            "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
+            "dev": true,
+            "requires": {
+                "@cspotcode/source-map-consumer": "0.8.0"
+            }
+        },
+        "@sindresorhus/is": {
+            "version": "0.14.0",
+            "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+            "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
+            "dev": true
+        },
+        "@szmarczak/http-timer": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+            "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+            "dev": true,
+            "requires": {
+                "defer-to-connect": "^1.0.1"
+            }
+        },
+        "@tsconfig/node10": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
+            "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
+            "dev": true
+        },
+        "@tsconfig/node12": {
+            "version": "1.0.9",
+            "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
+            "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
+            "dev": true
+        },
+        "@tsconfig/node14": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
+            "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
+            "dev": true
+        },
+        "@tsconfig/node16": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
+            "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
+            "dev": true
+        },
+        "@types/chroma-js": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.1.3.tgz",
+            "integrity": "sha512-1xGPhoSGY1CPmXLCBcjVZSQinFjL26vlR8ZqprsBWiFyED4JacJJ9zHhh5aaUXqbY9B37mKQ73nlydVAXmr1+g=="
+        },
+        "@types/node": {
+            "version": "17.0.23",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
+            "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
+        },
+        "abbrev": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+            "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+            "dev": true
+        },
+        "acorn": {
+            "version": "8.7.0",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+            "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
+            "dev": true
+        },
+        "acorn-walk": {
+            "version": "8.2.0",
+            "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+            "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+            "dev": true
+        },
+        "ansi-align": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+            "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+            "dev": true,
+            "requires": {
+                "string-width": "^4.1.0"
+            }
+        },
+        "ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "dev": true
+        },
+        "ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "requires": {
+                "color-convert": "^2.0.1"
+            }
+        },
+        "anymatch": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+            "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+            "dev": true,
+            "requires": {
+                "normalize-path": "^3.0.0",
+                "picomatch": "^2.0.4"
+            }
+        },
+        "arg": {
+            "version": "4.1.3",
+            "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+            "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+            "dev": true
+        },
+        "balanced-match": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+            "dev": true
+        },
+        "binary-extensions": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+            "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+            "dev": true
+        },
+        "boxen": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
+            "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
+            "dev": true,
+            "requires": {
+                "ansi-align": "^3.0.0",
+                "camelcase": "^6.2.0",
+                "chalk": "^4.1.0",
+                "cli-boxes": "^2.2.1",
+                "string-width": "^4.2.2",
+                "type-fest": "^0.20.2",
+                "widest-line": "^3.1.0",
+                "wrap-ansi": "^7.0.0"
+            }
+        },
+        "brace-expansion": {
+            "version": "1.1.11",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+            "dev": true,
+            "requires": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+            }
+        },
+        "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"
+            }
+        },
+        "cacheable-request": {
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+            "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+            "dev": true,
+            "requires": {
+                "clone-response": "^1.0.2",
+                "get-stream": "^5.1.0",
+                "http-cache-semantics": "^4.0.0",
+                "keyv": "^3.0.0",
+                "lowercase-keys": "^2.0.0",
+                "normalize-url": "^4.1.0",
+                "responselike": "^1.0.2"
+            },
+            "dependencies": {
+                "get-stream": {
+                    "version": "5.2.0",
+                    "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+                    "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+                    "dev": true,
+                    "requires": {
+                        "pump": "^3.0.0"
+                    }
+                },
+                "lowercase-keys": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+                    "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+                    "dev": true
+                }
+            }
+        },
+        "camelcase": {
+            "version": "6.3.0",
+            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+            "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+            "dev": true
+        },
+        "case-anything": {
+            "version": "2.1.10",
+            "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz",
+            "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ=="
+        },
+        "chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "requires": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "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
+                },
+                "supports-color": {
+                    "version": "7.2.0",
+                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+                    "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+                    "dev": true,
+                    "requires": {
+                        "has-flag": "^4.0.0"
+                    }
+                }
+            }
+        },
+        "chokidar": {
+            "version": "3.5.3",
+            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+            "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+            "dev": true,
+            "requires": {
+                "anymatch": "~3.1.2",
+                "braces": "~3.0.2",
+                "fsevents": "~2.3.2",
+                "glob-parent": "~5.1.2",
+                "is-binary-path": "~2.1.0",
+                "is-glob": "~4.0.1",
+                "normalize-path": "~3.0.0",
+                "readdirp": "~3.6.0"
+            }
+        },
+        "chroma-js": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz",
+            "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
+        },
+        "ci-info": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+            "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+            "dev": true
+        },
+        "cli-boxes": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
+            "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
+            "dev": true
+        },
+        "clone-response": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+            "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+            "dev": true,
+            "requires": {
+                "mimic-response": "^1.0.0"
+            }
+        },
+        "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"
+            }
+        },
+        "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
+        },
+        "concat-map": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+            "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+            "dev": true
+        },
+        "configstore": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+            "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+            "dev": true,
+            "requires": {
+                "dot-prop": "^5.2.0",
+                "graceful-fs": "^4.1.2",
+                "make-dir": "^3.0.0",
+                "unique-string": "^2.0.0",
+                "write-file-atomic": "^3.0.0",
+                "xdg-basedir": "^4.0.0"
+            }
+        },
+        "create-require": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+            "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+            "dev": true
+        },
+        "crypto-random-string": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+            "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+            "dev": true
+        },
+        "debug": {
+            "version": "3.2.7",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+            "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+            "dev": true,
+            "requires": {
+                "ms": "^2.1.1"
+            }
+        },
+        "decompress-response": {
+            "version": "3.3.0",
+            "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+            "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+            "dev": true,
+            "requires": {
+                "mimic-response": "^1.0.0"
+            }
+        },
+        "deep-extend": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+            "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+            "dev": true
+        },
+        "defer-to-connect": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+            "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
+            "dev": true
+        },
+        "diff": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+            "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+            "dev": true
+        },
+        "dot-prop": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+            "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+            "dev": true,
+            "requires": {
+                "is-obj": "^2.0.0"
+            }
+        },
+        "duplexer3": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+            "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+            "dev": true
+        },
+        "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
+        },
+        "end-of-stream": {
+            "version": "1.4.4",
+            "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+            "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+            "dev": true,
+            "requires": {
+                "once": "^1.4.0"
+            }
+        },
+        "escape-goat": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
+            "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
+            "dev": true
+        },
+        "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.3.2",
+            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+            "dev": true,
+            "optional": true
+        },
+        "get-stream": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+            "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+            "dev": true,
+            "requires": {
+                "pump": "^3.0.0"
+            }
+        },
+        "glob-parent": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+            "dev": true,
+            "requires": {
+                "is-glob": "^4.0.1"
+            }
+        },
+        "global-dirs": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
+            "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+            "dev": true,
+            "requires": {
+                "ini": "2.0.0"
+            }
+        },
+        "got": {
+            "version": "9.6.0",
+            "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+            "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+            "dev": true,
+            "requires": {
+                "@sindresorhus/is": "^0.14.0",
+                "@szmarczak/http-timer": "^1.1.2",
+                "cacheable-request": "^6.0.0",
+                "decompress-response": "^3.3.0",
+                "duplexer3": "^0.1.4",
+                "get-stream": "^4.1.0",
+                "lowercase-keys": "^1.0.1",
+                "mimic-response": "^1.0.1",
+                "p-cancelable": "^1.0.0",
+                "to-readable-stream": "^1.0.0",
+                "url-parse-lax": "^3.0.0"
+            }
+        },
+        "graceful-fs": {
+            "version": "4.2.9",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
+            "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+            "dev": true
+        },
         "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
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+            "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+            "dev": true
+        },
+        "has-yarn": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
+            "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
+            "dev": true
+        },
+        "http-cache-semantics": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+            "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+            "dev": true
+        },
+        "ignore-by-default": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+            "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
+            "dev": true
+        },
+        "import-lazy": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+            "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+            "dev": true
+        },
+        "imurmurhash": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+            "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+            "dev": true
         },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "chokidar": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
-      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
-      "dev": true,
-      "requires": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "fsevents": "~2.3.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      }
-    },
-    "chroma-js": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz",
-      "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A=="
-    },
-    "ci-info": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-      "dev": true
-    },
-    "cli-boxes": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
-      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
-      "dev": true
-    },
-    "clone-response": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
-      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
-      "dev": true,
-      "requires": {
-        "mimic-response": "^1.0.0"
-      }
-    },
-    "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"
-      }
-    },
-    "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
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "configstore": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
-      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
-      "dev": true,
-      "requires": {
-        "dot-prop": "^5.2.0",
-        "graceful-fs": "^4.1.2",
-        "make-dir": "^3.0.0",
-        "unique-string": "^2.0.0",
-        "write-file-atomic": "^3.0.0",
-        "xdg-basedir": "^4.0.0"
-      }
-    },
-    "create-require": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
-      "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
-      "dev": true
-    },
-    "crypto-random-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
-      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
-      "dev": true
-    },
-    "debug": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-      "dev": true,
-      "requires": {
-        "ms": "^2.1.1"
-      }
-    },
-    "decompress-response": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
-      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
-      "dev": true,
-      "requires": {
-        "mimic-response": "^1.0.0"
-      }
-    },
-    "deep-extend": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
-      "dev": true
-    },
-    "defer-to-connect": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
-      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
-      "dev": true
-    },
-    "diff": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
-      "dev": true
-    },
-    "dot-prop": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
-      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
-      "dev": true,
-      "requires": {
-        "is-obj": "^2.0.0"
-      }
-    },
-    "duplexer3": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
-      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
-      "dev": true
-    },
-    "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
-    },
-    "end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dev": true,
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "escape-goat": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
-      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
-      "dev": true
-    },
-    "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.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "dev": true,
-      "optional": true
-    },
-    "get-stream": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-      "dev": true,
-      "requires": {
-        "pump": "^3.0.0"
-      }
-    },
-    "glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "dev": true,
-      "requires": {
-        "is-glob": "^4.0.1"
-      }
-    },
-    "global-dirs": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
-      "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
-      "dev": true,
-      "requires": {
-        "ini": "2.0.0"
-      }
-    },
-    "got": {
-      "version": "9.6.0",
-      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
-      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
-      "dev": true,
-      "requires": {
-        "@sindresorhus/is": "^0.14.0",
-        "@szmarczak/http-timer": "^1.1.2",
-        "cacheable-request": "^6.0.0",
-        "decompress-response": "^3.3.0",
-        "duplexer3": "^0.1.4",
-        "get-stream": "^4.1.0",
-        "lowercase-keys": "^1.0.1",
-        "mimic-response": "^1.0.1",
-        "p-cancelable": "^1.0.0",
-        "to-readable-stream": "^1.0.0",
-        "url-parse-lax": "^3.0.0"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.2.9",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
-      "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
-      "dev": true
-    },
-    "has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
-    },
-    "has-yarn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
-      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
-      "dev": true
-    },
-    "http-cache-semantics": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
-      "dev": true
-    },
-    "ignore-by-default": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
-      "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
-      "dev": true
-    },
-    "import-lazy": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
-      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
-      "dev": true
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
-    },
-    "ini": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
-      "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
-      "dev": true
-    },
-    "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-ci": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
-      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
-      "dev": true,
-      "requires": {
-        "ci-info": "^2.0.0"
-      }
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "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
-    },
-    "is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-installed-globally": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
-      "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
-      "dev": true,
-      "requires": {
-        "global-dirs": "^3.0.0",
-        "is-path-inside": "^3.0.2"
-      }
-    },
-    "is-npm": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
-      "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
-      "dev": true
-    },
-    "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
-    },
-    "is-obj": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
-      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
-      "dev": true
-    },
-    "is-path-inside": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
-      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
-      "dev": true
-    },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
-    },
-    "is-yarn-global": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
-      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
-      "dev": true
-    },
-    "json-buffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
-      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
-      "dev": true
-    },
-    "keyv": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
-      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
-      "dev": true,
-      "requires": {
-        "json-buffer": "3.0.0"
-      }
-    },
-    "latest-version": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
-      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
-      "dev": true,
-      "requires": {
-        "package-json": "^6.3.0"
-      }
-    },
-    "lowercase-keys": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
-      "dev": true
-    },
-    "lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
-    "make-dir": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-      "dev": true,
-      "requires": {
-        "semver": "^6.0.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "make-error": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
-      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
-      "dev": true
-    },
-    "mimic-response": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
-      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
-      "dev": true
-    },
-    "minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
-      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
-      "dev": true
-    },
-    "ms": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "dev": true
-    },
-    "nodemon": {
-      "version": "2.0.15",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz",
-      "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==",
-      "dev": true,
-      "requires": {
-        "chokidar": "^3.5.2",
-        "debug": "^3.2.7",
-        "ignore-by-default": "^1.0.1",
-        "minimatch": "^3.0.4",
-        "pstree.remy": "^1.1.8",
-        "semver": "^5.7.1",
-        "supports-color": "^5.5.0",
-        "touch": "^3.1.0",
-        "undefsafe": "^2.0.5",
-        "update-notifier": "^5.1.0"
-      }
-    },
-    "nopt": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
-      "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
-      "dev": true,
-      "requires": {
-        "abbrev": "1"
-      }
-    },
-    "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
-    },
-    "normalize-url": {
-      "version": "4.5.1",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
-      "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
-      "dev": true
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "p-cancelable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
-      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
-      "dev": true
-    },
-    "package-json": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
-      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
-      "dev": true,
-      "requires": {
-        "got": "^9.6.0",
-        "registry-auth-token": "^4.0.0",
-        "registry-url": "^5.0.0",
-        "semver": "^6.2.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true
-    },
-    "prepend-http": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
-      "dev": true
-    },
-    "pstree.remy": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
-      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
-      "dev": true
-    },
-    "pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "pupa": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
-      "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
-      "dev": true,
-      "requires": {
-        "escape-goat": "^2.0.0"
-      }
-    },
-    "rc": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
-      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
-      "dev": true,
-      "requires": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
-      },
-      "dependencies": {
         "ini": {
-          "version": "1.3.8",
-          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-          "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
-          "dev": true
-        }
-      }
-    },
-    "readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dev": true,
-      "requires": {
-        "picomatch": "^2.2.1"
-      }
-    },
-    "registry-auth-token": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
-      "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
-      "dev": true,
-      "requires": {
-        "rc": "^1.2.8"
-      }
-    },
-    "registry-url": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
-      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
-      "dev": true,
-      "requires": {
-        "rc": "^1.2.8"
-      }
-    },
-    "responselike": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
-      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
-      "dev": true,
-      "requires": {
-        "lowercase-keys": "^1.0.0"
-      }
-    },
-    "semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true
-    },
-    "semver-diff": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
-      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
-      "dev": true,
-      "requires": {
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-      "dev": true
-    },
-    "string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "requires": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      }
-    },
-    "strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^5.0.1"
-      }
-    },
-    "strip-json-comments": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
-      "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"
-      }
-    },
-    "to-readable-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
-      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
-      "dev": true
-    },
-    "to-regex-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"
-      }
-    },
-    "touch": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
-      "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
-      "dev": true,
-      "requires": {
-        "nopt": "~1.0.10"
-      }
-    },
-    "ts-node": {
-      "version": "10.7.0",
-      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz",
-      "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==",
-      "dev": true,
-      "requires": {
-        "@cspotcode/source-map-support": "0.7.0",
-        "@tsconfig/node10": "^1.0.7",
-        "@tsconfig/node12": "^1.0.7",
-        "@tsconfig/node14": "^1.0.0",
-        "@tsconfig/node16": "^1.0.2",
-        "acorn": "^8.4.1",
-        "acorn-walk": "^8.1.1",
-        "arg": "^4.1.0",
-        "create-require": "^1.1.0",
-        "diff": "^4.0.1",
-        "make-error": "^1.1.1",
-        "v8-compile-cache-lib": "^3.0.0",
-        "yn": "3.1.1"
-      }
-    },
-    "type-fest": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-      "dev": true
-    },
-    "typedarray-to-buffer": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
-      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
-      "dev": true,
-      "requires": {
-        "is-typedarray": "^1.0.0"
-      }
-    },
-    "typescript": {
-      "version": "4.6.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz",
-      "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
-      "dev": true,
-      "peer": true
-    },
-    "undefsafe": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
-      "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
-      "dev": true
-    },
-    "unique-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
-      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
-      "dev": true,
-      "requires": {
-        "crypto-random-string": "^2.0.0"
-      }
-    },
-    "update-notifier": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
-      "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
-      "dev": true,
-      "requires": {
-        "boxen": "^5.0.0",
-        "chalk": "^4.1.0",
-        "configstore": "^5.0.1",
-        "has-yarn": "^2.1.0",
-        "import-lazy": "^2.1.0",
-        "is-ci": "^2.0.0",
-        "is-installed-globally": "^0.4.0",
-        "is-npm": "^5.0.0",
-        "is-yarn-global": "^0.3.0",
-        "latest-version": "^5.1.0",
-        "pupa": "^2.1.1",
-        "semver": "^7.3.4",
-        "semver-diff": "^3.1.1",
-        "xdg-basedir": "^4.0.0"
-      },
-      "dependencies": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+            "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+            "dev": true
+        },
+        "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-ci": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+            "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+            "dev": true,
+            "requires": {
+                "ci-info": "^2.0.0"
+            }
+        },
+        "is-extglob": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+            "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+            "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
+        },
+        "is-glob": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+            "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+            "dev": true,
+            "requires": {
+                "is-extglob": "^2.1.1"
+            }
+        },
+        "is-installed-globally": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+            "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+            "dev": true,
+            "requires": {
+                "global-dirs": "^3.0.0",
+                "is-path-inside": "^3.0.2"
+            }
+        },
+        "is-npm": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
+            "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
+            "dev": true
+        },
+        "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
+        },
+        "is-obj": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+            "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+            "dev": true
+        },
+        "is-path-inside": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+            "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+            "dev": true
+        },
+        "is-typedarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+            "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+            "dev": true
+        },
+        "is-yarn-global": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
+            "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
+            "dev": true
+        },
+        "json-buffer": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+            "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
+            "dev": true
+        },
+        "keyv": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+            "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+            "dev": true,
+            "requires": {
+                "json-buffer": "3.0.0"
+            }
+        },
+        "latest-version": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
+            "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+            "dev": true,
+            "requires": {
+                "package-json": "^6.3.0"
+            }
+        },
+        "lowercase-keys": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+            "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+            "dev": true
+        },
+        "lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "requires": {
+                "yallist": "^4.0.0"
+            }
+        },
+        "make-dir": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+            "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+            "dev": true,
+            "requires": {
+                "semver": "^6.0.0"
+            },
+            "dependencies": {
+                "semver": {
+                    "version": "6.3.0",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+                    "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+                    "dev": true
+                }
+            }
+        },
+        "make-error": {
+            "version": "1.3.6",
+            "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+            "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+            "dev": true
+        },
+        "mimic-response": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+            "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+            "dev": true
+        },
+        "minimatch": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+            "dev": true,
+            "requires": {
+                "brace-expansion": "^1.1.7"
+            }
+        },
+        "minimist": {
+            "version": "1.2.6",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+            "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+            "dev": true
+        },
+        "ms": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+            "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+            "dev": true
+        },
+        "nodemon": {
+            "version": "2.0.15",
+            "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz",
+            "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==",
+            "dev": true,
+            "requires": {
+                "chokidar": "^3.5.2",
+                "debug": "^3.2.7",
+                "ignore-by-default": "^1.0.1",
+                "minimatch": "^3.0.4",
+                "pstree.remy": "^1.1.8",
+                "semver": "^5.7.1",
+                "supports-color": "^5.5.0",
+                "touch": "^3.1.0",
+                "undefsafe": "^2.0.5",
+                "update-notifier": "^5.1.0"
+            }
+        },
+        "nopt": {
+            "version": "1.0.10",
+            "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+            "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+            "dev": true,
+            "requires": {
+                "abbrev": "1"
+            }
+        },
+        "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
+        },
+        "normalize-url": {
+            "version": "4.5.1",
+            "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
+            "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
+            "dev": true
+        },
+        "once": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+            "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+            "dev": true,
+            "requires": {
+                "wrappy": "1"
+            }
+        },
+        "p-cancelable": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+            "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
+            "dev": true
+        },
+        "package-json": {
+            "version": "6.5.0",
+            "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
+            "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
+            "dev": true,
+            "requires": {
+                "got": "^9.6.0",
+                "registry-auth-token": "^4.0.0",
+                "registry-url": "^5.0.0",
+                "semver": "^6.2.0"
+            },
+            "dependencies": {
+                "semver": {
+                    "version": "6.3.0",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+                    "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+                    "dev": true
+                }
+            }
+        },
+        "picomatch": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+            "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+            "dev": true
+        },
+        "prepend-http": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+            "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+            "dev": true
+        },
+        "pstree.remy": {
+            "version": "1.1.8",
+            "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
+            "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
+            "dev": true
+        },
+        "pump": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+            "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+            "dev": true,
+            "requires": {
+                "end-of-stream": "^1.1.0",
+                "once": "^1.3.1"
+            }
+        },
+        "pupa": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
+            "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
+            "dev": true,
+            "requires": {
+                "escape-goat": "^2.0.0"
+            }
+        },
+        "rc": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+            "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+            "dev": true,
+            "requires": {
+                "deep-extend": "^0.6.0",
+                "ini": "~1.3.0",
+                "minimist": "^1.2.0",
+                "strip-json-comments": "~2.0.1"
+            },
+            "dependencies": {
+                "ini": {
+                    "version": "1.3.8",
+                    "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+                    "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+                    "dev": true
+                }
+            }
+        },
+        "readdirp": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+            "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+            "dev": true,
+            "requires": {
+                "picomatch": "^2.2.1"
+            }
+        },
+        "registry-auth-token": {
+            "version": "4.2.1",
+            "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
+            "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
+            "dev": true,
+            "requires": {
+                "rc": "^1.2.8"
+            }
+        },
+        "registry-url": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
+            "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
+            "dev": true,
+            "requires": {
+                "rc": "^1.2.8"
+            }
+        },
+        "responselike": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+            "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+            "dev": true,
+            "requires": {
+                "lowercase-keys": "^1.0.0"
+            }
+        },
         "semver": {
-          "version": "7.3.5",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+            "dev": true
+        },
+        "semver-diff": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
+            "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+            "dev": true,
+            "requires": {
+                "semver": "^6.3.0"
+            },
+            "dependencies": {
+                "semver": {
+                    "version": "6.3.0",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+                    "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+                    "dev": true
+                }
+            }
+        },
+        "signal-exit": {
+            "version": "3.0.7",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+            "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+            "dev": true
+        },
+        "string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dev": true,
+            "requires": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            }
+        },
+        "strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dev": true,
+            "requires": {
+                "ansi-regex": "^5.0.1"
+            }
+        },
+        "strip-json-comments": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+            "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+            "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"
+            }
+        },
+        "to-readable-stream": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+            "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
+            "dev": true
+        },
+        "to-regex-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"
+            }
+        },
+        "touch": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
+            "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
+            "dev": true,
+            "requires": {
+                "nopt": "~1.0.10"
+            }
+        },
+        "ts-node": {
+            "version": "10.7.0",
+            "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz",
+            "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==",
+            "dev": true,
+            "requires": {
+                "@cspotcode/source-map-support": "0.7.0",
+                "@tsconfig/node10": "^1.0.7",
+                "@tsconfig/node12": "^1.0.7",
+                "@tsconfig/node14": "^1.0.0",
+                "@tsconfig/node16": "^1.0.2",
+                "acorn": "^8.4.1",
+                "acorn-walk": "^8.1.1",
+                "arg": "^4.1.0",
+                "create-require": "^1.1.0",
+                "diff": "^4.0.1",
+                "make-error": "^1.1.1",
+                "v8-compile-cache-lib": "^3.0.0",
+                "yn": "3.1.1"
+            }
+        },
+        "type-fest": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+            "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+            "dev": true
+        },
+        "typedarray-to-buffer": {
+            "version": "3.1.5",
+            "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+            "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+            "dev": true,
+            "requires": {
+                "is-typedarray": "^1.0.0"
+            }
+        },
+        "typescript": {
+            "version": "4.6.3",
+            "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz",
+            "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
+            "dev": true,
+            "peer": true
+        },
+        "undefsafe": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
+            "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
+            "dev": true
+        },
+        "unique-string": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+            "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+            "dev": true,
+            "requires": {
+                "crypto-random-string": "^2.0.0"
+            }
+        },
+        "update-notifier": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
+            "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
+            "dev": true,
+            "requires": {
+                "boxen": "^5.0.0",
+                "chalk": "^4.1.0",
+                "configstore": "^5.0.1",
+                "has-yarn": "^2.1.0",
+                "import-lazy": "^2.1.0",
+                "is-ci": "^2.0.0",
+                "is-installed-globally": "^0.4.0",
+                "is-npm": "^5.0.0",
+                "is-yarn-global": "^0.3.0",
+                "latest-version": "^5.1.0",
+                "pupa": "^2.1.1",
+                "semver": "^7.3.4",
+                "semver-diff": "^3.1.1",
+                "xdg-basedir": "^4.0.0"
+            },
+            "dependencies": {
+                "semver": {
+                    "version": "7.3.5",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+                    "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+                    "dev": true,
+                    "requires": {
+                        "lru-cache": "^6.0.0"
+                    }
+                }
+            }
+        },
+        "url-parse-lax": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+            "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+            "dev": true,
+            "requires": {
+                "prepend-http": "^2.0.0"
+            }
+        },
+        "v8-compile-cache-lib": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz",
+            "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==",
+            "dev": true
+        },
+        "widest-line": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+            "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+            "dev": true,
+            "requires": {
+                "string-width": "^4.0.0"
+            }
+        },
+        "wrap-ansi": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+            "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+            "dev": true,
+            "requires": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            }
+        },
+        "wrappy": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+            "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+            "dev": true
+        },
+        "write-file-atomic": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+            "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+            "dev": true,
+            "requires": {
+                "imurmurhash": "^0.1.4",
+                "is-typedarray": "^1.0.0",
+                "signal-exit": "^3.0.2",
+                "typedarray-to-buffer": "^3.1.5"
+            }
+        },
+        "xdg-basedir": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+            "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+            "dev": true
+        },
+        "yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
+        "yn": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+            "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+            "dev": true
         }
-      }
-    },
-    "url-parse-lax": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
-      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
-      "dev": true,
-      "requires": {
-        "prepend-http": "^2.0.0"
-      }
-    },
-    "v8-compile-cache-lib": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz",
-      "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==",
-      "dev": true
-    },
-    "widest-line": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
-      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
-      "dev": true,
-      "requires": {
-        "string-width": "^4.0.0"
-      }
-    },
-    "wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "write-file-atomic": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
-      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
-      "dev": true,
-      "requires": {
-        "imurmurhash": "^0.1.4",
-        "is-typedarray": "^1.0.0",
-        "signal-exit": "^3.0.2",
-        "typedarray-to-buffer": "^3.1.5"
-      }
-    },
-    "xdg-basedir": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
-      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
-      "dev": true
-    },
-    "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
-    "yn": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
-      "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
-      "dev": true
     }
-  }
 }

styles/package.json 🔗

@@ -1,22 +1,21 @@
 {
-  "name": "styles",
-  "version": "1.0.0",
-  "description": "",
-  "main": "index.js",
-  "scripts": {
-    "build": "ts-node buildThemes.ts",
-    "watch": "nodemon"
-  },
-  "author": "",
-  "license": "ISC",
-  "dependencies": {
-    "@types/chroma-js": "^2.1.3",
-    "@types/node": "^17.0.23",
-    "case-anything": "^2.1.10",
-    "chroma-js": "^2.4.2",
-    "ts-node": "^10.7.0"
-  },
-  "devDependencies": {
-    "nodemon": "^2.0.15" 
-  }
+    "name": "styles",
+    "version": "1.0.0",
+    "description": "",
+    "main": "index.js",
+    "scripts": {
+        "build-themes": "ts-node ./src/buildThemes.ts",
+        "build-figma": "ts-node ./src/buildFigmaTokens.ts",
+        "watch": "nodemon"
+    },
+    "author": "",
+    "license": "ISC",
+    "dependencies": {
+        "@types/chroma-js": "^2.1.3",
+        "@types/node": "^17.0.23",
+        "case-anything": "^2.1.10",
+        "chroma-js": "^2.4.2",
+        "ts-node": "^10.7.0",
+        "nodemon": "^2.0.15"
+    }
 }

styles/src/buildFigmaTokens.ts 🔗

@@ -0,0 +1,110 @@
+import * as fs from "fs";
+import * as path from "path";
+import dark from "./themes/dark";
+import light from "./themes/light";
+import Theme from "./themes/theme";
+import { colors, fontFamilies, fontSizes, fontWeights } from "./tokens";
+
+// Organize theme tokens
+function themeTokens(theme: Theme) {
+    return {
+        meta: {
+            themeName: theme.name,
+        },
+        text: theme.textColor,
+        icon: theme.iconColor,
+        background: theme.backgroundColor,
+        border: theme.borderColor,
+        editor: theme.editor,
+        syntax: {
+            primary: {
+                value: theme.syntax.primary.color.value,
+                type: "color",
+            },
+            comment: {
+                value: theme.syntax.comment.color.value,
+                type: "color",
+            },
+            keyword: {
+                value: theme.syntax.keyword.color.value,
+                type: "color",
+            },
+            function: {
+                value: theme.syntax.function.color.value,
+                type: "color",
+            },
+            type: {
+                value: theme.syntax.type.color.value,
+                type: "color",
+            },
+            variant: {
+                value: theme.syntax.variant.color.value,
+                type: "color",
+            },
+            property: {
+                value: theme.syntax.property.color.value,
+                type: "color",
+            },
+            enum: {
+                value: theme.syntax.enum.color.value,
+                type: "color",
+            },
+            operator: {
+                value: theme.syntax.operator.color.value,
+                type: "color",
+            },
+            string: {
+                value: theme.syntax.string.color.value,
+                type: "color",
+            },
+            number: {
+                value: theme.syntax.number.color.value,
+                type: "color",
+            },
+            boolean: {
+                value: theme.syntax.boolean.color.value,
+                type: "color",
+            },
+        },
+        player: theme.player,
+        shadowAlpha: theme.shadowAlpha,
+    };
+}
+
+// Organize core tokens
+const coreTokens = {
+    color: {
+        ...colors,
+    },
+    text: {
+        family: fontFamilies,
+        weight: fontWeights,
+    },
+    size: fontSizes,
+};
+
+const combinedTokens: any = {
+    core: coreTokens,
+}
+
+// Create core.json
+const corePath = path.resolve(`${__dirname}/../dist/figma/core.json`);
+const coreJSON = JSON.stringify(coreTokens, null, 2);
+fs.writeFileSync(corePath, coreJSON);
+console.log(`- Core: core.json created`);
+
+// Create {theme}.json
+let themes = [dark, light];
+const themePath = path.resolve(`${__dirname}/figma`);
+themes.forEach((theme) => {
+    const tokenJSON = JSON.stringify(themeTokens(theme), null, 2);
+    fs.writeFileSync(`${themePath}/${theme.name}.json`, tokenJSON);
+    console.log(`- Theme: ${theme.name}.json created`);
+    combinedTokens[theme.name] = themeTokens(theme);
+});
+
+// Create combined tokens.json
+const combinedPath = path.resolve(`${__dirname}/figma/tokens.json`);
+const combinedJSON = JSON.stringify(combinedTokens, null, 2);
+fs.writeFileSync(combinedPath, combinedJSON);
+console.log(`- Combined: tokens.json created`);

styles/buildThemes.ts → styles/src/buildThemes.ts 🔗

@@ -3,14 +3,14 @@ import * as path from "path";
 import app from "./styleTree/app";
 import dark from "./themes/dark";
 import light from "./themes/light";
-import decamelizeTree from "./utils/decamelizeTree";
+import snakeCase from "./utils/snakeCase";
 
 const themes = [dark, light];
 for (let theme of themes) {
-    let styleTree = decamelizeTree(app(theme));
+    let styleTree = snakeCase(app(theme));
     let styleTreeJSON = JSON.stringify(styleTree, null, 2);
     let outPath = path.resolve(
-        `${__dirname}/../crates/zed/assets/themes/${theme.name}.json`
+        `${__dirname}/../../crates/zed/assets/themes/${theme.name}.json`
     );
     fs.writeFileSync(outPath, styleTreeJSON);
     console.log(`Generated ${outPath}`);

styles/figma/dark.json → styles/src/figma/dark.json 🔗

@@ -29,27 +29,27 @@
       "type": "color"
     },
     "feature": {
-      "value": "#2db4f3",
+      "value": "#1096d3",
       "step": 500,
       "type": "color"
     },
     "ok": {
-      "value": "#22c55e",
+      "value": "#1b9447",
       "step": 600,
       "type": "color"
     },
     "error": {
-      "value": "#f78c8c",
+      "value": "#f15656",
       "step": 400,
       "type": "color"
     },
     "warning": {
-      "value": "#f8c570",
+      "value": "#f7bb57",
       "step": 300,
       "type": "color"
     },
     "info": {
-      "value": "#6099f7",
+      "value": "#2472f2",
       "step": 500,
       "type": "color"
     }
@@ -81,27 +81,27 @@
       "type": "color"
     },
     "feature": {
-      "value": "#2db4f3",
+      "value": "#1096d3",
       "step": 500,
       "type": "color"
     },
     "ok": {
-      "value": "#22c55e",
+      "value": "#1b9447",
       "step": 600,
       "type": "color"
     },
     "error": {
-      "value": "#f47171",
+      "value": "#eb2d2d",
       "step": 500,
       "type": "color"
     },
     "warning": {
-      "value": "#f7b241",
+      "value": "#f6a724",
       "step": 400,
       "type": "color"
     },
     "info": {
-      "value": "#4287f6",
+      "value": "#135acd",
       "step": 600,
       "type": "color"
     }
@@ -175,88 +175,88 @@
     },
     "ok": {
       "base": {
-        "value": "#22c55e",
+        "value": "#1b9447",
         "step": 600,
         "type": "color"
       },
       "hovered": {
-        "value": "#22c55e",
+        "value": "#1b9447",
         "step": 600,
         "type": "color"
       },
       "active": {
-        "value": "#22c55e",
+        "value": "#1b9447",
         "step": 600,
         "type": "color"
       },
       "focused": {
-        "value": "#22c55e",
+        "value": "#1b9447",
         "step": 600,
         "type": "color"
       }
     },
     "error": {
       "base": {
-        "value": "#f78c8c",
+        "value": "#f15656",
         "step": 400,
         "type": "color"
       },
       "hovered": {
-        "value": "#f78c8c",
+        "value": "#f15656",
         "step": 400,
         "type": "color"
       },
       "active": {
-        "value": "#f78c8c",
+        "value": "#f15656",
         "step": 400,
         "type": "color"
       },
       "focused": {
-        "value": "#f78c8c",
+        "value": "#f15656",
         "step": 400,
         "type": "color"
       }
     },
     "warning": {
       "base": {
-        "value": "#f8c570",
+        "value": "#f7bb57",
         "step": 300,
         "type": "color"
       },
       "hovered": {
-        "value": "#f8c570",
+        "value": "#f7bb57",
         "step": 300,
         "type": "color"
       },
       "active": {
-        "value": "#f8c570",
+        "value": "#f7bb57",
         "step": 300,
         "type": "color"
       },
       "focused": {
-        "value": "#f8c570",
+        "value": "#f7bb57",
         "step": 300,
         "type": "color"
       }
     },
     "info": {
       "base": {
-        "value": "#6099f7",
+        "value": "#2472f2",
         "step": 500,
         "type": "color"
       },
       "hovered": {
-        "value": "#6099f7",
+        "value": "#2472f2",
         "step": 500,
         "type": "color"
       },
       "active": {
-        "value": "#6099f7",
+        "value": "#2472f2",
         "step": 500,
         "type": "color"
       },
       "focused": {
-        "value": "#6099f7",
+        "value": "#2472f2",
         "step": 500,
         "type": "color"
       }
@@ -289,22 +289,22 @@
       "type": "color"
     },
     "ok": {
-      "value": "#23d464",
+      "value": "#20b456",
       "step": 500,
       "type": "color"
     },
     "error": {
-      "value": "#f47171",
+      "value": "#eb2d2d",
       "step": 500,
       "type": "color"
     },
     "warning": {
-      "value": "#f59f0c",
+      "value": "#de900c",
       "step": 500,
       "type": "color"
     },
     "info": {
-      "value": "#6099f7",
+      "value": "#2472f2",
       "step": 500,
       "type": "color"
     }
@@ -337,35 +337,35 @@
         "type": "color"
       },
       "inserted": {
-        "value": "#22c55e",
+        "value": "#1b9447",
         "step": 600,
         "type": "color"
       },
       "deleted": {
-        "value": "#f78c8c",
+        "value": "#f15656",
         "step": 400,
         "type": "color"
       },
       "modified": {
-        "value": "#6099f7",
+        "value": "#2472f2",
         "step": 500,
         "type": "color"
       }
     },
     "highlight": {
       "selection": {
-        "value": "#d0e2fd",
-        "step": 100,
+        "value": "#103063",
+        "step": 800,
         "type": "color"
       },
       "occurrence": {
-        "value": "#777af4",
-        "step": 500,
+        "value": "#2b2b2b",
+        "step": 750,
         "type": "color"
       },
       "activeOccurrence": {
-        "value": "#8f90f6",
-        "step": 400,
+        "value": "#393939",
+        "step": 700,
         "type": "color"
       },
       "matchingBracket": {
@@ -374,13 +374,13 @@
         "type": "color"
       },
       "match": {
-        "value": "#87d116",
-        "step": 500,
+        "value": "#0a2633",
+        "step": 900,
         "type": "color"
       },
       "activeMatch": {
-        "value": "#90df17",
-        "step": 400,
+        "value": "#0e4158",
+        "step": 800,
         "type": "color"
       },
       "related": {
@@ -404,227 +404,227 @@
   },
   "syntax": {
     "primary": {
-      "value": "#f1f1f1",
+      "value": "#d5d5d5",
       "type": "color"
     },
     "comment": {
-      "value": "#bdf36b",
+      "value": "#aaaaaa",
       "type": "color"
     },
     "keyword": {
-      "value": "#59c3f5",
+      "value": "#4f8ff7",
       "type": "color"
     },
     "function": {
-      "value": "#fadc89",
+      "value": "#f9da82",
       "type": "color"
     },
     "type": {
-      "value": "#26ebd5",
+      "value": "#3eeeda",
       "type": "color"
     },
     "variant": {
-      "value": "#26ebd5",
+      "value": "#53c1f5",
       "type": "color"
     },
     "property": {
-      "value": "#81d2f8",
+      "value": "#4f8ff7",
       "type": "color"
     },
     "enum": {
-      "value": "#59c3f5",
+      "value": "#ee670a",
       "type": "color"
     },
     "operator": {
-      "value": "#59c3f5",
+      "value": "#ee670a",
       "type": "color"
     },
     "string": {
-      "value": "#fab78b",
+      "value": "#f99d5f",
       "type": "color"
     },
     "number": {
-      "value": "#d5d5d5",
+      "value": "#aeef4b",
       "type": "color"
     },
     "boolean": {
-      "value": "#d5d5d5",
+      "value": "#aeef4b",
       "type": "color"
     }
   },
   "player": {
     "1": {
       "baseColor": {
-        "value": "#4287f6",
-        "step": 600,
+        "value": "#2472f2",
+        "step": 500,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#4287f6",
-        "step": 600,
+        "value": "#2472f2",
+        "step": 500,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#d0e2fd",
-        "step": 100,
+        "value": "#103063",
+        "step": 800,
         "type": "color"
       },
       "borderColor": {
-        "value": "#4287f6",
-        "step": 600,
+        "value": "#103063",
+        "step": 800,
         "type": "color"
       }
     },
     "2": {
       "baseColor": {
-        "value": "#87d116",
+        "value": "#79ba16",
         "step": 500,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#87d116",
+        "value": "#79ba16",
         "step": 500,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#dbf9ac",
-        "step": 100,
+        "value": "#38530f",
+        "step": 800,
         "type": "color"
       },
       "borderColor": {
-        "value": "#87d116",
+        "value": "#79ba16",
         "step": 500,
         "type": "color"
       }
     },
     "3": {
       "baseColor": {
-        "value": "#777af4",
+        "value": "#484bed",
         "step": 500,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#777af4",
+        "value": "#484bed",
         "step": 500,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#d4d5fd",
-        "step": 100,
+        "value": "#121269",
+        "step": 800,
         "type": "color"
       },
       "borderColor": {
-        "value": "#777af4",
+        "value": "#484bed",
         "step": 500,
         "type": "color"
       }
     },
     "4": {
       "baseColor": {
-        "value": "#f98a3d",
+        "value": "#ee670a",
         "step": 500,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#f98a3d",
+        "value": "#ee670a",
         "step": 500,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#fde0cd",
-        "step": 100,
+        "value": "#5d2f0e",
+        "step": 800,
         "type": "color"
       },
       "borderColor": {
-        "value": "#f98a3d",
+        "value": "#ee670a",
         "step": 500,
         "type": "color"
       }
     },
     "5": {
       "baseColor": {
-        "value": "#b671f8",
+        "value": "#993bf3",
         "step": 500,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#b671f8",
+        "value": "#993bf3",
         "step": 500,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#e9d4fd",
-        "step": 100,
+        "value": "#3e1169",
+        "step": 800,
         "type": "color"
       },
       "borderColor": {
-        "value": "#b671f8",
+        "value": "#993bf3",
         "step": 500,
         "type": "color"
       }
     },
     "6": {
       "baseColor": {
-        "value": "#16ddc7",
+        "value": "#16d6c1",
         "step": 400,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#16ddc7",
+        "value": "#16d6c1",
         "step": 400,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#b4faf2",
-        "step": 100,
+        "value": "#0e4f48",
+        "step": 800,
         "type": "color"
       },
       "borderColor": {
-        "value": "#16ddc7",
+        "value": "#16d6c1",
         "step": 400,
         "type": "color"
       }
     },
     "7": {
       "baseColor": {
-        "value": "#f58ac0",
+        "value": "#ef59a3",
         "step": 400,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#f58ac0",
+        "value": "#ef59a3",
         "step": 400,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#fcd4e8",
+        "value": "#fbc6e1",
         "step": 100,
         "type": "color"
       },
       "borderColor": {
-        "value": "#f58ac0",
+        "value": "#ef59a3",
         "step": 400,
         "type": "color"
       }
     },
     "8": {
       "baseColor": {
-        "value": "#f6bc09",
+        "value": "#f7bf17",
         "step": 400,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#f6bc09",
+        "value": "#f7bf17",
         "step": 400,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#fceabc",
+        "value": "#fce9b7",
         "step": 100,
         "type": "color"
       },
       "borderColor": {
-        "value": "#f6bc09",
+        "value": "#f7bf17",
         "step": 400,
         "type": "color"
       }

styles/figma/light.json → styles/src/figma/light.json 🔗

@@ -29,27 +29,27 @@
       "type": "color"
     },
     "feature": {
-      "value": "#6099f7",
+      "value": "#2472f2",
       "step": 500,
       "type": "color"
     },
     "ok": {
-      "value": "#23d464",
+      "value": "#20b456",
       "step": 500,
       "type": "color"
     },
     "error": {
-      "value": "#f47171",
+      "value": "#eb2d2d",
       "step": 500,
       "type": "color"
     },
     "warning": {
-      "value": "#e5af09",
+      "value": "#d3a20b",
       "step": 500,
       "type": "color"
     },
     "info": {
-      "value": "#6099f7",
+      "value": "#2472f2",
       "step": 500,
       "type": "color"
     }
@@ -81,27 +81,27 @@
       "type": "color"
     },
     "feature": {
-      "value": "#0ea5e8",
+      "value": "#1179a8",
       "step": 600,
       "type": "color"
     },
     "ok": {
-      "value": "#22c55e",
+      "value": "#1b9447",
       "step": 600,
       "type": "color"
     },
     "error": {
-      "value": "#f15252",
+      "value": "#c91818",
       "step": 600,
       "type": "color"
     },
     "warning": {
-      "value": "#f6bc09",
+      "value": "#f7bf17",
       "step": 400,
       "type": "color"
     },
     "info": {
-      "value": "#4287f6",
+      "value": "#135acd",
       "step": 600,
       "type": "color"
     }
@@ -158,105 +158,105 @@
         "type": "color"
       },
       "hovered": {
-        "value": "#f1f1f1",
-        "step": 50,
+        "value": "#f8f8f8",
+        "step": 25,
         "type": "color"
       },
       "active": {
-        "value": "#e3e3e3",
-        "step": 100,
+        "value": "#f1f1f1",
+        "step": 50,
         "type": "color"
       },
       "focused": {
-        "value": "#f1f1f1",
-        "step": 50,
+        "value": "#eaeaea",
+        "step": 75,
         "type": "color"
       }
     },
     "ok": {
       "base": {
-        "value": "#befad2",
+        "value": "#b7f9ce",
         "step": 100,
         "type": "color"
       },
       "hovered": {
-        "value": "#befad2",
+        "value": "#b7f9ce",
         "step": 100,
         "type": "color"
       },
       "active": {
-        "value": "#befad2",
+        "value": "#b7f9ce",
         "step": 100,
         "type": "color"
       },
       "focused": {
-        "value": "#befad2",
+        "value": "#b7f9ce",
         "step": 100,
         "type": "color"
       }
     },
     "error": {
       "base": {
-        "value": "#fdd4d4",
+        "value": "#fcc6c6",
         "step": 100,
         "type": "color"
       },
       "hovered": {
-        "value": "#fdd4d4",
+        "value": "#fcc6c6",
         "step": 100,
         "type": "color"
       },
       "active": {
-        "value": "#fdd4d4",
+        "value": "#fcc6c6",
         "step": 100,
         "type": "color"
       },
       "focused": {
-        "value": "#fdd4d4",
+        "value": "#fcc6c6",
         "step": 100,
         "type": "color"
       }
     },
     "warning": {
       "base": {
-        "value": "#fceabc",
+        "value": "#fce9b7",
         "step": 100,
         "type": "color"
       },
       "hovered": {
-        "value": "#fceabc",
+        "value": "#fce9b7",
         "step": 100,
         "type": "color"
       },
       "active": {
-        "value": "#fceabc",
+        "value": "#fce9b7",
         "step": 100,
         "type": "color"
       },
       "focused": {
-        "value": "#fceabc",
+        "value": "#fce9b7",
         "step": 100,
         "type": "color"
       }
     },
     "info": {
       "base": {
-        "value": "#d0e2fd",
+        "value": "#c5dafc",
         "step": 100,
         "type": "color"
       },
       "hovered": {
-        "value": "#d0e2fd",
+        "value": "#c5dafc",
         "step": 100,
         "type": "color"
       },
       "active": {
-        "value": "#d0e2fd",
+        "value": "#c5dafc",
         "step": 100,
         "type": "color"
       },
       "focused": {
-        "value": "#d0e2fd",
+        "value": "#c5dafc",
         "step": 100,
         "type": "color"
       }
@@ -289,22 +289,22 @@
       "type": "color"
     },
     "ok": {
-      "value": "#8ff4b2",
+      "value": "#84f2ab",
       "step": 200,
       "type": "color"
     },
     "error": {
-      "value": "#fbbdbd",
+      "value": "#f9a0a0",
       "step": 200,
       "type": "color"
     },
     "warning": {
-      "value": "#fadc89",
+      "value": "#f9da82",
       "step": 200,
       "type": "color"
     },
     "info": {
-      "value": "#b4cffb",
+      "value": "#9ec1fa",
       "step": 200,
       "type": "color"
     }
@@ -327,40 +327,40 @@
     },
     "line": {
       "active": {
-        "value": "#e3e3e3",
-        "step": 100,
+        "value": "#f1f1f1",
+        "step": 50,
         "type": "color"
       },
       "highlighted": {
-        "value": "#e3e3e3",
-        "step": 100,
+        "value": "#f1f1f1",
+        "step": 50,
         "type": "color"
       },
       "inserted": {
-        "value": "#befad2",
+        "value": "#b7f9ce",
         "step": 100,
         "type": "color"
       },
       "deleted": {
-        "value": "#fdd4d4",
+        "value": "#fcc6c6",
         "step": 100,
         "type": "color"
       },
       "modified": {
-        "value": "#d0e2fd",
+        "value": "#c5dafc",
         "step": 100,
         "type": "color"
       }
     },
     "highlight": {
       "selection": {
-        "value": "#d0e2fd",
+        "value": "#c5dafc",
         "step": 100,
         "type": "color"
       },
       "occurrence": {
-        "value": "#e3e3e3",
-        "step": 100,
+        "value": "#f1f1f1",
+        "step": 50,
         "type": "color"
       },
       "activeOccurrence": {
@@ -391,8 +391,8 @@
     },
     "gutter": {
       "primary": {
-        "value": "#808080",
-        "step": 450,
+        "value": "#aaaaaa",
+        "step": 300,
         "type": "color"
       },
       "active": {
@@ -408,223 +408,223 @@
       "type": "color"
     },
     "comment": {
-      "value": "#bdf36b",
+      "value": "#555555",
       "type": "color"
     },
     "keyword": {
-      "value": "#59c3f5",
+      "value": "#103063",
       "type": "color"
     },
     "function": {
-      "value": "#fadc89",
+      "value": "#1b9447",
       "type": "color"
     },
     "type": {
-      "value": "#26ebd5",
+      "value": "#138a7d",
       "type": "color"
     },
     "variant": {
-      "value": "#26ebd5",
+      "value": "#1179a8",
       "type": "color"
     },
     "property": {
-      "value": "#81d2f8",
+      "value": "#134697",
       "type": "color"
     },
     "enum": {
-      "value": "#59c3f5",
+      "value": "#bb550e",
       "type": "color"
     },
     "operator": {
-      "value": "#59c3f5",
+      "value": "#bb550e",
       "type": "color"
     },
     "string": {
-      "value": "#fab78b",
+      "value": "#bb550e",
       "type": "color"
     },
     "number": {
-      "value": "#d5d5d5",
+      "value": "#14a898",
       "type": "color"
     },
     "boolean": {
-      "value": "#d5d5d5",
+      "value": "#b0740f",
       "type": "color"
     }
   },
   "player": {
     "1": {
       "baseColor": {
-        "value": "#4287f6",
+        "value": "#135acd",
         "step": 600,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#6099f7",
+        "value": "#2472f2",
         "step": 500,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#d0e2fd",
+        "value": "#c5dafc",
         "step": 100,
         "type": "color"
       },
       "borderColor": {
-        "value": "#6099f7",
+        "value": "#2472f2",
         "step": 500,
         "type": "color"
       }
     },
     "2": {
       "baseColor": {
-        "value": "#87d116",
+        "value": "#79ba16",
         "step": 500,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#87d116",
+        "value": "#79ba16",
         "step": 500,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#dbf9ac",
+        "value": "#dffab5",
         "step": 100,
         "type": "color"
       },
       "borderColor": {
-        "value": "#87d116",
+        "value": "#79ba16",
         "step": 500,
         "type": "color"
       }
     },
     "3": {
       "baseColor": {
-        "value": "#777af4",
+        "value": "#484bed",
         "step": 500,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#777af4",
+        "value": "#484bed",
         "step": 500,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#d4d5fd",
+        "value": "#cdcdfc",
         "step": 100,
         "type": "color"
       },
       "borderColor": {
-        "value": "#777af4",
+        "value": "#484bed",
         "step": 500,
         "type": "color"
       }
     },
     "4": {
       "baseColor": {
-        "value": "#f98a3d",
+        "value": "#ee670a",
         "step": 500,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#f98a3d",
+        "value": "#ee670a",
         "step": 500,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#fde0cd",
+        "value": "#fcd6bd",
         "step": 100,
         "type": "color"
       },
       "borderColor": {
-        "value": "#f98a3d",
+        "value": "#ee670a",
         "step": 500,
         "type": "color"
       }
     },
     "5": {
       "baseColor": {
-        "value": "#b671f8",
+        "value": "#993bf3",
         "step": 500,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#b671f8",
+        "value": "#993bf3",
         "step": 500,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#e9d4fd",
+        "value": "#e4cbfc",
         "step": 100,
         "type": "color"
       },
       "borderColor": {
-        "value": "#b671f8",
+        "value": "#993bf3",
         "step": 500,
         "type": "color"
       }
     },
     "6": {
       "baseColor": {
-        "value": "#16ddc7",
+        "value": "#16d6c1",
         "step": 400,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#16ddc7",
+        "value": "#16d6c1",
         "step": 400,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#b4faf2",
+        "value": "#b1faf2",
         "step": 100,
         "type": "color"
       },
       "borderColor": {
-        "value": "#16ddc7",
+        "value": "#16d6c1",
         "step": 400,
         "type": "color"
       }
     },
     "7": {
       "baseColor": {
-        "value": "#f58ac0",
+        "value": "#ef59a3",
         "step": 400,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#f58ac0",
+        "value": "#ef59a3",
         "step": 400,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#fcd4e8",
+        "value": "#fbc6e1",
         "step": 100,
         "type": "color"
       },
       "borderColor": {
-        "value": "#f58ac0",
+        "value": "#ef59a3",
         "step": 400,
         "type": "color"
       }
     },
     "8": {
       "baseColor": {
-        "value": "#f6bc09",
+        "value": "#f7bf17",
         "step": 400,
         "type": "color"
       },
       "cursorColor": {
-        "value": "#f6bc09",
+        "value": "#f7bf17",
         "step": 400,
         "type": "color"
       },
       "selectionColor": {
-        "value": "#fceabc",
+        "value": "#fce9b7",
         "step": 100,
         "type": "color"
       },
       "borderColor": {
-        "value": "#f6bc09",
+        "value": "#f7bf17",
         "step": 400,
         "type": "color"
       }

styles/figma/tokens.json → styles/src/figma/tokens.json 🔗

@@ -195,47 +195,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#fdd5db",
+          "value": "#fcc5cf",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#fbbdc8",
+          "value": "#fa9fae",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#faa4b3",
+          "value": "#f8788e",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#f98a9d",
+          "value": "#f5526e",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#f76e86",
+          "value": "#f0284a",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#f54c69",
+          "value": "#cd1434",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#ec2548",
+          "value": "#97142a",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#d21939",
+          "value": "#64101e",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#b41a35",
+          "value": "#330a11",
           "step": 900,
           "type": "color"
         }
@@ -247,47 +247,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#fdd4d4",
+          "value": "#fcc6c6",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#fbbdbd",
+          "value": "#f9a0a0",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#f9a5a5",
+          "value": "#f57b7b",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#f78c8c",
+          "value": "#f15656",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#f47171",
+          "value": "#eb2d2d",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#f15252",
+          "value": "#c91818",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#e82c2c",
+          "value": "#951515",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#d11c1c",
+          "value": "#631111",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#b21c1c",
+          "value": "#330a0a",
           "step": 900,
           "type": "color"
         }
@@ -299,47 +299,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#fde0cd",
+          "value": "#fcd6bd",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#fbccac",
+          "value": "#fab98e",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#fab78b",
+          "value": "#f99d5f",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#faa266",
+          "value": "#f9812e",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#f98a3d",
+          "value": "#ee670a",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#f77113",
+          "value": "#bb550e",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#e0650f",
+          "value": "#8b4210",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#c65d14",
+          "value": "#5d2f0e",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#ac5517",
+          "value": "#331b0a",
           "step": 900,
           "type": "color"
         }
@@ -351,47 +351,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#fce7c4",
+          "value": "#fce2ba",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#fad69d",
+          "value": "#f9ce89",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#f8c570",
+          "value": "#f7bb57",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#f7b241",
+          "value": "#f6a724",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#f59f0c",
+          "value": "#de900c",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#e1930e",
+          "value": "#b0740f",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#cd8812",
+          "value": "#845910",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#ba7d15",
+          "value": "#5a3e0e",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#a77218",
+          "value": "#33240a",
           "step": 900,
           "type": "color"
         }
@@ -403,47 +403,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#fceabc",
+          "value": "#fce9b7",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#fadc89",
+          "value": "#f9da82",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#f8cc4e",
+          "value": "#f8cc4d",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#f6bc09",
+          "value": "#f7bf17",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#e5af09",
+          "value": "#d3a20b",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#d4a30d",
+          "value": "#a8820e",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#c49811",
+          "value": "#7e630f",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#b48d14",
+          "value": "#58460e",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#a48117",
+          "value": "#33290a",
           "step": 900,
           "type": "color"
         }
@@ -455,47 +455,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#dbf9ac",
+          "value": "#dffab5",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#bdf36b",
+          "value": "#c7f57f",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#9feb2b",
+          "value": "#aeef4b",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#90df17",
+          "value": "#96e818",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#87d116",
+          "value": "#79ba16",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#7fc417",
+          "value": "#639714",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#78b618",
+          "value": "#4e7412",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#70aa19",
+          "value": "#38530f",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#699c1a",
+          "value": "#23330a",
           "step": 900,
           "type": "color"
         }
@@ -507,47 +507,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#befad2",
+          "value": "#b7f9ce",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#8ff4b2",
+          "value": "#84f2ab",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#60ec92",
+          "value": "#54e989",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#34e173",
+          "value": "#27dd69",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#23d464",
+          "value": "#20b456",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#22c55e",
+          "value": "#1b9447",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#20b658",
+          "value": "#157338",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#1ea851",
+          "value": "#105328",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#1d9b4b",
+          "value": "#0a3319",
           "step": 900,
           "type": "color"
         }
@@ -559,47 +559,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#b3fbe3",
+          "value": "#b0fae1",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#72f6ca",
+          "value": "#74f6cb",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#1feda9",
+          "value": "#39f0b3",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#12e09b",
+          "value": "#12d796",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#11d091",
+          "value": "#10a977",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#11c287",
+          "value": "#118a62",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#11b37e",
+          "value": "#106c4e",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#15a575",
+          "value": "#0d4f3a",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#18976c",
+          "value": "#0a3326",
           "step": 900,
           "type": "color"
         }
@@ -611,47 +611,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#b4faf2",
+          "value": "#b1faf2",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#73f4e6",
+          "value": "#76f5e7",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#26ebd5",
+          "value": "#3eeeda",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#16ddc7",
+          "value": "#16d6c1",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#15cfba",
+          "value": "#14a898",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#15c1ae",
+          "value": "#138a7d",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#15b2a1",
+          "value": "#116c62",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#17a495",
+          "value": "#0e4f48",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#199788",
+          "value": "#0a332f",
           "step": 900,
           "type": "color"
         }
@@ -663,17 +663,17 @@
           "type": "color"
         },
         "100": {
-          "value": "#bcf5fc",
+          "value": "#b2f3fb",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#86edfa",
+          "value": "#78eaf9",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#41e3f8",
+          "value": "#3de2f8",
           "step": 300,
           "type": "color"
         },
@@ -683,27 +683,27 @@
           "type": "color"
         },
         "500": {
-          "value": "#07c7e1",
+          "value": "#09aac0",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#07b8d0",
+          "value": "#0c8a9a",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#0daabf",
+          "value": "#0e6a75",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#119bae",
+          "value": "#0d4c53",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#168e9e",
+          "value": "#0a2f33",
           "step": 900,
           "type": "color"
         }
@@ -715,47 +715,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#caecfc",
+          "value": "#b9e5fb",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#a6defa",
+          "value": "#86d3f8",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#81d2f8",
+          "value": "#53c1f5",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#59c3f5",
+          "value": "#20b0f2",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#2db4f3",
+          "value": "#1096d3",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#0ea5e8",
+          "value": "#1179a8",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#1296d1",
+          "value": "#115c7f",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#1686ba",
+          "value": "#0e4158",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#1878a4",
+          "value": "#0a2633",
           "step": 900,
           "type": "color"
         }
@@ -767,47 +767,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#d0e2fd",
+          "value": "#c5dafc",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#b4cffb",
+          "value": "#9ec1fa",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#99befa",
+          "value": "#76a8f8",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#7cacf9",
+          "value": "#4f8ff7",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#6099f7",
+          "value": "#2472f2",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#4287f6",
+          "value": "#135acd",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#2774f0",
+          "value": "#134697",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#1762db",
+          "value": "#103063",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#1a55b4",
+          "value": "#0a1a33",
           "step": 900,
           "type": "color"
         }
@@ -819,47 +819,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#d4d5fd",
+          "value": "#cdcdfc",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#bebefb",
+          "value": "#aeaff9",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#a7a8f9",
+          "value": "#9091f6",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#8f90f6",
+          "value": "#7274f3",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#777af4",
+          "value": "#484bed",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#5f62f0",
+          "value": "#1b1edc",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#464aeb",
+          "value": "#1819a1",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#292de4",
+          "value": "#121269",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#1d20bb",
+          "value": "#0a0a33",
           "step": 900,
           "type": "color"
         }
@@ -871,47 +871,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#e0d5fd",
+          "value": "#daccfc",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#cfbcfb",
+          "value": "#c3acfb",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#bda4fa",
+          "value": "#ac8cf9",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#ad8cf9",
+          "value": "#966cf7",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#9b73f7",
+          "value": "#7741f2",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#8959f6",
+          "value": "#5316e0",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#7540f0",
+          "value": "#3f15a3",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#5e22e7",
+          "value": "#2b116a",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#4c1bbc",
+          "value": "#160a33",
           "step": 900,
           "type": "color"
         }
@@ -923,47 +923,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#e9d4fd",
+          "value": "#e4cbfc",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#dcbcfc",
+          "value": "#d2a9fb",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#d0a4fa",
+          "value": "#c188f9",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#c38bf9",
+          "value": "#b066f8",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#b671f8",
+          "value": "#993bf3",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#a856f7",
+          "value": "#7b14dd",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#9739f1",
+          "value": "#5c14a1",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#831ae6",
+          "value": "#3e1169",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#6d1bbb",
+          "value": "#1f0a33",
           "step": 900,
           "type": "color"
         }
@@ -975,47 +975,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#fad4fc",
+          "value": "#f8c5fb",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#f6bbfa",
+          "value": "#f19ff6",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#f1a2f7",
+          "value": "#e87af0",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#ec8af3",
+          "value": "#de57e8",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#e56fee",
+          "value": "#d430e0",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#dd51e7",
+          "value": "#b31fbc",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#d32edf",
+          "value": "#87198e",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#bc21c8",
+          "value": "#5c1260",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#a41ead",
+          "value": "#310a33",
           "step": 900,
           "type": "color"
         }
@@ -1027,47 +1027,47 @@
           "type": "color"
         },
         "100": {
-          "value": "#fcd4e8",
+          "value": "#fbc6e1",
           "step": 100,
           "type": "color"
         },
         "200": {
-          "value": "#fbbcdb",
+          "value": "#f8a1cc",
           "step": 200,
           "type": "color"
         },
         "300": {
-          "value": "#f8a5ce",
+          "value": "#f47db8",
           "step": 300,
           "type": "color"
         },
         "400": {
-          "value": "#f58ac0",
+          "value": "#ef59a3",
           "step": 400,
           "type": "color"
         },
         "500": {
-          "value": "#f26fb0",
+          "value": "#e8318c",
           "step": 500,
           "type": "color"
         },
         "600": {
-          "value": "#ee519e",
+          "value": "#c71a71",
           "step": 600,
           "type": "color"
         },
         "700": {
-          "value": "#e52e89",
+          "value": "#941756",
           "step": 700,
           "type": "color"
         },
         "800": {
-          "value": "#ce1e76",
+          "value": "#63113b",
           "step": 800,
           "type": "color"
         },
         "900": {
-          "value": "#b21d67",
+          "value": "#330a1f",
           "step": 900,
           "type": "color"
         }
@@ -1185,27 +1185,27 @@
         "type": "color"
       },
       "feature": {
-        "value": "#2db4f3",
+        "value": "#1096d3",
         "step": 500,
         "type": "color"
       },
       "ok": {
-        "value": "#22c55e",
+        "value": "#1b9447",
         "step": 600,
         "type": "color"
       },
       "error": {
-        "value": "#f78c8c",
+        "value": "#f15656",
         "step": 400,
         "type": "color"
       },
       "warning": {
-        "value": "#f8c570",
+        "value": "#f7bb57",
         "step": 300,
         "type": "color"
       },
       "info": {
-        "value": "#6099f7",
+        "value": "#2472f2",
         "step": 500,
         "type": "color"
       }
@@ -1237,27 +1237,27 @@
         "type": "color"
       },
       "feature": {
-        "value": "#2db4f3",
+        "value": "#1096d3",
         "step": 500,
         "type": "color"
       },
       "ok": {
-        "value": "#22c55e",
+        "value": "#1b9447",
         "step": 600,
         "type": "color"
       },
       "error": {
-        "value": "#f47171",
+        "value": "#eb2d2d",
         "step": 500,
         "type": "color"
       },
       "warning": {
-        "value": "#f7b241",
+        "value": "#f6a724",
         "step": 400,
         "type": "color"
       },
       "info": {
-        "value": "#4287f6",
+        "value": "#135acd",
         "step": 600,
         "type": "color"
       }

styles/styleTree/app.ts → styles/src/styleTree/app.ts 🔗

@@ -21,9 +21,7 @@ export default function app(theme: Theme): Object {
             tabIconSpacing: 4,
             tabIconWidth: 13,
             tabSummarySpacing: 10,
-            emptyMessage: {
-                ...text(theme, "sans", "primary", { size: "lg" }),
-            },
+            emptyMessage: text(theme, "sans", "primary", { size: "lg" }),
             statusBarItem: {
                 ...text(theme, "sans", "muted"),
                 margin: {

styles/src/styleTree/chatPanel.ts 🔗

@@ -0,0 +1,108 @@
+import Theme from "../themes/theme";
+import { panel } from "./app";
+import {
+    backgroundColor,
+    border,
+    player,
+    shadow,
+    text,
+    TextColor
+} from "./components";
+
+export default function chatPanel(theme: Theme) {
+    function channelSelectItem(
+        theme: Theme,
+        textColor: TextColor,
+        hovered: boolean
+    ) {
+        return {
+            name: text(theme, "sans", textColor),
+            padding: 4,
+            hash: {
+                ...text(theme, "sans", "muted"),
+                margin: {
+                    right: 8,
+                },
+            },
+            background: hovered ? backgroundColor(theme, 300, "hovered") : undefined,
+            cornerRadius: hovered ? 6 : 0,
+        };
+    }
+
+    const message = {
+        body: text(theme, "sans", "secondary"),
+        timestamp: text(theme, "sans", "muted", { size: "sm" }),
+        padding: {
+            bottom: 6,
+        },
+        sender: {
+            ...text(theme, "sans", "primary", { weight: "bold" }),
+            margin: {
+                right: 8,
+            },
+        },
+    };
+
+    return {
+        ...panel,
+        channelName: text(theme, "sans", "primary", { weight: "bold" }),
+        channelNameHash: {
+            ...text(theme, "sans", "muted"),
+            padding: {
+                right: 8,
+            },
+        },
+        channelSelect: {
+            header: {
+                ...channelSelectItem(theme, "primary", false),
+                padding: {
+                    bottom: 4,
+                    left: 0,
+                },
+            },
+            item: channelSelectItem(theme, "secondary", false),
+            hoveredItem: channelSelectItem(theme, "secondary", true),
+            activeItem: channelSelectItem(theme, "primary", false),
+            hoveredActiveItem: channelSelectItem(theme, "primary", true),
+            menu: {
+                background: backgroundColor(theme, 500),
+                cornerRadius: 6,
+                padding: 4,
+                border: border(theme, "primary"),
+                shadow: shadow(theme),
+            },
+        },
+        signInPrompt: text(theme, "sans", "secondary", { underline: true }),
+        hoveredSignInPrompt: text(theme, "sans", "primary", { underline: true }),
+        message,
+        pendingMessage: {
+            ...message,
+            body: {
+                ...message.body,
+                color: theme.textColor.muted.value,
+            },
+            sender: {
+                ...message.sender,
+                color: theme.textColor.muted.value,
+            },
+            timestamp: {
+                ...message.timestamp,
+                color: theme.textColor.muted.value,
+            },
+        },
+        inputEditor: {
+            background: backgroundColor(theme, 500),
+            cornerRadius: 6,
+            text: text(theme, "mono", "primary"),
+            placeholderText: text(theme, "mono", "placeholder", { size: "sm" }),
+            selection: player(theme, 1).selection,
+            border: border(theme, "secondary"),
+            padding: {
+                bottom: 7,
+                left: 8,
+                right: 8,
+                top: 7,
+            },
+        },
+    };
+}

styles/src/styleTree/components.ts 🔗

@@ -0,0 +1,96 @@
+import chroma from "chroma-js";
+import Theme, { BackgroundColor } from "../themes/theme";
+import { fontFamilies, fontSizes, FontFamily, FontWeight, FontSize } from "../tokens";
+import { Color } from "../utils/color";
+
+export type TextColor = keyof Theme["textColor"];
+export interface Text {
+    family: FontFamily,
+    color: Color,
+    size: FontSize,
+    weight?: FontWeight,
+    underline?: boolean,
+}
+export function text(
+    theme: Theme,
+    fontFamily: keyof typeof fontFamilies,
+    color: TextColor,
+    properties?: {
+        size?: keyof typeof fontSizes;
+        weight?: FontWeight;
+        underline?: boolean;
+    }
+): Text {
+    let extraProperties = {
+        ...properties,
+        size: fontSizes[properties.size || "sm"].value,
+    };
+    return {
+        family: fontFamilies[fontFamily].value,
+        color: theme.textColor[color].value,
+        ...extraProperties,
+    };
+}
+
+export interface BorderOptions {
+    width?: number;
+    top?: boolean;
+    bottom?: boolean;
+    left?: boolean;
+    right?: boolean;
+    overlay?: boolean;
+}
+export function border(
+    theme: Theme,
+    color: keyof Theme["borderColor"],
+    options?: BorderOptions
+) {
+    return {
+        color: borderColor(theme, color),
+        width: 1,
+        ...options,
+    };
+}
+
+export function borderColor(theme: Theme, color: keyof Theme["borderColor"]) {
+    return theme.borderColor[color].value;
+}
+
+export function iconColor(theme: Theme, color: keyof Theme["iconColor"]) {
+    return theme.iconColor[color].value;
+}
+
+export interface Player {
+    selection: {
+        cursor: Color;
+        selection: Color;
+    };
+}
+
+export function player(
+    theme: Theme,
+    playerNumber: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
+): Player {
+    return {
+        selection: {
+            cursor: theme.player[playerNumber].cursorColor.value,
+            selection: theme.player[playerNumber].selectionColor.value,
+        },
+    };
+}
+
+export function backgroundColor(
+    theme: Theme,
+    name: keyof Theme["backgroundColor"],
+    state?: keyof BackgroundColor
+): Color {
+    return theme.backgroundColor[name][state || "base"].value;
+}
+
+export function shadow(theme: Theme) {
+    return {
+        blur: 16,
+        color: chroma("black").alpha(theme.shadowAlpha.value).hex(),
+        offset: [0, 2],
+    };
+}

styles/styleTree/editor.ts → styles/src/styleTree/editor.ts 🔗

@@ -46,7 +46,7 @@ export default function editor(theme: Theme) {
         diffBackgroundDeleted: backgroundColor(theme, "error"),
         diffBackgroundInserted: backgroundColor(theme, "ok"),
         documentHighlightReadBackground: theme.editor.highlight.occurrence.value,
-        documentHighlightWriteBackground: theme.editor.highlight.occurrence.value,
+        documentHighlightWriteBackground: theme.editor.highlight.activeOccurrence.value,
         errorColor: theme.textColor.error.value,
         gutterBackground: backgroundColor(theme, 500),
         gutterPaddingFactor: 3.5,
@@ -129,7 +129,7 @@ export default function editor(theme: Theme) {
         invalidInformationDiagnostic: diagnostic(theme, "muted"),
         invalidWarningDiagnostic: diagnostic(theme, "muted"),
         syntax: {
-            keyword: theme.syntax.keyword.color.value, 
+            keyword: theme.syntax.keyword.color.value,
             function: theme.syntax.function.color.value,
             string: theme.syntax.string.color.value,
             type: theme.syntax.type.color.value,
@@ -143,7 +143,7 @@ export default function editor(theme: Theme) {
             "emphasis.strong": { color: theme.textColor.feature.value, weight: "bold" },
             link_uri: { color: theme.syntax.linkUrl.color.value, underline: true },
             link_text: { color: theme.syntax.linkText.color.value, italic: true },
-            list_marker: theme.syntax.listMarker.color.value,
+            list_marker: theme.syntax.punctuation.color.value,
         },
     };
 }

styles/src/styleTree/projectPanel.ts 🔗

@@ -0,0 +1,37 @@
+import Theme from "../themes/theme";
+import { Color } from "../utils/color";
+import { panel } from "./app";
+import { backgroundColor, iconColor, text, TextColor } from "./components";
+
+export default function projectPanel(theme: Theme) {
+    function entry(theme: Theme, textColor: TextColor, background?: Color) {
+        return {
+            height: 22,
+            background,
+            iconColor: iconColor(theme, "muted"),
+            iconSize: 8,
+            iconSpacing: 8,
+            text: text(theme, "mono", textColor, { size: "sm" }),
+        };
+    }
+
+    return {
+        ...panel,
+        entry: entry(theme, "secondary"),
+        hoveredEntry: entry(
+            theme,
+            "secondary",
+            backgroundColor(theme, 300, "hovered")
+        ),
+        selectedEntry: entry(theme, "primary"),
+        hoveredSelectedEntry: entry(
+            theme,
+            "primary",
+            backgroundColor(theme, 300, "hovered")
+        ),
+        padding: {
+            top: 6,
+            left: 12,
+        },
+    };
+}

styles/src/styleTree/search.ts 🔗

@@ -0,0 +1,79 @@
+import Theme from "../themes/theme";
+import { backgroundColor, border, player, text } from "./components";
+
+export default function search(theme: Theme) {
+    const optionButton = {
+        ...text(theme, "mono", "secondary"),
+        background: backgroundColor(theme, 300),
+        cornerRadius: 6,
+        border: border(theme, "primary"),
+        margin: {
+            left: 1,
+            right: 1,
+        },
+        padding: {
+            bottom: 1,
+            left: 6,
+            right: 6,
+            top: 1,
+        },
+    };
+
+    const editor = {
+        background: backgroundColor(theme, 500),
+        cornerRadius: 6,
+        minWidth: 200,
+        maxWidth: 500,
+        placeholderText: text(theme, "mono", "placeholder"),
+        selection: player(theme, 1).selection,
+        text: text(theme, "mono", "primary"),
+        border: border(theme, "primary"),
+        margin: {
+            right: 5,
+        },
+        padding: {
+            top: 3,
+            bottom: 3,
+            left: 14,
+            right: 14,
+        },
+    };
+
+    return {
+        matchBackground: theme.editor.highlight.match.value,
+        tabIconSpacing: 4,
+        tabIconWidth: 14,
+        activeHoveredOptionButton: {
+            ...optionButton,
+            background: backgroundColor(theme, 100),
+        },
+        activeOptionButton: {
+            ...optionButton,
+            background: backgroundColor(theme, 100),
+        },
+        editor,
+        hoveredOptionButton: {
+            ...optionButton,
+            background: backgroundColor(theme, 100),
+        },
+        invalidEditor: {
+            ...editor,
+            border: border(theme, "error"),
+        },
+        matchIndex: {
+            ...text(theme, "mono", "muted"),
+            padding: 6,
+        },
+        optionButton,
+        optionButtonGroup: {
+            padding: {
+                left: 2,
+                right: 2,
+            },
+        },
+        resultsStatus: {
+            ...text(theme, "mono", "primary"),
+            size: 18,
+        },
+    };
+}

styles/src/styleTree/selectorModal.ts 🔗

@@ -0,0 +1,59 @@
+import Theme from "../themes/theme";
+import { backgroundColor, border, player, shadow, text } from "./components";
+
+export default function selectorModal(theme: Theme): Object {
+    const item = {
+        padding: {
+            bottom: 4,
+            left: 16,
+            right: 16,
+            top: 4,
+        },
+        cornerRadius: 6,
+        text: text(theme, "sans", "secondary"),
+        highlightText: text(theme, "sans", "feature", { weight: "bold" }),
+    };
+
+    const activeItem = {
+        ...item,
+        background: backgroundColor(theme, 300, "active"),
+        text: text(theme, "sans", "primary"),
+    };
+
+    return {
+        background: backgroundColor(theme, 300),
+        cornerRadius: 6,
+        padding: 8,
+        item,
+        activeItem,
+        border: border(theme, "primary"),
+        empty: {
+            text: text(theme, "sans", "muted"),
+            padding: {
+                bottom: 4,
+                left: 16,
+                right: 16,
+                top: 8,
+            },
+        },
+        inputEditor: {
+            background: backgroundColor(theme, 500),
+            corner_radius: 6,
+            placeholderText: text(theme, "sans", "placeholder"),
+            selection: player(theme, 1).selection,
+            text: text(theme, "mono", "primary"),
+            border: border(theme, "secondary"),
+            padding: {
+                bottom: 7,
+                left: 16,
+                right: 16,
+                top: 7,
+            },
+        },
+        margin: {
+            bottom: 52,
+            top: 52,
+        },
+        shadow: shadow(theme),
+    };
+}

styles/src/styleTree/workspace.ts 🔗

@@ -0,0 +1,151 @@
+import Theme from "../themes/theme";
+import { backgroundColor, border, iconColor, text } from "./components";
+
+export default function workspace(theme: Theme) {
+    const signInPrompt = {
+        ...text(theme, "sans", "secondary"),
+        size: 13,
+        underline: true,
+        padding: {
+            right: 8,
+        },
+    };
+
+    const tab = {
+        height: 32,
+        background: backgroundColor(theme, 300),
+        iconClose: iconColor(theme, "muted"),
+        iconCloseActive: iconColor(theme, "active"),
+        iconConflict: iconColor(theme, "warning"),
+        iconDirty: iconColor(theme, "info"),
+        iconWidth: 8,
+        spacing: 10,
+        text: text(theme, "mono", "secondary", { size: "sm" }),
+        border: border(theme, "primary", {
+            left: true,
+            bottom: true,
+            overlay: true,
+        }),
+        padding: {
+            left: 12,
+            right: 12,
+        },
+    };
+
+    const activeTab = {
+        ...tab,
+        background: backgroundColor(theme, 500),
+        text: text(theme, "mono", "active", { size: "sm" }),
+        border: {
+            ...tab.border,
+            bottom: false,
+        },
+    };
+
+    const sidebarItem = {
+        height: 32,
+        iconColor: iconColor(theme, "secondary"),
+        iconSize: 18,
+    };
+    const sidebar = {
+        width: 30,
+        background: backgroundColor(theme, 300),
+        border: border(theme, "primary", { right: true }),
+        item: sidebarItem,
+        activeItem: {
+            ...sidebarItem,
+            iconColor: iconColor(theme, "active"),
+        },
+        resizeHandle: {
+            background: border(theme, "primary").color,
+            padding: {
+                left: 1,
+            },
+        },
+    };
+
+    return {
+        background: backgroundColor(theme, 300),
+        leaderBorderOpacity: 0.7,
+        leaderBorderWidth: 2.0,
+        tab,
+        activeTab,
+        leftSidebar: {
+            ...sidebar,
+            border: border(theme, "primary", { right: true }),
+        },
+        rightSidebar: {
+            ...sidebar,
+            border: border(theme, "primary", { left: true }),
+        },
+        paneDivider: {
+            color: border(theme, "primary").color,
+            width: 1,
+        },
+        status_bar: {
+            height: 24,
+            itemSpacing: 8,
+            padding: {
+                left: 6,
+                right: 6,
+            },
+            cursorPosition: text(theme, "sans", "muted"),
+            diagnosticMessage: text(theme, "sans", "muted"),
+            lspMessage: text(theme, "sans", "muted"),
+        },
+        titlebar: {
+            avatarWidth: 18,
+            height: 32,
+            background: backgroundColor(theme, 100),
+            shareIconColor: iconColor(theme, "secondary"),
+            shareIconActiveColor: iconColor(theme, "active"),
+            title: text(theme, "sans", "primary"),
+            avatar: {
+                cornerRadius: 10,
+                border: {
+                    color: "#00000088",
+                    width: 1,
+                },
+            },
+            avatarRibbon: {
+                height: 3,
+                width: 12,
+                // TODO: The background for this ideally should be 
+                // set with a token, not hardcoded in rust
+            },
+            border: border(theme, "primary", { bottom: true }),
+            signInPrompt,
+            hoveredSignInPrompt: {
+                ...signInPrompt,
+                ...text(theme, "mono", "active"),
+                size: 13,
+            },
+            offlineIcon: {
+                color: iconColor(theme, "secondary"),
+                width: 16,
+                padding: {
+                    right: 4,
+                },
+            },
+            outdatedWarning: {
+                ...text(theme, "sans", "warning"),
+                size: 13,
+            },
+        },
+        toolbar: {
+            height: 34,
+            background: backgroundColor(theme, 500),
+            border: border(theme, "secondary", { bottom: true }),
+            itemSpacing: 8,
+            padding: { left: 16, right: 8, top: 4, bottom: 4 },
+        },
+        breadcrumbs: {
+            ...text(theme, "mono", "secondary"),
+            padding: { left: 6 },
+        },
+        disconnectedOverlay: {
+            ...text(theme, "sans", "active"),
+            background: "#000000aa",
+        },
+    };
+}

styles/themes/dark.ts → styles/src/themes/dark.ts 🔗

@@ -1,5 +1,6 @@
-import { colors, fontWeights, NumberToken } from "../tokens";
-import Theme, { Syntax } from "./theme";
+import { Color, colors, fontWeights, NumberToken } from "../tokens";
+import { withOpacity } from "../utils/color";
+import Theme, { buildPlayer, Syntax } from "./theme";
 
 const backgroundColor = {
     100: {
@@ -87,57 +88,16 @@ const iconColor = {
 };
 
 const player = {
-    1: {
-        baseColor: colors.blue[500],
-        cursorColor: colors.blue[500],
-        selectionColor: colors.blue[800],
-        borderColor: colors.blue[800],
-    },
-    2: {
-        baseColor: colors.lime[500],
-        cursorColor: colors.lime[500],
-        selectionColor: colors.lime[800],
-        borderColor: colors.lime[500],
-    },
-    3: {
-        baseColor: colors.indigo[500],
-        cursorColor: colors.indigo[500],
-        selectionColor: colors.indigo[800],
-        borderColor: colors.indigo[500],
-    },
-    4: {
-        baseColor: colors.orange[500],
-        cursorColor: colors.orange[500],
-        selectionColor: colors.orange[800],
-        borderColor: colors.orange[500],
-    },
-    5: {
-        baseColor: colors.purple[500],
-        cursorColor: colors.purple[500],
-        selectionColor: colors.purple[800],
-        borderColor: colors.purple[500],
-    },
-    6: {
-        baseColor: colors.teal[400],
-        cursorColor: colors.teal[400],
-        selectionColor: colors.teal[800],
-        borderColor: colors.teal[400],
-    },
-    7: {
-        baseColor: colors.pink[400],
-        cursorColor: colors.pink[400],
-        selectionColor: colors.pink[100],
-        borderColor: colors.pink[400],
-    },
-    8: {
-        baseColor: colors.yellow[400],
-        cursorColor: colors.yellow[400],
-        selectionColor: colors.yellow[100],
-        borderColor: colors.yellow[400],
-    },
+    1: buildPlayer(colors.blue[500]),
+    2: buildPlayer(colors.lime[500]),
+    3: buildPlayer(colors.indigo[500]),
+    4: buildPlayer(colors.orange[500]),
+    5: buildPlayer(colors.purple[500]),
+    6: buildPlayer(colors.teal[400]),
+    7: buildPlayer(colors.pink[400]),
+    8: buildPlayer(colors.yellow[400]),
 };
 
-// TODO: Fixup
 const editor = {
     background: backgroundColor[500].base,
     indent_guide: borderColor.muted,
@@ -151,11 +111,11 @@ const editor = {
     },
     highlight: {
         selection: player[1].selectionColor,
-        occurrence: colors.neutral[750], 
-        activeOccurrence: colors.neutral[700],
+        occurrence: withOpacity(colors.teal[500], 0.16),
+        activeOccurrence: withOpacity(colors.teal[500], 0.32),
         matchingBracket: backgroundColor[500].active,
-        match: colors.sky[900],
-        activeMatch: colors.sky[800],
+        match: withOpacity(colors.sky[500], 0.16),
+        activeMatch: withOpacity(colors.sky[800], 0.32),
         related: backgroundColor[500].focused,
     },
     gutter: {
@@ -247,10 +207,6 @@ const syntax: Syntax = {
         weight: fontWeights.normal,
         // TODO: add italic
     },
-    listMarker: {
-        color: colors.sky[400],
-        weight: fontWeights.normal,
-    }
 };
 
 const shadowAlpha: NumberToken = {

styles/src/themes/light.ts 🔗

@@ -0,0 +1,228 @@
+import { colors, fontWeights, NumberToken } from "../tokens";
+import { withOpacity } from "../utils/color";
+import Theme, { buildPlayer, Syntax } from "./theme";
+
+const backgroundColor = {
+    100: {
+        base: colors.neutral[100],
+        hovered: colors.neutral[150],
+        active: colors.neutral[200],
+        focused: colors.neutral[150],
+    },
+    300: {
+        base: colors.neutral[50],
+        hovered: colors.neutral[100],
+        active: colors.neutral[150],
+        focused: colors.neutral[100],
+    },
+    500: {
+        base: colors.neutral[0],
+        hovered: colors.neutral[25],
+        active: colors.neutral[50],
+        focused: colors.neutral[75],
+    },
+    ok: {
+        base: colors.green[100],
+        hovered: colors.green[100],
+        active: colors.green[100],
+        focused: colors.green[100],
+    },
+    error: {
+        base: colors.red[100],
+        hovered: colors.red[100],
+        active: colors.red[100],
+        focused: colors.red[100],
+    },
+    warning: {
+        base: colors.yellow[100],
+        hovered: colors.yellow[100],
+        active: colors.yellow[100],
+        focused: colors.yellow[100],
+    },
+    info: {
+        base: colors.blue[100],
+        hovered: colors.blue[100],
+        active: colors.blue[100],
+        focused: colors.blue[100],
+    },
+};
+
+const borderColor = {
+    primary: colors.neutral[200],
+    secondary: colors.neutral[100],
+    muted: colors.neutral[50],
+    focused: colors.neutral[100],
+    active: colors.neutral[250],
+    ok: colors.green[200],
+    error: colors.red[200],
+    warning: colors.yellow[200],
+    info: colors.blue[200],
+};
+
+const textColor = {
+    primary: colors.neutral[750],
+    secondary: colors.neutral[600],
+    muted: colors.neutral[450],
+    placeholder: colors.neutral[300],
+    active: colors.neutral[900],
+    feature: colors.blue[500],
+    ok: colors.green[500],
+    error: colors.red[500],
+    warning: colors.yellow[500],
+    info: colors.blue[500],
+};
+
+const iconColor = {
+    primary: colors.neutral[300],
+    secondary: colors.neutral[500],
+    muted: colors.neutral[600],
+    placeholder: colors.neutral[700],
+    active: colors.neutral[900],
+    feature: colors.sky[600],
+    ok: colors.green[600],
+    error: colors.red[600],
+    warning: colors.yellow[400],
+    info: colors.blue[600],
+};
+
+const player = {
+    1: buildPlayer(colors.blue[500]),
+    2: buildPlayer(colors.lime[500]),
+    3: buildPlayer(colors.indigo[500]),
+    4: buildPlayer(colors.orange[500]),
+    5: buildPlayer(colors.purple[500]),
+    6: buildPlayer(colors.teal[400]),
+    7: buildPlayer(colors.pink[400]),
+    8: buildPlayer(colors.yellow[400]),
+};
+
+// TODO: Fixup
+const editor = {
+    background: backgroundColor[500].base,
+    indent_guide: borderColor.muted,
+    indent_guide_active: borderColor.secondary,
+    line: {
+        active: backgroundColor[500].active,
+        highlighted: backgroundColor[500].active,
+        inserted: backgroundColor.ok.active,
+        deleted: backgroundColor.error.active,
+        modified: backgroundColor.info.active,
+    },
+    highlight: {
+        selection: player[1].selectionColor,
+        occurrence: withOpacity(colors.teal[500], 0.16),
+        activeOccurrence: withOpacity(colors.teal[500], 0.32),
+        matchingBracket: colors.neutral[0],
+        match: withOpacity(colors.sky[500], 0.16),
+        activeMatch: withOpacity(colors.sky[800], 0.32),
+        related: colors.neutral[0],
+    },
+    gutter: {
+        primary: colors.neutral[300],
+        active: textColor.active,
+    },
+};
+
+const syntax: Syntax = {
+    primary: {
+        color: colors.neutral[750],
+        weight: fontWeights.normal,
+    },
+    comment: {
+        color: colors.neutral[600],
+        weight: fontWeights.normal,
+    },
+    punctuation: {
+        color: colors.neutral[700],
+        weight: fontWeights.normal,
+    },
+    constant: {
+        color: colors.neutral[700],
+        weight: fontWeights.normal,
+    },
+    keyword: {
+        color: colors.blue[800],
+        weight: fontWeights.normal,
+    },
+    function: {
+        color: colors.green[600],
+        weight: fontWeights.normal,
+    },
+    type: {
+        color: colors.teal[600],
+        weight: fontWeights.normal,
+    },
+    variant: {
+        color: colors.sky[600],
+        weight: fontWeights.normal,
+    },
+    property: {
+        color: colors.blue[700],
+        weight: fontWeights.normal,
+    },
+    enum: {
+        color: colors.orange[600],
+        weight: fontWeights.normal,
+    },
+    operator: {
+        color: colors.orange[600],
+        weight: fontWeights.normal,
+    },
+    string: {
+        color: colors.orange[600],
+        weight: fontWeights.normal,
+    },
+    number: {
+        color: colors.teal[500],
+        weight: fontWeights.normal,
+    },
+    boolean: {
+        color: colors.amber[600],
+        weight: fontWeights.normal,
+    },
+    predictive: {
+        color: textColor.muted,
+        weight: fontWeights.normal,
+    },
+    title: {
+        color: colors.sky[500],
+        weight: fontWeights.bold,
+    },
+    emphasis: {
+        color: textColor.active,
+        weight: fontWeights.normal,
+    },
+    emphasisStrong: {
+        color: textColor.active,
+        weight: fontWeights.bold,
+    },
+    linkUrl: {
+        color: colors.teal[500],
+        weight: fontWeights.normal,
+        // TODO: add underline
+    },
+    linkText: {
+        color: colors.orange[500],
+        weight: fontWeights.normal,
+        // TODO: add italic
+    },
+};
+
+const shadowAlpha: NumberToken = {
+    value: 0.12,
+    type: "number",
+};
+
+const theme: Theme = {
+    name: "light",
+    backgroundColor,
+    borderColor,
+    textColor,
+    iconColor,
+    editor,
+    syntax,
+    player,
+    shadowAlpha,
+};
+
+export default theme;

styles/themes/theme.ts → styles/src/themes/theme.ts 🔗

@@ -1,4 +1,5 @@
 import { ColorToken, FontWeightToken, NumberToken } from "../tokens";
+import { Color, withOpacity } from "../utils/color";
 
 export interface SyntaxHighlightStyle {
     color: ColorToken;
@@ -11,6 +12,19 @@ export interface Player {
     selectionColor: ColorToken;
     borderColor: ColorToken;
 }
+export function buildPlayer(
+    color: ColorToken,
+    cursorOpacity?: number,
+    selectionOpacity?: number,
+    borderOpacity?: number
+) {
+    return {
+        baseColor: color,
+        cursorColor: withOpacity(color, cursorOpacity || 1.0),
+        selectionColor: withOpacity(color, selectionOpacity || 0.1),
+        borderColor: withOpacity(color, borderOpacity || 0.8),
+    }
+}
 
 export interface BackgroundColor {
     base: ColorToken;

styles/src/utils/color.ts 🔗

@@ -0,0 +1,52 @@
+import chroma, { Scale } from "chroma-js";
+import { ColorToken } from "../tokens";
+
+export type Color = string;
+export type ColorRampStep = { value: Color; type: "color"; step: number };
+export type ColorRamp = {
+    [index: number]: ColorRampStep;
+};
+
+export function colorRamp(
+    color: Color | [Color, Color],
+    options?: { steps?: number; increment?: number; }
+): ColorRamp {
+    let scale: Scale;
+    if (Array.isArray(color)) {
+        const [startColor, endColor] = color;
+        scale = chroma.scale([startColor, endColor]);
+    } else {
+        let hue = Math.round(chroma(color).hsl()[0]);
+        let startColor = chroma.hsl(hue, 0.88, 0.96);
+        let endColor = chroma.hsl(hue, 0.68, 0.12);
+        scale = chroma
+            .scale([startColor, color, endColor])
+            .domain([0, 0.5, 1])
+            .mode("hsl")
+            .gamma(1)
+            // .correctLightness(true)
+            .padding([0, 0]);
+    }
+
+    const ramp: ColorRamp = {};
+    const steps = options?.steps || 10;
+    const increment = options?.increment || 100;
+
+    scale.colors(steps, "hex").forEach((color, ix) => {
+        const step = ix * increment;
+        ramp[step] = {
+            value: color,
+            step,
+            type: "color",
+        };
+    });
+
+    return ramp;
+}
+
+export function withOpacity(color: ColorToken, opacity: number): ColorToken {
+    return {
+        ...color,
+        value: chroma(color.value).alpha(opacity).hex()
+    };
+}

styles/src/utils/snakeCase.ts 🔗

@@ -0,0 +1,35 @@
+import { snakeCase } from "case-anything";
+
+// https://stackoverflow.com/questions/60269936/typescript-convert-generic-object-from-snake-to-camel-case
+
+// Typescript magic to convert any string from camelCase to snake_case at compile time
+type SnakeCase<S> =
+    S extends string ?
+    S extends `${infer T}${infer U}` ?
+    `${T extends Capitalize<T> ? "_" : ""}${Lowercase<T>}${SnakeCase<U>}` :
+    S :
+    S;
+
+type SnakeCased<Type> = {
+    [Property in keyof Type as SnakeCase<Property>]: SnakeCased<Type[Property]>
+}
+
+export default function snakeCaseTree<T>(object: T): SnakeCased<T> {
+    const snakeObject: any = {};
+    for (const key in object) {
+        snakeObject[snakeCase(key)] = snakeCaseValue(object[key]);
+    }
+    return snakeObject;
+}
+
+function snakeCaseValue(value: any): any {
+    if (typeof value === "object") {
+        if (Array.isArray(value)) {
+            return value.map(snakeCaseValue);
+        } else {
+            return snakeCaseTree(value);
+        }
+    } else {
+        return value;
+    }
+}

styles/styleTree/chatPanel.ts 🔗

@@ -1,108 +0,0 @@
-import Theme from "../themes/theme";
-import { panel } from "./app";
-import {
-  backgroundColor,
-  border,
-  player,
-  shadow,
-  text,
-  TextColor
-} from "./components";
-
-export default function chatPanel(theme: Theme) {
-  function channelSelectItem(
-    theme: Theme,
-    textColor: TextColor,
-    hovered: boolean
-  ) {
-    return {
-      name: text(theme, "sans", textColor),
-      padding: 4,
-      hash: {
-        ...text(theme, "sans", "muted"),
-        margin: {
-          right: 8,
-        },
-      },
-      background: hovered ? backgroundColor(theme, 300, "hovered") : undefined,
-      cornerRadius: hovered ? 6 : 0,
-    };
-  }
-
-  const message = {
-    body: text(theme, "sans", "secondary"),
-    timestamp: text(theme, "sans", "muted", { size: "sm" }),
-    padding: {
-      bottom: 6,
-    },
-    sender: {
-      ...text(theme, "sans", "primary", { weight: "bold" }),
-      margin: {
-        right: 8,
-      },
-    },
-  };
-
-  return {
-    ...panel,
-    channelName: text(theme, "sans", "primary", { weight: "bold" }),
-    channelNameHash: {
-      ...text(theme, "sans", "muted"),
-      padding: {
-        right: 8,
-      },
-    },
-    channelSelect: {
-      header: {
-        ...channelSelectItem(theme, "primary", false),
-        padding: {
-          bottom: 4,
-          left: 0,
-        },
-      },
-      item: channelSelectItem(theme, "secondary", false),
-      hoveredItem: channelSelectItem(theme, "secondary", true),
-      activeItem: channelSelectItem(theme, "primary", false),
-      hoveredActiveItem: channelSelectItem(theme, "primary", true),
-      menu: {
-        background: backgroundColor(theme, 500),
-        cornerRadius: 6,
-        padding: 4,
-        border: border(theme, "primary"),
-        shadow: shadow(theme),
-      },
-    },
-    signInPrompt: text(theme, "sans", "secondary", { underline: true }),
-    hoveredSignInPrompt: text(theme, "sans", "primary", { underline: true }),
-    message,
-    pendingMessage: {
-      ...message,
-      body: {
-        ...message.body,
-        color: theme.textColor.muted.value,
-      },
-      sender: {
-        ...message.sender,
-        color: theme.textColor.muted.value,
-      },
-      timestamp: {
-        ...message.timestamp,
-        color: theme.textColor.muted.value,
-      },
-    },
-    inputEditor: {
-      background: backgroundColor(theme, 500),
-      cornerRadius: 6,
-      text: text(theme, "mono", "primary"),
-      placeholderText: text(theme, "mono", "placeholder", { size: "sm" }),
-      selection: player(theme, 1).selection,
-      border: border(theme, "secondary"),
-      padding: {
-        bottom: 7,
-        left: 8,
-        right: 8,
-        top: 7,
-      },
-    },
-  };
-}

styles/styleTree/components.ts 🔗

@@ -1,91 +0,0 @@
-import chroma from "chroma-js";
-import Theme, { BackgroundColor } from "../themes/theme";
-import { fontFamilies, fontSizes, FontWeight } from "../tokens";
-import { Color } from "../utils/color";
-
-export type TextColor = keyof Theme["textColor"];
-
-export function text(
-  theme: Theme,
-  fontFamily: keyof typeof fontFamilies,
-  color: TextColor,
-  properties?: {
-    size?: keyof typeof fontSizes;
-    weight?: FontWeight;
-    underline?: boolean;
-  }
-) {
-  const sizeKey = properties?.size || fontFamily === "sans" ? "sm" : "md";
-  const size = fontSizes[sizeKey].value;
-
-  return {
-    family: fontFamilies[fontFamily].value,
-    color: theme.textColor[color].value,
-    ...properties,
-    size,
-  };
-}
-
-export interface BorderOptions {
-  width?: number;
-  top?: boolean;
-  bottom?: boolean;
-  left?: boolean;
-  right?: boolean;
-  overlay?: boolean;
-}
-
-export function border(
-  theme: Theme,
-  color: keyof Theme["borderColor"],
-  options?: BorderOptions
-) {
-  return {
-    color: borderColor(theme, color),
-    width: 1,
-    ...options,
-  };
-}
-
-export function borderColor(theme: Theme, color: keyof Theme["borderColor"]) {
-  return theme.borderColor[color].value;
-}
-
-export function iconColor(theme: Theme, color: keyof Theme["iconColor"]) {
-  return theme.iconColor[color].value;
-}
-
-export interface Player {
-  selection: {
-    cursor: Color;
-    selection: Color;
-  };
-}
-
-export function player(
-  theme: Theme,
-  playerNumber: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
-): Player {
-  return {
-    selection: {
-      cursor: theme.player[playerNumber].cursorColor.value,
-      selection: theme.player[playerNumber].selectionColor.value,
-    },
-  };
-}
-
-export function backgroundColor(
-  theme: Theme,
-  name: keyof Theme["backgroundColor"],
-  state?: keyof BackgroundColor
-): Color {
-  return theme.backgroundColor[name][state || "base"].value;
-}
-
-export function shadow(theme: Theme) {
-  return {
-    blur: 16,
-    color: chroma("black").alpha(theme.shadowAlpha.value).hex(),
-    offset: [0, 2],
-  };
-}

styles/styleTree/projectPanel.ts 🔗

@@ -1,37 +0,0 @@
-import Theme from "../themes/theme";
-import { Color } from "../utils/color";
-import { panel } from "./app";
-import { backgroundColor, iconColor, text, TextColor } from "./components";
-
-export default function projectPanel(theme: Theme) {
-  function entry(theme: Theme, textColor: TextColor, background?: Color) {
-    return {
-      height: 22,
-      background,
-      iconColor: iconColor(theme, "muted"),
-      iconSize: 8,
-      iconSpacing: 8,
-      text: text(theme, "mono", textColor, { size: "sm" }),
-    };
-  }
-
-  return {
-    ...panel,
-    entry: entry(theme, "secondary"),
-    hoveredEntry: entry(
-      theme,
-      "secondary",
-      backgroundColor(theme, 300, "hovered")
-    ),
-    selectedEntry: entry(theme, "primary"),
-    hoveredSelectedEntry: entry(
-      theme, 
-      "primary", 
-      backgroundColor(theme, 300, "hovered")
-    ),
-    padding: {
-      top: 6,
-      left: 12,
-    },
-  };
-}

styles/styleTree/search.ts 🔗

@@ -1,79 +0,0 @@
-import Theme from "../themes/theme";
-import { backgroundColor, border, player, text } from "./components";
-
-export default function search(theme: Theme) {
-  const optionButton = {
-    ...text(theme, "mono", "secondary"),
-    background: backgroundColor(theme, 300),
-    cornerRadius: 6,
-    border: border(theme, "primary"),
-    margin: {
-      left: 1,
-      right: 1,
-    },
-    padding: {
-      bottom: 1,
-      left: 6,
-      right: 6,
-      top: 1,
-    },
-  };
-
-  const editor = {
-    background: backgroundColor(theme, 500),
-    cornerRadius: 6,
-    minWidth: 200,
-    maxWidth: 500,
-    placeholderText: text(theme, "mono", "placeholder"),
-    selection: player(theme, 1).selection,
-    text: text(theme, "mono", "primary"),
-    border: border(theme, "primary"),
-    margin: {
-      right: 5,
-    },
-    padding: {
-      top: 3,
-      bottom: 3,
-      left: 14,
-      right: 14,
-    },
-  };
-
-  return {
-    matchBackground: theme.editor.highlight.match.value,
-    tabIconSpacing: 4,
-    tabIconWidth: 14,
-    activeHoveredOptionButton: {
-      ...optionButton,
-      background: backgroundColor(theme, 100),
-    },
-    activeOptionButton: {
-      ...optionButton,
-      background: backgroundColor(theme, 100),
-    },
-    editor,
-    hoveredOptionButton: {
-      ...optionButton,
-      background: backgroundColor(theme, 100),
-    },
-    invalidEditor: {
-      ...editor,
-      border: border(theme, "error"),
-    },
-    matchIndex: {
-      ...text(theme, "mono", "muted"),
-      padding: 6,
-    },
-    optionButton,
-    optionButtonGroup: {
-      padding: {
-        left: 2,
-        right: 2,
-      },
-    },
-    resultsStatus: {
-      ...text(theme, "mono", "primary"),
-      size: 18,
-    },
-  };
-}

styles/styleTree/selectorModal.ts 🔗

@@ -1,59 +0,0 @@
-import Theme from "../themes/theme";
-import { backgroundColor, border, player, shadow, text } from "./components";
-
-export default function selectorModal(theme: Theme): Object {
-  const item = {
-    padding: {
-      bottom: 4,
-      left: 16,
-      right: 16,
-      top: 4,
-    },
-    cornerRadius: 6,
-    text: text(theme, "sans", "secondary"),
-    highlightText: text(theme, "sans", "feature", { weight: "bold" }),
-  };
-
-  const activeItem = {
-    ...item,
-    background: backgroundColor(theme, 300, "active"),
-    text: text(theme, "sans", "primary"),
-  };
-
-  return {
-    background: backgroundColor(theme, 300),
-    cornerRadius: 6,
-    padding: 8,
-    item,
-    activeItem,
-    border: border(theme, "primary"),
-    empty: {
-      text: text(theme, "sans", "muted"),
-      padding: {
-        bottom: 4,
-        left: 16,
-        right: 16,
-        top: 8,
-      },
-    },
-    inputEditor: {
-      background: backgroundColor(theme, 500),
-      corner_radius: 6,
-      placeholderText: text(theme, "sans", "placeholder"),
-      selection: player(theme, 1).selection,
-      text: text(theme, "mono", "primary"),
-      border: border(theme, "secondary"),
-      padding: {
-        bottom: 7,
-        left: 16,
-        right: 16,
-        top: 7,
-      },
-    },
-    margin: {
-      bottom: 52,
-      top: 52,
-    },
-    shadow: shadow(theme),
-  };
-}

styles/styleTree/workspace.ts 🔗

@@ -1,151 +0,0 @@
-import Theme from "../themes/theme";
-import { backgroundColor, border, iconColor, text } from "./components";
-
-export default function workspace(theme: Theme) {
-  const signInPrompt = {
-    ...text(theme, "sans", "secondary"),
-    size: 13,
-    underline: true,
-    padding: {
-      right: 8,
-    },
-  };
-
-  const tab = {
-    height: 32,
-    background: backgroundColor(theme, 300),
-    iconClose: iconColor(theme, "muted"),
-    iconCloseActive: iconColor(theme, "active"),
-    iconConflict: iconColor(theme, "warning"),
-    iconDirty: iconColor(theme, "info"),
-    iconWidth: 8,
-    spacing: 10,
-    text: text(theme, "mono", "secondary", { size: "sm" }),
-    border: border(theme, "primary", {
-      left: true,
-      bottom: true,
-      overlay: true,
-    }),
-    padding: {
-      left: 12,
-      right: 12,
-    },
-  };
-
-  const activeTab = {
-    ...tab,
-    background: backgroundColor(theme, 500),
-    text: text(theme, "mono", "active", { size: "sm" }),
-    border: {
-      ...tab.border,
-      bottom: false,
-    },
-  };
-
-  const sidebarItem = {
-    height: 32,
-    iconColor: iconColor(theme, "secondary"),
-    iconSize: 18,
-  };
-  const sidebar = {
-    width: 30,
-    background: backgroundColor(theme, 300),
-    border: border(theme, "primary", { right: true }),
-    item: sidebarItem,
-    activeItem: {
-      ...sidebarItem,
-      iconColor: iconColor(theme, "active"),
-    },
-    resizeHandle: {
-      background: border(theme, "primary").color,
-      padding: {
-        left: 1,
-      },
-    },
-  };
-
-  return {
-    background: backgroundColor(theme, 300),
-    leaderBorderOpacity: 0.7,
-    leaderBorderWidth: 2.0,
-    tab,
-    activeTab,
-    leftSidebar: {
-      ...sidebar,
-      border: border(theme, "primary", { right: true }),
-    },
-    rightSidebar: {
-      ...sidebar,
-      border: border(theme, "primary", { left: true }),
-    },
-    paneDivider: {
-      color: border(theme, "primary").color,
-      width: 1,
-    },
-    status_bar: {
-      height: 24,
-      itemSpacing: 8,
-      padding: {
-        left: 6,
-        right: 6,
-      },
-      cursorPosition: text(theme, "sans", "muted"),
-      diagnosticMessage: text(theme, "sans", "muted"),
-      lspMessage: text(theme, "sans", "muted"),
-    },
-    titlebar: {
-      avatarWidth: 18,
-      height: 32,
-      background: backgroundColor(theme, 100),
-      shareIconColor: iconColor(theme, "secondary"),
-      shareIconActiveColor: iconColor(theme, "active"),
-      title: text(theme, "sans", "primary"),
-      avatar: {
-        cornerRadius: 10,
-        border: {
-          color: "#00000088",
-          width: 1,
-        },
-      },
-      avatarRibbon: {
-        height: 3,
-        width: 12,
-        // TODO: The background for this ideally should be 
-        // set with a token, not hardcoded in rust
-      },
-      border: border(theme, "primary", { bottom: true }),
-      signInPrompt,
-      hoveredSignInPrompt: {
-        ...signInPrompt,
-        ...text(theme, "mono", "active"),
-        size: 13,
-      },
-      offlineIcon: {
-        color: iconColor(theme, "secondary"),
-        width: 16,
-        padding: {
-          right: 4,
-        },
-      },
-      outdatedWarning: {
-        ...text(theme, "sans", "warning"),
-        size: 13,
-      },
-    },
-    toolbar: {
-      height: 34,
-      background: backgroundColor(theme, 500),
-      border: border(theme, "secondary", { bottom: true }),
-      itemSpacing: 8,
-      padding: { left: 16, right: 8, top: 4, bottom: 4 },
-    },
-    breadcrumbs: {
-      ...text(theme, "mono", "secondary"),
-      padding: { left: 6 },
-    },
-    disconnectedOverlay: {
-      ...text(theme, "sans", "active"),
-      background: "#000000aa",
-    },
-  };
-}

styles/themes/light.ts 🔗

@@ -1,273 +0,0 @@
-import { colors, fontWeights, NumberToken } from "../tokens";
-import Theme, { Syntax } from "./theme";
-
-// TODO: Replace with light values
-
-const backgroundColor = {
-  100: {
-    base: colors.neutral[100],
-    hovered: colors.neutral[150],
-    active: colors.neutral[200],
-    focused: colors.neutral[150],
-  },
-  300: {
-    base: colors.neutral[50],
-    hovered: colors.neutral[100],
-    active: colors.neutral[150],
-    focused: colors.neutral[100],
-  },
-  500: {
-    base: colors.neutral[0],
-    hovered: colors.neutral[25],
-    active: colors.neutral[50],
-    focused: colors.neutral[75],
-  },
-  ok: {
-    base: colors.green[100],
-    hovered: colors.green[100],
-    active: colors.green[100],
-    focused: colors.green[100],
-  },
-  error: {
-    base: colors.red[100],
-    hovered: colors.red[100],
-    active: colors.red[100],
-    focused: colors.red[100],
-  },
-  warning: {
-    base: colors.yellow[100],
-    hovered: colors.yellow[100],
-    active: colors.yellow[100],
-    focused: colors.yellow[100],
-  },
-  info: {
-    base: colors.blue[100],
-    hovered: colors.blue[100],
-    active: colors.blue[100],
-    focused: colors.blue[100],
-  },
-};
-
-const borderColor = {
-  primary: colors.neutral[200],
-  secondary: colors.neutral[100],
-  muted: colors.neutral[50],
-  focused: colors.neutral[100],
-  active: colors.neutral[250],
-  ok: colors.green[200],
-  error: colors.red[200],
-  warning: colors.yellow[200],
-  info: colors.blue[200],
-};
-
-const textColor = {
-  primary: colors.neutral[750],
-  secondary: colors.neutral[600],
-  muted: colors.neutral[450],
-  placeholder: colors.neutral[300],
-  active: colors.neutral[900],
-  feature: colors.blue[500],
-  ok: colors.green[500],
-  error: colors.red[500],
-  warning: colors.yellow[500],
-  info: colors.blue[500],
-};
-
-const iconColor = {
-  primary: colors.neutral[300],
-  secondary: colors.neutral[500],
-  muted: colors.neutral[600],
-  placeholder: colors.neutral[700],
-  active: colors.neutral[900],
-  feature: colors.sky[600],
-  ok: colors.green[600],
-  error: colors.red[600],
-  warning: colors.yellow[400],
-  info: colors.blue[600],
-};
-
-const player = {
-  1: {
-    baseColor: colors.blue[600],
-    cursorColor: colors.blue[500],
-    selectionColor: colors.blue[100],
-    borderColor: colors.blue[500],
-  },
-  2: {
-    baseColor: colors.lime[500],
-    cursorColor: colors.lime[500],
-    selectionColor: colors.lime[100],
-    borderColor: colors.lime[500],
-  },
-  3: {
-    baseColor: colors.indigo[500],
-    cursorColor: colors.indigo[500],
-    selectionColor: colors.indigo[100],
-    borderColor: colors.indigo[500],
-  },
-  4: {
-    baseColor: colors.orange[500],
-    cursorColor: colors.orange[500],
-    selectionColor: colors.orange[100],
-    borderColor: colors.orange[500],
-  },
-  5: {
-    baseColor: colors.purple[500],
-    cursorColor: colors.purple[500],
-    selectionColor: colors.purple[100],
-    borderColor: colors.purple[500],
-  },
-  6: {
-    baseColor: colors.teal[400],
-    cursorColor: colors.teal[400],
-    selectionColor: colors.teal[100],
-    borderColor: colors.teal[400],
-  },
-  7: {
-    baseColor: colors.pink[400],
-    cursorColor: colors.pink[400],
-    selectionColor: colors.pink[100],
-    borderColor: colors.pink[400],
-  },
-  8: {
-    baseColor: colors.yellow[400],
-    cursorColor: colors.yellow[400],
-    selectionColor: colors.yellow[100],
-    borderColor: colors.yellow[400],
-  },
-};
-
-// TODO: Fixup
-const editor = {
-  background: backgroundColor[500].base,
-  indent_guide: borderColor.muted,
-  indent_guide_active: borderColor.secondary,
-  line: {
-    active: backgroundColor[500].active,
-    highlighted: backgroundColor[500].active,
-    inserted: backgroundColor.ok.active,
-    deleted: backgroundColor.error.active,
-    modified: backgroundColor.info.active,
-  },
-  highlight: {
-    selection: player[1].selectionColor,
-    occurrence: backgroundColor[500].active,
-    activeOccurrence: colors.neutral[0],
-    matchingBracket: colors.neutral[0],
-    match: colors.neutral[0],
-    activeMatch: colors.neutral[0],
-    related: colors.neutral[0],
-  },
-  gutter: {
-    primary: colors.neutral[300],
-    active: textColor.active,
-  },
-};
-
-const syntax: Syntax = {
-  primary: {
-    color: colors.neutral[750],
-    weight: fontWeights.normal,
-  },
-  comment: {
-    color: colors.neutral[600],
-    weight: fontWeights.normal,
-  },
-  punctuation: {
-    color: colors.neutral[700],
-    weight: fontWeights.normal,
-  },
-  constant: {
-    color: colors.neutral[700],
-    weight: fontWeights.normal,
-  },
-  keyword: {
-    color: colors.blue[800],
-    weight: fontWeights.normal,
-  },
-  function: {
-    color: colors.green[600],
-    weight: fontWeights.normal,
-  },
-  type: {
-    color: colors.teal[600],
-    weight: fontWeights.normal,
-  },
-  variant: {
-    color: colors.sky[600],
-    weight: fontWeights.normal,
-  },
-  property: {
-    color: colors.blue[700],
-    weight: fontWeights.normal,
-  },
-  enum: {
-    color: colors.orange[600],
-    weight: fontWeights.normal,
-  },
-  operator: {
-    color: colors.orange[600],
-    weight: fontWeights.normal,
-  },
-  string: {
-    color: colors.orange[600],
-    weight: fontWeights.normal,
-  },
-  number: {
-    color: colors.teal[500],
-    weight: fontWeights.normal,
-  },
-  boolean: {
-    color: colors.amber[600],
-    weight: fontWeights.normal,
-  },
-  predictive: {
-    color: textColor.muted,
-    weight: fontWeights.normal,
-  },
-  title: {
-    color: colors.sky[500],
-    weight: fontWeights.bold,
-  },
-  emphasis: {
-    color: textColor.active,
-    weight: fontWeights.normal,
-  },
-  emphasisStrong: {
-    color: textColor.active,
-    weight: fontWeights.bold,
-  },
-  linkUrl: {
-    color: colors.teal[500],
-    weight: fontWeights.normal,
-    // TODO: add underline
-  },
-  linkText: {
-    color: colors.orange[500],
-    weight: fontWeights.normal,
-    // TODO: add italic
-  },
-  listMarker: {
-    color: colors.sky[400],
-    weight: fontWeights.normal,
-  },
-};
-
-const shadowAlpha: NumberToken = {
-  value: 0.12,
-  type: "number",
-};
-
-const theme: Theme = {
-  name: "light",
-  backgroundColor,
-  borderColor,
-  textColor,
-  iconColor,
-  editor,
-  syntax,
-  player,
-  shadowAlpha,
-};
-
-export default theme;

styles/utils/color.ts 🔗

@@ -1,44 +0,0 @@
-import chroma, { Scale } from "chroma-js";
-
-export type Color = string;
-export type ColorRampStep = { value: Color; type: "color"; step: number };
-export type ColorRamp = {
-  [index: number]: ColorRampStep;
-};
-
-export function colorRamp(
-  color: Color | [Color, Color],
-  options?: { steps?: number; increment?: number; }
-): ColorRamp {
-  let scale: Scale;
-  if (Array.isArray(color)) {
-    const [startColor, endColor] = color;
-    scale = chroma.scale([startColor, endColor]);
-  } else {
-    let hue = Math.round(chroma(color).hsl()[0]);
-    let startColor = chroma.hsl(hue, 0.88, 0.96);
-    let endColor = chroma.hsl(hue, 0.68, 0.12);
-    scale = chroma
-      .scale([startColor, color, endColor])
-      .domain([0, 0.5, 1])
-      .mode("hsl")
-      .gamma(1)
-      // .correctLightness(true)
-      .padding([0, 0]);
-  }
-
-  const ramp: ColorRamp = {};
-  const steps = options?.steps || 10;
-  const increment = options?.increment || 100;
-
-  scale.colors(steps, "hex").forEach((color, ix) => {
-    const step = ix * increment;
-    ramp[step] = {
-      value: color,
-      step,
-      type: "color",
-    };
-  });
-
-  return ramp;
-}

styles/utils/decamelizeTree.ts 🔗

@@ -1,21 +0,0 @@
-import { snakeCase } from "case-anything";
-
-export default function decamelizeTree(object: { [key: string]: any }) {
-  const snakeObject: { [key: string]: any } = {};
-  for (const key in object) {
-    snakeObject[snakeCase(key)] = decamelizeValue(object[key]);
-  }
-  return snakeObject;
-}
-
-function decamelizeValue(value: any): any {
-  if (typeof value === "object") {
-    if (Array.isArray(value)) {
-      return value.map(decamelizeValue);
-    } else {
-      return decamelizeTree(value);
-    }
-  } else {
-    return value;
-  }
-}