~exprez135/mailspring-libre

75c664d1b984829c078b6fbaf3bf5757e114ce03 — Ben Gotow 3 years ago 22867f1
Fix or downgrade remaining eslint warnings to make Travis CI builds succeed
M .eslintrc => .eslintrc +11 -2
@@ 18,7 18,7 @@
    "node": true,
    "jasmine": true
  },
  "plugins": ["react"],
  "plugins": ["react", "import", "jsx-a11y"],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended",


@@ 27,6 27,14 @@
    "prettier/@typescript-eslint"],
  "rules": {
    "no-cond-assign": 0,
    "no-console": 0,
    "no-constant-condition": "warn",
    "no-async-promise-executor": "warn",
    "import/first": 0,
    "import/no-dynamic-require": 0,
    "import/no-mutable-exports": 0,
    "jsx-a11y/tabindex-no-positive": 0,
    "jsx-a11y/label-has-for": 0,
    "@typescript-eslint/explicit-member-accessibility": 0,
    "@typescript-eslint/no-explicit-any": 0,
    "@typescript-eslint/explicit-function-return-type": 0,


@@ 43,7 51,8 @@
    "@typescript-eslint/no-object-literal-type-assertion": 0,
    "@typescript-eslint/array-type": 0,
    "@typescript-eslint/explicit-module-boundary-types": 0,
    "@typescript-eslint/no-empty-function": 0
    "@typescript-eslint/no-empty-function": 0,
    "@typescript-eslint/ban-types": "warn"
  },
  "settings": {
    "import/core-modules": [

M app/internal_packages/account-sidebar/lib/sidebar-section.ts => app/internal_packages/account-sidebar/lib/sidebar-section.ts +2 -2
@@ 106,7 106,7 @@ class SidebarSection {
    ];
    const items = [];

    for (var names of standardNames) {
    for (let names of standardNames) {
      names = Array.isArray(names) ? names : [names];
      const categories = CategoryStore.getCategoriesWithRoles(accounts, ...names);
      if (categories.length === 0) {


@@ 196,7 196,7 @@ class SidebarSection {
    const seenItems = {};
    for (const category of CategoryStore.userCategories(account)) {
      // https://regex101.com/r/jK8cC2/1
      var item, parentKey;
      let item, parentKey;
      const re = RegExpUtils.subcategorySplitRegex();
      const itemKey = category.displayName.replace(re, '/');


M app/internal_packages/composer-signature/lib/signature-photo-picker.tsx => app/internal_packages/composer-signature/lib/signature-photo-picker.tsx +2 -3
@@ 135,10 135,9 @@ export default class SignaturePhotoPicker extends React.Component<
        )
      );
      return;
    } finally {
      if (!this._isMounted) return;
      this.setState({ isUploading: false });
    }
    if (!this._isMounted) return;
    this.setState({ isUploading: false });

    this.props.onChange({
      target: { value: `${link}?t=${Date.now()}&msw=${width}&msh=${height}`, id: 'photoURL' },

M app/internal_packages/composer-signature/lib/signature-utils.ts => app/internal_packages/composer-signature/lib/signature-utils.ts +2 -3
@@ 4,6 4,7 @@ import { Value } from 'slate';
function numberOfTrailingBRs(text) {
  let count = 0;
  text = text.trim();
  // eslint-disable-next-line no-constant-condition
  while (true) {
    if (text.endsWith('<br/>')) {
      text = text.substr(0, text.length - 5);


@@ 66,9 67,7 @@ export function applySignature(body, signature) {
      additionalWhitespace = ''; // never add whitespace when we already have 2 spaces
    }

    return `${contentBefore}${additionalWhitespace}<signature id="${signature.id}">${
      signature.body
    }</signature>${contentAfter}`;
    return `${contentBefore}${additionalWhitespace}<signature id="${signature.id}">${signature.body}</signature>${contentAfter}`;
  } else {
    return newBody;
  }

M app/internal_packages/message-autoload-images/lib/autoload-images-store.ts => app/internal_packages/message-autoload-images/lib/autoload-images-store.ts +1 -1
@@ 29,7 29,7 @@ class AutoloadImagesStore extends MailspringStore {
    // - background: url(....)
    // - background: url(""...."")
    // - @import url(....)
    return /((?:src|background|placeholder|icon|poster|srcset)\s*=\s*['"]?(?=[cid:|\w*:\/\/])|(?::|@import)\s*url\(['"]?)+([^"')]*)/gi;
    return /((?:src|background|placeholder|icon|poster|srcset)\s*=\s*['"]?(?=[cid:|\w*://])|(?::|@import)\s*url\(['"]?)+([^"')]*)/gi;
  };

  getLinkTagRegexp = () => {

M app/internal_packages/thread-list/lib/thread-list-participants.tsx => app/internal_packages/thread-list/lib/thread-list-participants.tsx +4 -4
@@ 30,7 30,7 @@ class ThreadListParticipants extends React.Component<{ thread: ThreadWithMessage
    let accumulated = null;
    let accumulatedUnread = false;

    const flush = function () {
    const flush = function() {
      if (accumulated) {
        spans.push(
          <span key={spans.length} className={`unread-${accumulatedUnread}`}>


@@ 42,7 42,7 @@ class ThreadListParticipants extends React.Component<{ thread: ThreadWithMessage
      accumulatedUnread = false;
    };

    const accumulate = function (text, unread?: boolean) {
    const accumulate = function(text, unread?: boolean) {
      if (accumulated && unread && accumulatedUnread !== unread) {
        flush();
      }


@@ 59,7 59,7 @@ class ThreadListParticipants extends React.Component<{ thread: ThreadWithMessage
      if (spacer) {
        accumulate('...');
      } else {
        var short;
        let short = '';
        if (contact.name && contact.name.length > 0) {
          if (items.length > 1) {
            short = contact.displayName({


@@ 149,7 149,7 @@ class ThreadListParticipants extends React.Component<{ thread: ThreadWithMessage
    if (
      list.length === 0 &&
      (this.props.thread.participants != null ? this.props.thread.participants.length : undefined) >
      0
        0
    ) {
      list.push({ contact: this.props.thread.participants[0], unread: false });
    }

M app/internal_packages/thread-search/lib/thread-search-bar.tsx => app/internal_packages/thread-search/lib/thread-search-bar.tsx +1 -1
@@ 400,7 400,7 @@ class ThreadSearchBar extends Component<
                      e.preventDefault();
                    }}
                  >
                    {localized('Learn more')}
                    {localized('Learn more')} &gt;
                  </a>
                </div>
              )}

M app/src/components/scroll-region.tsx => app/src/components/scroll-region.tsx +1 -0
@@ 493,6 493,7 @@ export class ScrollRegion extends React.Component<
  _settleHeight = callback => {
    const contentNode = ReactDOM.findDOMNode(this.refs.content) as HTMLElement;
    let lastContentHeight = -1;
    // eslint-disable-next-line no-var
    var scrollIfSettled = () => {
      if (!this._mounted) {
        return;

M app/src/config-utils.ts => app/src/config-utils.ts +2 -0
@@ 1,3 1,5 @@
/* eslint-disable no-var */
/* eslint-disable prefer-rest-params */
const _ = require('underscore');
var isPlainObject, plus, splitKeyPath;
splitKeyPath = function(keyPath) {

M app/src/config.ts => app/src/config.ts +3 -0
@@ 1,3 1,6 @@
/* eslint-disable no-var */
/* eslint-disable no-constant-condition */
/* eslint-disable no-prototype-builtins */
/*
 * decaffeinate suggestions:
 * DS104: Avoid inline assignments

M app/src/dom-utils.ts => app/src/dom-utils.ts +1 -1
@@ 1,6 1,6 @@
import _ from 'underscore';

var DOMUtils = {
const DOMUtils = {
  findLastTextNode(node) {
    if (!node) {
      return null;

M app/src/flux/models/utils.ts => app/src/flux/models/utils.ts +2 -2
@@ 1,3 1,4 @@
/* eslint-disable no-var */
/*
 * decaffeinate suggestions:
 * DS207: Consider shorter variations of null checks


@@ 13,7 14,7 @@ import DatabaseObjectRegistry from '../../registries/database-object-registry';
export function waitFor(latch, options: { timeout?: number } = {}) {
  const timeout = options.timeout || 400;
  const expire = Date.now() + timeout;
  return new Promise(function(resolve, reject) {
  return new Promise<void>(function(resolve, reject) {
    var attempt = function() {
      if (Date.now() > expire) {
        return reject(new Error(`Utils.waitFor hit timeout (${timeout}ms) without firing.`));


@@ 406,7 407,6 @@ export function isEqual(
      console.log('isEqual is false', a, b, options);
    }
    return value;
  } else {
  }
  return value;
}

M app/src/flux/stores/feature-usage-store.tsx => app/src/flux/stores/feature-usage-store.tsx +2 -1
@@ 75,7 75,8 @@ class FeatureUsageStore extends MailspringStore {
  displayUpgradeModal(feature, lexicon) {
    //
    const featureData = this._dataForFeature(feature);
    let { headerText, rechargeText, iconUrl } = lexicon;
    const { iconUrl } = lexicon;
    let { headerText, rechargeText } = lexicon;

    if (!featureData.quota) {
      headerText = localized(`Uhoh - that's a pro feature!`);

M app/src/global/mailspring-store.ts => app/src/global/mailspring-store.ts +1 -2
@@ 91,11 91,10 @@ export default class MailspringStore {

  fetchInitialState(listenable, defaultCallback = null) {
    defaultCallback = (defaultCallback && this[defaultCallback]) || defaultCallback;
    const me = this;
    if (defaultCallback instanceof Function && listenable.getInitialState instanceof Function) {
      const data = listenable.getInitialState();
      if (data && data.then instanceof Function) {
        data.then(() => defaultCallback.apply(me, arguments));
        data.then((...args) => defaultCallback.apply(this, args));
      } else {
        defaultCallback.call(this, data);
      }

M app/src/regexp-utils.ts => app/src/regexp-utils.ts +1 -0
@@ 52,6 52,7 @@ const RegExpUtils = {
  // http://www.regexpal.com/?fam=93928
  // NOTE: This does not match full urls with `http` protocol components.
  domainRegex() {
    // eslint-disable-next-line no-misleading-character-class
    return new RegExp(
      `^(?!:\\/\\/)([a-zA-Z${UnicodeEmailChars}0-9-_]+\\.)*[a-zA-Z${UnicodeEmailChars}0-9][a-zA-Z${UnicodeEmailChars}0-9-_]+\\.[a-zA-Z]{2,11}?`,
      'i'

M app/src/secondary-window-bootstrap.ts => app/src/secondary-window-bootstrap.ts +4 -1
@@ 1,11 1,14 @@
/* eslint import/first: 0 */
/* eslint prefer-spread: 0 */

// TODO: Remove when upgrading to Electron 4
import fs from 'fs';
fs.statSyncNoException = function(...args) {
  try {
    return fs.statSync.apply(fs, args);
  } catch (e) {}
  } catch (e) {
    // pass
  }
  return false;
};


M app/src/services/quoted-html-transformer.ts => app/src/services/quoted-html-transformer.ts +1 -1
@@ 5,7 5,7 @@ const { FIRST_ORDERED_NODE_TYPE } = XPathResult;
const isEmptyishTextContent = el => {
  // either '' or '---' (often left over from sig / confidentiality notice removal)
  const trimmed = el.textContent.trim();
  return trimmed === '' || /^\-+$/.test(trimmed);
  return trimmed === '' || /^-+$/.test(trimmed);
};

const looksLikeTrackingPixel = img => {

M app/src/services/sanitize-transformer.ts => app/src/services/sanitize-transformer.ts +1 -0
@@ 1,3 1,4 @@
/* eslint-disable no-prototype-builtins */
/*
The sanitizer implementation here is loosely based on
https://www.quaxio.com/html_white_listed_sanitizer/

M app/src/types/window-ext.d.ts => app/src/types/window-ext.d.ts +8 -8
@@ 4,24 4,24 @@ type RequestIdleCallbackOptions = {
};
type RequestIdleCallbackDeadline = {
  readonly didTimeout: boolean;
  timeRemaining: (() => number);
  timeRemaining: () => number;
};

export {};

declare global {
  var AppEnv: import('../app-env').default;
  
  let AppEnv: import('../app-env').default;

  interface Window {
    $m: any;
    AppEnv: import('../app-env').default;
    jasmine: any;
    
    requestIdleCallback: ((
      callback: ((deadline: RequestIdleCallbackDeadline) => void),

    requestIdleCallback: (
      callback: (deadline: RequestIdleCallbackDeadline) => void,
      opts?: RequestIdleCallbackOptions
    ) => RequestIdleCallbackHandle);
    ) => RequestIdleCallbackHandle;

    cancelIdleCallback: ((handle: RequestIdleCallbackHandle) => void);
    cancelIdleCallback: (handle: RequestIdleCallbackHandle) => void;
  }
}

M app/src/window-bootstrap.ts => app/src/window-bootstrap.ts +4 -2
@@ 1,11 1,13 @@
/* eslint import/first: 0 */

/* eslint prefer-spread: 0 */
// TODO: Remove when upgrading to Electron 4
import fs from 'fs';
fs.statSyncNoException = function(...args) {
  try {
    return fs.statSync.apply(fs, args);
  } catch (e) {}
  } catch (e) {
    // pass
  }
  return false;
};


M package-lock.json => package-lock.json +348 -75
@@ 70,6 70,23 @@
        }
      }
    },
    "@babel/runtime": {
      "version": "7.12.5",
      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz",
      "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==",
      "requires": {
        "regenerator-runtime": "^0.13.4"
      }
    },
    "@babel/runtime-corejs3": {
      "version": "7.12.5",
      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz",
      "integrity": "sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ==",
      "requires": {
        "core-js-pure": "^3.0.0",
        "regenerator-runtime": "^0.13.4"
      }
    },
    "@electron/get": {
      "version": "1.7.6",
      "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.7.6.tgz",


@@ 358,6 375,11 @@
      "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
      "dev": true
    },
    "@types/json5": {
      "version": "0.0.29",
      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4="
    },
    "@types/keytar": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/@types/keytar/-/keytar-4.4.0.tgz",


@@ 988,6 1010,15 @@
        "sprintf-js": "~1.0.2"
      }
    },
    "aria-query": {
      "version": "4.2.2",
      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
      "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
      "requires": {
        "@babel/runtime": "^7.10.2",
        "@babel/runtime-corejs3": "^7.10.2"
      }
    },
    "array-buffer-from-string": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/array-buffer-from-string/-/array-buffer-from-string-0.1.0.tgz",


@@ 1005,7 1036,6 @@
      "version": "3.1.2",
      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz",
      "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==",
      "dev": true,
      "requires": {
        "call-bind": "^1.0.0",
        "define-properties": "^1.1.3",


@@ 1020,6 1050,16 @@
      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
      "dev": true
    },
    "array.prototype.flat": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz",
      "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==",
      "requires": {
        "call-bind": "^1.0.0",
        "define-properties": "^1.1.3",
        "es-abstract": "^1.18.0-next.1"
      }
    },
    "array.prototype.flatmap": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz",


@@ 1071,6 1111,11 @@
      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
      "dev": true
    },
    "ast-types-flow": {
      "version": "0.0.7",
      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
      "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
    },
    "astral-regex": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",


@@ 1116,6 1161,16 @@
      "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=",
      "dev": true
    },
    "axe-core": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.1.tgz",
      "integrity": "sha512-5Kgy8Cz6LPC9DJcNb3yjAXTu3XihQgEdnIg50c//zOC/MyLP0Clg+Y8Sh9ZjjnvBrDZU4DgXS9C3T9r4/scGZQ=="
    },
    "axobject-query": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
      "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA=="
    },
    "babylon": {
      "version": "6.18.0",
      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",


@@ 1125,8 1180,7 @@
    "balanced-match": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
      "dev": true
      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
    },
    "base32-encode": {
      "version": "0.1.1",


@@ 1259,7 1313,6 @@
      "version": "1.1.11",
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
      "dev": true,
      "requires": {
        "balanced-match": "^1.0.0",
        "concat-map": "0.0.1"


@@ 1393,7 1446,6 @@
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
      "dev": true,
      "requires": {
        "function-bind": "^1.1.1",
        "get-intrinsic": "^1.0.2"


@@ 1574,8 1626,7 @@
    "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
      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
    },
    "concat-stream": {
      "version": "1.6.2",


@@ 1638,6 1689,11 @@
      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
      "dev": true
    },
    "contains-path": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo="
    },
    "copy-concurrently": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",


@@ 1659,6 1715,11 @@
      "dev": true,
      "optional": true
    },
    "core-js-pure": {
      "version": "3.8.3",
      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.8.3.tgz",
      "integrity": "sha512-V5qQZVAr9K0xu7jXg1M7qTEwuxUgqr7dUOezGaNa7i+Xn9oXAU/d1fzqD9ObuwpVQOaorO5s70ckyi1woP9lVA=="
    },
    "core-util-is": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",


@@ 1855,6 1916,11 @@
      "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
      "dev": true
    },
    "damerau-levenshtein": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
      "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug=="
    },
    "dashdash": {
      "version": "1.14.1",
      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",


@@ 1931,7 1997,6 @@
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
      "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=",
      "dev": true,
      "requires": {
        "object-keys": "^1.0.12"
      },


@@ 1939,8 2004,7 @@
        "object-keys": {
          "version": "1.1.1",
          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
          "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=",
          "dev": true
          "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4="
        }
      }
    },


@@ 2431,7 2495,6 @@
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
      "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=",
      "dev": true,
      "requires": {
        "is-arrayish": "^0.2.1"
      }


@@ 2440,7 2503,6 @@
      "version": "1.18.0-next.2",
      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz",
      "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==",
      "dev": true,
      "requires": {
        "call-bind": "^1.0.2",
        "es-to-primitive": "^1.2.1",


@@ 2461,8 2523,7 @@
        "object-keys": {
          "version": "1.1.1",
          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
          "dev": true
          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
        }
      }
    },


@@ 2470,7 2531,6 @@
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
      "dev": true,
      "requires": {
        "is-callable": "^1.1.4",
        "is-date-object": "^1.0.1",


@@ 2735,6 2795,197 @@
      "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==",
      "dev": true
    },
    "eslint-import-resolver-node": {
      "version": "0.3.4",
      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
      "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
      "requires": {
        "debug": "^2.6.9",
        "resolve": "^1.13.1"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "requires": {
            "ms": "2.0.0"
          }
        },
        "ms": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "resolve": {
          "version": "1.19.0",
          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
          "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
          "requires": {
            "is-core-module": "^2.1.0",
            "path-parse": "^1.0.6"
          }
        }
      }
    },
    "eslint-module-utils": {
      "version": "2.6.0",
      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
      "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
      "requires": {
        "debug": "^2.6.9",
        "pkg-dir": "^2.0.0"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "requires": {
            "ms": "2.0.0"
          }
        },
        "ms": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        }
      }
    },
    "eslint-plugin-import": {
      "version": "2.22.1",
      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
      "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
      "requires": {
        "array-includes": "^3.1.1",
        "array.prototype.flat": "^1.2.3",
        "contains-path": "^0.1.0",
        "debug": "^2.6.9",
        "doctrine": "1.5.0",
        "eslint-import-resolver-node": "^0.3.4",
        "eslint-module-utils": "^2.6.0",
        "has": "^1.0.3",
        "minimatch": "^3.0.4",
        "object.values": "^1.1.1",
        "read-pkg-up": "^2.0.0",
        "resolve": "^1.17.0",
        "tsconfig-paths": "^3.9.0"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "requires": {
            "ms": "2.0.0"
          }
        },
        "doctrine": {
          "version": "1.5.0",
          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
          "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
          "requires": {
            "esutils": "^2.0.2",
            "isarray": "^1.0.0"
          }
        },
        "find-up": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
          "requires": {
            "locate-path": "^2.0.0"
          }
        },
        "isarray": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "load-json-file": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
          "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
          "requires": {
            "graceful-fs": "^4.1.2",
            "parse-json": "^2.2.0",
            "pify": "^2.0.0",
            "strip-bom": "^3.0.0"
          }
        },
        "ms": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "path-type": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
          "requires": {
            "pify": "^2.0.0"
          }
        },
        "read-pkg": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
          "requires": {
            "load-json-file": "^2.0.0",
            "normalize-package-data": "^2.3.2",
            "path-type": "^2.0.0"
          }
        },
        "read-pkg-up": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
          "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
          "requires": {
            "find-up": "^2.0.0",
            "read-pkg": "^2.0.0"
          }
        },
        "resolve": {
          "version": "1.19.0",
          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
          "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
          "requires": {
            "is-core-module": "^2.1.0",
            "path-parse": "^1.0.6"
          }
        },
        "strip-bom": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
        }
      }
    },
    "eslint-plugin-jsx-a11y": {
      "version": "6.4.1",
      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz",
      "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==",
      "requires": {
        "@babel/runtime": "^7.11.2",
        "aria-query": "^4.2.2",
        "array-includes": "^3.1.1",
        "ast-types-flow": "^0.0.7",
        "axe-core": "^4.0.2",
        "axobject-query": "^2.2.0",
        "damerau-levenshtein": "^1.0.6",
        "emoji-regex": "^9.0.0",
        "has": "^1.0.3",
        "jsx-ast-utils": "^3.1.0",
        "language-tags": "^1.0.5"
      },
      "dependencies": {
        "emoji-regex": {
          "version": "9.2.0",
          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz",
          "integrity": "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug=="
        }
      }
    },
    "eslint-plugin-react": {
      "version": "7.22.0",
      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz",


@@ 2876,8 3127,7 @@
    "esutils": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
      "dev": true
      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
    },
    "eventemitter2": {
      "version": "0.4.14",


@@ 3372,8 3622,7 @@
    "function-bind": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
      "dev": true
      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
    },
    "functional-red-black-tree": {
      "version": "1.0.1",


@@ 3443,7 3692,6 @@
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz",
      "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==",
      "dev": true,
      "requires": {
        "function-bind": "^1.1.1",
        "has": "^1.0.3",


@@ 3944,8 4192,7 @@
    "graceful-fs": {
      "version": "4.1.15",
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
      "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA=",
      "dev": true
      "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA="
    },
    "grunt": {
      "version": "0.4.5",


@@ 4338,7 4585,6 @@
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
      "dev": true,
      "requires": {
        "function-bind": "^1.1.1"
      }


@@ 4361,8 4607,7 @@
    "has-symbols": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
      "dev": true
      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
    },
    "has-unicode": {
      "version": "2.0.1",


@@ 4403,8 4648,7 @@
    "hosted-git-info": {
      "version": "2.7.1",
      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
      "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=",
      "dev": true
      "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc="
    },
    "htmlparser2": {
      "version": "3.10.1",


@@ 4662,20 4906,17 @@
    "is-arrayish": {
      "version": "0.2.1",
      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
      "dev": true
      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
    },
    "is-callable": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
      "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
      "dev": true
      "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA=="
    },
    "is-core-module": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
      "dev": true,
      "requires": {
        "has": "^1.0.3"
      }


@@ 4683,8 4924,7 @@
    "is-date-object": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
      "dev": true
      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
    },
    "is-extglob": {
      "version": "2.1.1",


@@ 4746,8 4986,7 @@
    "is-negative-zero": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
      "dev": true
      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
    },
    "is-number": {
      "version": "7.0.0",


@@ 4765,7 5004,6 @@
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
      "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
      "dev": true,
      "requires": {
        "has-symbols": "^1.0.1"
      }


@@ 4780,14 5018,12 @@
    "is-string": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
      "dev": true
      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ=="
    },
    "is-symbol": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
      "dev": true,
      "requires": {
        "has-symbols": "^1.0.1"
      }


@@ 4959,6 5195,14 @@
      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
      "dev": true
    },
    "json5": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
      "requires": {
        "minimist": "^1.2.0"
      }
    },
    "jsonfile": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",


@@ 4996,7 5240,6 @@
      "version": "3.2.0",
      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz",
      "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==",
      "dev": true,
      "requires": {
        "array-includes": "^3.1.2",
        "object.assign": "^4.1.2"


@@ 5026,6 5269,19 @@
        "graceful-fs": "^4.1.9"
      }
    },
    "language-subtag-registry": {
      "version": "0.3.21",
      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz",
      "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg=="
    },
    "language-tags": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
      "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
      "requires": {
        "language-subtag-registry": "~0.3.2"
      }
    },
    "less": {
      "version": "1.5.1",
      "resolved": "https://registry.npmjs.org/less/-/less-1.5.1.tgz",


@@ 5117,7 5373,6 @@
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
      "dev": true,
      "requires": {
        "p-locate": "^2.0.0",
        "path-exists": "^3.0.0"


@@ 5541,7 5796,6 @@
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
      "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
      "dev": true,
      "requires": {
        "brace-expansion": "^1.1.7"
      }


@@ 5549,8 5803,7 @@
    "minimist": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
      "dev": true
      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
    },
    "minipass": {
      "version": "3.1.3",


@@ 5935,7 6188,6 @@
      "version": "2.5.0",
      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
      "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=",
      "dev": true,
      "requires": {
        "hosted-git-info": "^2.1.4",
        "resolve": "^1.10.0",


@@ 9994,8 10246,7 @@
    "object-inspect": {
      "version": "1.9.0",
      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
      "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==",
      "dev": true
      "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw=="
    },
    "object-keys": {
      "version": "0.4.0",


@@ 10007,7 10258,6 @@
      "version": "4.1.2",
      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
      "dev": true,
      "requires": {
        "call-bind": "^1.0.0",
        "define-properties": "^1.1.3",


@@ 10018,8 10268,7 @@
        "object-keys": {
          "version": "1.1.1",
          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
          "dev": true
          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
        }
      }
    },


@@ 10051,7 10300,6 @@
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz",
      "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==",
      "dev": true,
      "requires": {
        "call-bind": "^1.0.0",
        "define-properties": "^1.1.3",


@@ 10139,7 10387,6 @@
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
      "dev": true,
      "requires": {
        "p-try": "^1.0.0"
      }


@@ 10148,7 10395,6 @@
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
      "dev": true,
      "requires": {
        "p-limit": "^1.1.0"
      }


@@ 10156,8 10402,7 @@
    "p-try": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
      "dev": true
      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
    },
    "parallel-transform": {
      "version": "1.1.0",


@@ 10234,7 10479,6 @@
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
      "dev": true,
      "requires": {
        "error-ex": "^1.2.0"
      }


@@ 10255,8 10499,7 @@
    "path-exists": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
      "dev": true
      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
    },
    "path-is-absolute": {
      "version": "1.0.1",


@@ 10274,8 10517,7 @@
    "path-parse": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
      "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=",
      "dev": true
      "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw="
    },
    "path-type": {
      "version": "1.1.0",


@@ 10309,8 10551,7 @@
    "pify": {
      "version": "2.3.0",
      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
      "dev": true
      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
    },
    "pinkie": {
      "version": "2.0.4",


@@ 10327,6 10568,24 @@
        "pinkie": "^2.0.0"
      }
    },
    "pkg-dir": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
      "requires": {
        "find-up": "^2.1.0"
      },
      "dependencies": {
        "find-up": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
          "requires": {
            "locate-path": "^2.0.0"
          }
        }
      }
    },
    "plist": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz",


@@ 10604,6 10863,11 @@
        "strip-indent": "^1.0.1"
      }
    },
    "regenerator-runtime": {
      "version": "0.13.7",
      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
    },
    "regexp.prototype.flags": {
      "version": "1.3.1",
      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",


@@ 10668,7 10932,6 @@
      "version": "1.11.1",
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
      "integrity": "sha1-6hDYEQN2mC/vV434/DC5rDCgej4=",
      "dev": true,
      "requires": {
        "path-parse": "^1.0.6"
      }


@@ 10779,8 11042,7 @@
    "semver": {
      "version": "5.7.0",
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
      "integrity": "sha1-eQp89v6lRZuslhELKbYEEtyP+Ws=",
      "dev": true
      "integrity": "sha1-eQp89v6lRZuslhELKbYEEtyP+Ws="
    },
    "semver-compare": {
      "version": "1.0.0",


@@ 10940,7 11202,6 @@
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
      "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=",
      "dev": true,
      "requires": {
        "spdx-expression-parse": "^3.0.0",
        "spdx-license-ids": "^3.0.0"


@@ 10949,14 11210,12 @@
    "spdx-exceptions": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
      "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=",
      "dev": true
      "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc="
    },
    "spdx-expression-parse": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
      "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=",
      "dev": true,
      "requires": {
        "spdx-exceptions": "^2.1.0",
        "spdx-license-ids": "^3.0.0"


@@ 10965,8 11224,7 @@
    "spdx-license-ids": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz",
      "integrity": "sha1-dezRqI3owYTvAV6vtRtbSL/RG7E=",
      "dev": true
      "integrity": "sha1-dezRqI3owYTvAV6vtRtbSL/RG7E="
    },
    "speedometer": {
      "version": "0.1.4",


@@ 11059,7 11317,6 @@
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz",
      "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==",
      "dev": true,
      "requires": {
        "call-bind": "^1.0.0",
        "define-properties": "^1.1.3"


@@ 11069,7 11326,6 @@
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz",
      "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==",
      "dev": true,
      "requires": {
        "call-bind": "^1.0.0",
        "define-properties": "^1.1.3"


@@ 11502,6 11758,24 @@
        "utf8-byte-length": "^1.0.1"
      }
    },
    "tsconfig-paths": {
      "version": "3.9.0",
      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
      "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
      "requires": {
        "@types/json5": "^0.0.29",
        "json5": "^1.0.1",
        "minimist": "^1.2.0",
        "strip-bom": "^3.0.0"
      },
      "dependencies": {
        "strip-bom": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
        }
      }
    },
    "tslib": {
      "version": "1.14.1",
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",


@@ 11702,7 11976,6 @@
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
      "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=",
      "dev": true,
      "requires": {
        "spdx-correct": "^3.0.0",
        "spdx-expression-parse": "^3.0.0"

M package.json => package.json +2 -0
@@ 62,6 62,8 @@
    "eslint": "7.13.0",
    "eslint-config-prettier": "7.2.0",
    "eslint-plugin-react": "7.22.0",
    "eslint-plugin-import": "^2.22.1",
    "eslint-plugin-jsx-a11y": "^6.4.1",
    "fs-extra": "2.x.x",
    "fs-plus": "2.x.x",
    "gitbook-cli": "^2.3.2",