From d8f2cddb7429e0f4cc4127457de04a05f24d4123 Mon Sep 17 00:00:00 2001 From: aet Date: Sun, 2 Jan 2022 00:53:57 -0500 Subject: [PATCH] Add About screen, list of recently opened vaults, category filtering --- package.json | 15 +- packages/opvault.js/src/models/item.ts | 4 + packages/web/.gitignore | 3 +- packages/web/package.json | 23 +- .../scripts/build-third-party-license-info.js | 42 ++ packages/web/scripts/build.sh | 2 + packages/web/scripts/vite-babel.ts | 41 ++ packages/web/src/App.tsx | 6 +- packages/web/src/about/LicenseViewer.tsx | 65 ++ packages/web/src/about/index.tsx | 27 + .../web/src/components/FilteredVaultView.tsx | 198 ++++++ packages/web/src/components/ItemDates.tsx | 1 + .../src/components/ItemFieldContextMenu.tsx | 17 +- .../web/src/components/ItemFieldValue.tsx | 2 + packages/web/src/components/ItemList.tsx | 29 +- packages/web/src/components/Modal.tsx | 6 +- packages/web/src/i18n/texts.yml | 105 +++ packages/web/src/index.scss | 12 +- packages/web/src/pages/Vault.tsx | 162 +---- packages/web/src/pages/VaultPicker/Picker.tsx | 148 ++++ .../src/pages/{ => VaultPicker}/Unlock.tsx | 13 +- .../index.tsx} | 49 +- packages/web/src/settings/index.tsx | 2 +- packages/web/src/utils/localStorage.ts | 17 +- packages/web/src/vite-env.d.ts | 4 + packages/web/vite.config.ts | 3 +- pnpm-lock.yaml | 670 +++++++++--------- 27 files changed, 1108 insertions(+), 558 deletions(-) create mode 100755 packages/web/scripts/build-third-party-license-info.js create mode 100644 packages/web/scripts/vite-babel.ts create mode 100644 packages/web/src/about/LicenseViewer.tsx create mode 100644 packages/web/src/about/index.tsx create mode 100644 packages/web/src/components/FilteredVaultView.tsx create mode 100644 packages/web/src/pages/VaultPicker/Picker.tsx rename packages/web/src/pages/{ => VaultPicker}/Unlock.tsx (91%) rename packages/web/src/pages/{VaultPicker.tsx => VaultPicker/index.tsx} (59%) diff --git a/package.json b/package.json index 5091889..486da57 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "design": "marked -o design.html < design.md", "test": "node --expose-gc node_modules/mocha/bin/_mocha test/**/*.test.ts", "repl": "node -r ts-node/register/transpile-only src/repl.ts", + "dev": "cd packages/web && yarn dev", "bundle": "cd packages/web && yarn bundle" }, "devDependencies": { @@ -15,20 +16,20 @@ "@types/chai-as-promised": "^7.1.4", "@types/fs-extra": "^9.0.13", "@types/mocha": "github:whitecolor/mocha-types#da22474cf43f48a56c86f8c23a5a0ea36e295768", - "@types/node": "^16.11.9", + "@types/node": "^17.0.6", "@types/sinon": "^10.0.6", - "@types/sinon-chai": "^3.2.6", + "@types/sinon-chai": "^3.2.8", "@types/wicg-file-system-access": "^2020.9.4", - "@typescript-eslint/eslint-plugin": "5.7.0", - "@typescript-eslint/parser": "5.7.0", + "@typescript-eslint/eslint-plugin": "5.8.1", + "@typescript-eslint/parser": "5.8.1", "chai": "^4.3.4", "chai-as-promised": "^7.1.1", "chalk": "^4.1.2", - "eslint": "8.5.0", + "eslint": "8.6.0", "eslint-config-prettier": "8.3.0", "eslint-import-resolver-typescript": "2.5.0", "eslint-plugin-import": "2.25.3", - "eslint-plugin-react": "7.27.1", + "eslint-plugin-react": "7.28.0", "eslint-plugin-react-hooks": "4.3.0", "fs-extra": "^10.0.0", "marked": "^4.0.8", @@ -37,7 +38,7 @@ "prettier": "^2.5.1", "react": "^17.0.2", "react-dom": "^17.0.2", - "sass": "^1.45.0", + "sass": "^1.45.2", "sinon": "^12.0.1", "sinon-chai": "^3.7.0", "tslib": "^2.3.1", diff --git a/packages/opvault.js/src/models/item.ts b/packages/opvault.js/src/models/item.ts index 9734a67..7be6127 100644 --- a/packages/opvault.js/src/models/item.ts +++ b/packages/opvault.js/src/models/item.ts @@ -16,6 +16,7 @@ export interface EncryptedItem { tx: integer // Unix seconds updated: integer // Unix seconds uuid: string // 32 chars + fave: number trashed?: boolean } @@ -58,6 +59,9 @@ export class Item { } return this.#details! } + get fave() { + return this.#data.fave + } constructor(crypto: Crypto, data: EncryptedItem) { this.#crypto = crypto diff --git a/packages/web/.gitignore b/packages/web/.gitignore index b5f4ba9..d25eb5f 100644 --- a/packages/web/.gitignore +++ b/packages/web/.gitignore @@ -1,6 +1,7 @@ +src/third-party-licenses.json node_modules .DS_Store dist bundle *.local -*.yml.d.ts +*.yml.d.ts \ No newline at end of file diff --git a/packages/web/package.json b/packages/web/package.json index 6a95c3b..8c4f12b 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -6,31 +6,38 @@ "license": "GPL-3.0-only", "description": "OnePassword local vault viewer", "scripts": { - "dev": "vite", + "dev": "concurrently vite npm:start", "build": "vite build", "serve": "vite preview", "start": "./esbuild.js && NODE_ENV=development electron --enable-transparent-visuals --disable-gpu ./dist/main/index.js", "bundle": "./scripts/build.sh" }, - "devDependencies": { + "dependencies": { "@emotion/css": "^11.7.1", "@emotion/react": "^11.7.1", "@emotion/styled": "^11.6.0", + "buffer": "^6.0.3", + "path-browserify": "^1.0.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-icons": "^4.3.1", + "react-idle-timer": "4.6.4" + }, + "devDependencies": { + "@babel/core": "^7.16.7", + "@emotion/babel-plugin": "^11.7.2", "@rollup/plugin-yaml": "^3.1.0", "@types/react": "^17.0.37", "@types/react-dom": "^17.0.11", "@vitejs/plugin-react": "^1.1.3", - "buffer": "^6.0.3", + "@types/babel__core": "^7.1.18", + "concurrently": "^6.5.1", "electron": "^16.0.5", "electron-builder": "^22.14.5", "esbuild": "^0.14.5", "js-yaml": "^4.1.0", + "lodash": "^4.17.21", "opvault.js": "*", - "path-browserify": "^1.0.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-idle-timer": "4.6.4", - "react-icons": "^4.3.1", "sass": "^1.45.0", "typescript": "^4.5.4", "vite": "^2.7.3" diff --git a/packages/web/scripts/build-third-party-license-info.js b/packages/web/scripts/build-third-party-license-info.js new file mode 100755 index 0000000..96a9151 --- /dev/null +++ b/packages/web/scripts/build-third-party-license-info.js @@ -0,0 +1,42 @@ +#!/usr/bin/env node +const fs = require("fs") +const { resolve } = require("path") + +const root = resolve(__dirname, "../../..") +const packages = [ + root, + resolve(root, "packages/web"), + resolve(root, "packages/opvault.js"), +] + +const readJSON = path => JSON.parse(fs.readFileSync(path, "utf-8")) +const infoMap = Object.fromEntries( + packages.flatMap(dir => { + const rootPkg = readJSON(resolve(dir, "package.json")) + const dependencies = Object.keys(rootPkg.dependencies || {}) + return dependencies.map(dependency => { + const pkgDir = resolve(dir, "node_modules", dependency) + const pkg = readJSON(resolve(pkgDir, "package.json")) + const licenseFile = fs + .readdirSync(pkgDir) + .filter(x => x.toLowerCase().startsWith("license")) + if (licenseFile.length !== 1) { + console.error(fs.readdirSync(pkgDir)) + throw new Error(`Cannot determine license file for ${pkg.name}`) + } + return [ + pkg.name, + { + name: pkg.name, + author: pkg.author?.name ?? pkg.author, + license: fs.readFileSync(resolve(pkgDir, licenseFile[0]), "utf-8"), + }, + ] + }) + }) +) + +fs.writeFileSync( + resolve(__dirname, "../src/third-party-licenses.json"), + JSON.stringify(infoMap, null, 2) +) diff --git a/packages/web/scripts/build.sh b/packages/web/scripts/build.sh index 0d1d640..b09a40b 100755 --- a/packages/web/scripts/build.sh +++ b/packages/web/scripts/build.sh @@ -1,5 +1,7 @@ #!/bin/sh npx vite build NODE_ENV=production ./esbuild.js +./scripts/build-i18n-yml-typedef.js +./scripts/build-third-party-license.js ./scripts/build-package-json.js ./node_modules/.bin/electron-builder build \ No newline at end of file diff --git a/packages/web/scripts/vite-babel.ts b/packages/web/scripts/vite-babel.ts new file mode 100644 index 0000000..0986098 --- /dev/null +++ b/packages/web/scripts/vite-babel.ts @@ -0,0 +1,41 @@ +import * as babel from "@babel/core" +import type { PluginOption, TransformResult } from "vite" + +const sourceRegex = /\.(j|t)sx?$/ + +export default function macrosPlugin(): PluginOption { + return { + name: "babel-macros", + enforce: "pre", + transform(source: string, filename: string) { + if (filename.includes("node_modules")) { + return undefined + } + if (!sourceRegex.test(filename)) { + return + } + const hasBabelMacro = source.includes('.macro"') + const hasEmotion = source.includes("@emotion") + if (!hasBabelMacro && !hasEmotion) { + return undefined + } + const result = babel.transformSync(source, { + filename, + parserOpts: { + plugins: ["jsx", "typescript", "decorators-legacy"], + }, + plugins: [ + hasBabelMacro && require.resolve("babel-plugin-macros"), + hasEmotion && require.resolve("@emotion/babel-plugin"), + ].filter(Boolean), + generatorOpts: { + decoratorsBeforeExport: true, + }, + babelrc: false, + configFile: false, + sourceMaps: true, + }) + return result as TransformResult | null + }, + } +} diff --git a/packages/web/src/App.tsx b/packages/web/src/App.tsx index 78e5646..4d166dd 100644 --- a/packages/web/src/App.tsx +++ b/packages/web/src/App.tsx @@ -48,9 +48,5 @@ export const App: React.FC = () => { ) } - return ( -
- -
- ) + return } diff --git a/packages/web/src/about/LicenseViewer.tsx b/packages/web/src/about/LicenseViewer.tsx new file mode 100644 index 0000000..b404351 --- /dev/null +++ b/packages/web/src/about/LicenseViewer.tsx @@ -0,0 +1,65 @@ +import styled from "@emotion/styled" +import { useEffect, useMemo, useState } from "react" +import { ClickableContainer } from "../components/ItemFieldValue" +import { scrollbar } from "../styles" + +const Container = styled.div` + display: flex; +` +const ListContainer = styled.div` + min-width: 150px; + ul { + list-style-type: none; + margin-block-start: 0; + padding-inline-start: 0; + } + li { + line-height: 1.6em; + } +` +const LicenseText = styled.div` + flex-grow: 1; + font-family: var(--monospace); + max-height: 575px; + overflow-y: scroll; + white-space: pre-wrap; +` + +export const LicenseView = () => { + const [licenseInfo, setLicenseInfo] = useState< + typeof import("../third-party-licenses.json") + >(() => ({} as any)) + const names = useMemo(() => Object.keys(licenseInfo), [licenseInfo]) + + const [selected, setSelected] = useState() + + useEffect(() => { + import("../third-party-licenses.json").then(json => setLicenseInfo(json.default)) + }, []) + + useEffect(() => { + setSelected(names[0]) + }, [names]) + + return ( + + +
    + {names.map(name => ( +
  • setSelected(name)} + > + {name} +
  • + ))} +
+
+ + + {licenseInfo[selected as any]?.license} + +
+ ) +} diff --git a/packages/web/src/about/index.tsx b/packages/web/src/about/index.tsx new file mode 100644 index 0000000..52cd1bb --- /dev/null +++ b/packages/web/src/about/index.tsx @@ -0,0 +1,27 @@ +import styled from "@emotion/styled" +import { Modal } from "../components/Modal" +import { useTranslate } from "../i18n" +import { LicenseView } from "./LicenseViewer" + +const Container = styled.div` + width: 800px; + min-height: 450px; +` +const LicenseSectionHeader = styled.h3` + margin-top: 0; +` + +export const About: React.FC<{ + show: boolean + onHide(): void +}> = ({ show, onHide }) => { + const t = useTranslate() + return ( + + + Licenses + + + + ) +} diff --git a/packages/web/src/components/FilteredVaultView.tsx b/packages/web/src/components/FilteredVaultView.tsx new file mode 100644 index 0000000..544438a --- /dev/null +++ b/packages/web/src/components/FilteredVaultView.tsx @@ -0,0 +1,198 @@ +import styled from "@emotion/styled" +import { useEffect, useMemo, useState } from "react" +import type { Item } from "opvault.js" +import { Category } from "opvault.js" +import { IoSearch } from "react-icons/io5" +import { ItemList } from "../components/ItemList" +import { ItemView } from "../components/Item" +import { reactIconClass } from "../components/CategoryIcon" +import { useTranslate } from "../i18n/index" +import { scrollbar } from "../styles" + +const ListContainer = styled.div` + border-right: 1px solid var(--border-color); + width: 350px; + margin-right: 10px; + overflow-y: scroll; + overflow-y: overlay; + overflow-x: hidden; + @media (prefers-color-scheme: dark) { + background: #202020; + border-right-color: transparent; + } +` +const ItemContainer = styled.div` + width: calc(100% - 300px); + overflow: hidden; +` +const SearchContainer = styled.div` + text-align: center; + position: relative; + flex-grow: 1; + margin: 10px 0; + margin-right: 10px; +` +const SortContainer = styled.div` + display: flex; + margin: 10px 0; +` +const CategorySelect = styled.select` + width: 50%; + margin-left: 10px; + margin-right: 5px; +` +const SortSelect = styled.select` + width: calc(50% - 25px); +` + +const SearchInput = styled.input` + --margin: 10px; + width: calc(100% - var(--margin) * 2 + 9px); + margin: 0 var(--margin); + padding-left: 2em !important; +` +const SearchIcon = styled(IoSearch)` + position: absolute; + top: 9px; + left: 20px; +` + +const enum SortBy { + Name, + CreatedAt, + UpdatedAt, +} + +export const FilteredVaultView: React.FC<{ items: Item[] }> = ({ items }) => { + const t = useTranslate() + const [item, setItem] = useState() + const [category, setCategory] = useState() + const [sortBy, setSortBy] = useState(SortBy.Name) + const [search, setSearch] = useState("") + + useEffect(() => { + setItem(undefined) + }, [items]) + + const compareFn = useMemo((): ((a: Item, b: Item) => number) => { + switch (sortBy) { + case SortBy.Name: + return (a, b) => (a.overview.title ?? "").localeCompare(b?.overview.title ?? "") + case SortBy.CreatedAt: + return (a, b) => b.createdAt - a.createdAt + case SortBy.UpdatedAt: + return (a, b) => b.updatedAt - a.updatedAt + } + }, [sortBy]) + + const sortedItem = useMemo(() => items.slice().sort(compareFn), [items, compareFn]) + + const filtered = useMemo(() => { + let items = sortedItem.filter(x => x.category !== Category.Tombstone) + if (category != null) { + items = items.filter(x => x.category === category) + } + + let res: Item[] = items + if (search) { + res = [] + for (const x of items) { + const compare = Math.max( + stringCompare(search, x.overview.title), + stringCompare(search, x.overview.ainfo) + ) as CompareResult + switch (compare) { + case CompareResult.NoMatch: + continue + case CompareResult.Includes: + res.push(x) + break + case CompareResult.Equals: + res.unshift(x) + break + } + } + } + return res + }, [sortedItem, search, category]) + + const categoryMap = useMemo( + (): [Category | undefined, string][] => [ + [undefined, t.label.category_all], + [Category.Login, t.label.category_login], + [Category.SecureNote, t.label.category_secure_note], + [Category.CreditCard, t.label.category_credit_card], + [Category.Identity, t.label.category_identity], + [Category.Password, t.label.category_password], + [Category.Membership, t.label.category_membership], + [Category.Database, t.label.category_database], + [Category.BankAccount, t.label.category_bank_account], + [Category.Email, t.label.category_email], + [Category.SoftwareLicense, t.label.category_software_license], + [Category.SSN, t.label.category_ssn], + [Category.Passport, t.label.category_passport], + [Category.OutdoorLicense, t.label.category_outdoor_license], + [Category.DriverLicense, t.label.category_driver_license], + [Category.Rewards, t.label.category_rewards], + [Category.Router, t.label.category_router], + [Category.Server, t.label.category_server], + ], + [t] + ) + + return ( + <> + + + setSearch(e.currentTarget.value)} + /> + + + + + setCategory((e.currentTarget.value as Category) || undefined)} + > + {categoryMap.map(([value, name]) => ( + + ))} + + + setSortBy(+e.currentTarget.value)}> + + + + + + + + + {item && } + + + ) +} + +enum CompareResult { + NoMatch, + Includes, + Equals, +} + +function stringCompare(search: string, source?: string) { + if (!search) return CompareResult.Includes + if (!source) return CompareResult.NoMatch + source = source.toLocaleLowerCase() + search = search.toLocaleUpperCase() + const includes = source.includes(search.toLocaleLowerCase()) + if (includes) { + return source.length === search.length ? CompareResult.Equals : CompareResult.Includes + } + return CompareResult.NoMatch +} diff --git a/packages/web/src/components/ItemDates.tsx b/packages/web/src/components/ItemDates.tsx index 8a76f21..b1be1b4 100644 --- a/packages/web/src/components/ItemDates.tsx +++ b/packages/web/src/components/ItemDates.tsx @@ -8,6 +8,7 @@ const Container = styled.div` font-size: 90%; line-height: 1.5em; opacity: 0.5; + user-select: none; ` export const ItemDates = memo<{ item: Item }>(({ item }) => { diff --git a/packages/web/src/components/ItemFieldContextMenu.tsx b/packages/web/src/components/ItemFieldContextMenu.tsx index 55d4367..15d84f6 100644 --- a/packages/web/src/components/ItemFieldContextMenu.tsx +++ b/packages/web/src/components/ItemFieldContextMenu.tsx @@ -4,10 +4,11 @@ import styled from "@emotion/styled" const Container = styled.menu` background-color: #fff; border-radius: 3px; - box-shadow: #0004 0px 1px 4px; + box-shadow: rgb(15 15 15 / 5%) 0px 0px 0px 1px, rgb(15 15 15 / 10%) 0px 3px 6px, + rgb(15 15 15 / 20%) 0px 9px 24px; left: 99%; margin-block-start: 0; - min-width: 180px; + min-width: 195px; padding-inline-start: 0; position: absolute; top: 0; @@ -33,17 +34,23 @@ const Separator = styled.div` const Item = styled.div` cursor: default; - font-size: 13px; + font-size: 14px; flex: 1 1 auto; display: flex; - height: 2.5em; + height: 2.3em; align-items: center; padding-left: 1em; padding-right: 5px; position: relative; + &:first-of-type { + border-radius: 3px 3px 0 0; + } + &:last-of-type { + border-radius: 0 0 3px 3px; + } &:hover { background-color: #ddd; - border-radius: 3px; + .item-field-context-menu { display: block; } diff --git a/packages/web/src/components/ItemFieldValue.tsx b/packages/web/src/components/ItemFieldValue.tsx index 5312268..b75d32e 100644 --- a/packages/web/src/components/ItemFieldValue.tsx +++ b/packages/web/src/components/ItemFieldValue.tsx @@ -17,6 +17,8 @@ const Container = styled.div` } ` +export { Container as ClickableContainer } + function useCopy(text: string) { const t = useTranslate() return useCallback(() => { diff --git a/packages/web/src/components/ItemList.tsx b/packages/web/src/components/ItemList.tsx index aebe9fb..aa39b97 100644 --- a/packages/web/src/components/ItemList.tsx +++ b/packages/web/src/components/ItemList.tsx @@ -2,6 +2,7 @@ import { memo } from "react" import styled from "@emotion/styled" import { cx } from "@emotion/css" import type { Item } from "opvault.js" +import { AiFillStar } from "react-icons/ai" import { CategoryIcon } from "./CategoryIcon" import { useTranslate } from "../i18n" import { ItemNoTitle } from "../styles" @@ -18,13 +19,13 @@ const List = styled.ol` padding: 0; ` const ItemView = styled.li` - border-radius: 5px; - display: grid; - padding: 5px 15px; - transition: background-color 0.1s; align-items: center; cursor: default; + display: grid; grid-template-columns: 35px 1fr; + padding: 5px 15px; + position: relative; + transition: background-color 0.1s; user-select: none; &:hover { background-color: var(--hover-background); @@ -47,10 +48,21 @@ const ItemDescription = styled.div` overflow: hidden; text-overflow: ellipsis; max-width: 230px; + &.empty { + opacity: 0.4; + } ` const Icon = styled(CategoryIcon)` font-size: 1.5em; ` +const Favorite = styled(AiFillStar)` + bottom: 10px; + display: inline-block; + fill: #fdcc0d; + left: 10px; + opacity: 0.9; + position: absolute; +` export const ItemList = memo(({ items, onSelect, selected }) => { const t = useTranslate() @@ -66,12 +78,17 @@ export const ItemList = memo(({ items, onSelect, selected }) => { trashed: item.isDeleted, })} > - +
+ + {!!item.fave && } +
{item.overview.title || {t.label.no_title}} - {item.overview.ainfo || " "} + + {item.overview.ainfo || "-"} +
))} diff --git a/packages/web/src/components/Modal.tsx b/packages/web/src/components/Modal.tsx index aaaae3d..1117fbc 100644 --- a/packages/web/src/components/Modal.tsx +++ b/packages/web/src/components/Modal.tsx @@ -25,7 +25,6 @@ const ModalContainer = styled.div` background: var(--page-background); box-shadow: rgba(0, 0, 0, 0.25) 0px 14px 28px, rgba(0, 0, 0, 0.22) 0px 10px 10px; border-radius: 5px; - max-width: 500px; margin: 0 auto; ` const ModalTitle = styled.div` @@ -41,8 +40,9 @@ const ModalContent = styled.div` export const Modal: React.FC<{ show: boolean title: string + maxWidth?: number onClose(): void -}> = ({ show, children, title, onClose }) => { +}> = ({ show, children, title, maxWidth = 700, onClose }) => { const onBackgroundClick = useCallback( e => { if (e.currentTarget === e.target) { @@ -61,7 +61,7 @@ export const Modal: React.FC<{ <> - + {title} {children} diff --git a/packages/web/src/i18n/texts.yml b/packages/web/src/i18n/texts.yml index ebde8a1..6aaf808 100644 --- a/packages/web/src/i18n/texts.yml +++ b/packages/web/src/i18n/texts.yml @@ -55,6 +55,106 @@ label: fr: Langue ja: 言語 + about_app: + en: About + fr: À propos + ja: バーション情報 + + category_all: + en: All + fr: Tous + ja: すべて + + category_login: + en: Login + fr: Connexion + ja: ログイン + + category_credit_card: + en: Credit Card + fr: Carte de crédit + ja: クレジットカード + + category_secure_note: + en: Secure Note + fr: Note sécurisée + ja: セキュアノート + + category_identity: + en: Identity + fr: Identité + ja: 個人情報 + + category_password: + en: Password + fr: Mot de passe + ja: パスワード + + category_tombstone: + en: Tombstone + fr: Corbeille + ja: ゴミ箱 + + category_software_license: + en: Software License + fr: Licence de logiciel + ja: ソフトウェアライセンス + + category_bank_account: + en: BankAccount + fr: Compte bancaire + ja: 銀行口座 + + category_database: + en: Database + fr: Base de données + ja: データベース + + category_driver_license: + en: Driver License + fr: Permis de conduire + ja: 運転免許 + + category_outdoor_license: + en: Outdoor License + fr: Permis de chasse ou pêche + ja: 遊漁券及び狩猟免許 + + category_membership: + en: Membership + fr: Adhésion + ja: 会員資格 + + category_passport: + en: Passport + fr: Passeport + ja: 旅券 + + category_rewards: + en: Rewards + fr: Programme de fidélité + ja: ポイントサービス + + category_ssn: + en: Social Security Numbers + fr: N° de sécurité sociale + ja: 社会保障番号 + + category_router: + en: Router + fr: Routeur sans fil + ja: Wi-Fiルーター + + category_server: + en: Server + fr: Serveur + ja: サーバー + + category_email: + en: Email + fr: Courriel + ja: メール + options: sort_by_name: en: Sort by Name @@ -133,6 +233,11 @@ action: fr: Avancer ja: 次に進む + clear_history: + en: Clear history + fr: Effacer l’historique + ja: 閲覧履歴を消す + tips: automatically_lock_after_inactivity: en: Automatically lock after inactivity diff --git a/packages/web/src/index.scss b/packages/web/src/index.scss index 39bfb49..0b23194 100644 --- a/packages/web/src/index.scss +++ b/packages/web/src/index.scss @@ -19,10 +19,10 @@ body { --titlebar-height: 46px; --titlebar-height: 0px; --label-background: #ddd; - --selected-background: #c9c9c9; + --selected-background: #d5d5d5; --hover-background: #ddd; - --border-color: #ddd; - --monospace: D2Coding, source-code-pro, Menlo, Monaco, Consolas, "Courier New", + --border-color: #e3e3e3; + --monospace: D2Coding, "source-code-pro", Menlo, Monaco, Consolas, "Courier New", monospace; } @@ -69,7 +69,7 @@ input { @mixin input { @include scheme(background-color, #fff, #2d2d2d); border-radius: 6px; - border: 1px solid; + border: 1px solid #fff; @include scheme(border-color, #cdc7c2, #1b1b1b); transition: 0.1s; &:focus { @@ -83,7 +83,6 @@ input[type="number"], input[type="password"] { @include input; border-radius: 6px; - border: 1px solid; color: inherit; outline: none; padding: 7px 8px; @@ -110,7 +109,8 @@ input[type="checkbox" i] { } button, -select { +select, +.button { @include scheme(background-color, #f6f5f4, #333); border-radius: 4px; border: 1px solid; diff --git a/packages/web/src/pages/Vault.tsx b/packages/web/src/pages/Vault.tsx index 7f842d6..0679931 100644 --- a/packages/web/src/pages/Vault.tsx +++ b/packages/web/src/pages/Vault.tsx @@ -1,17 +1,13 @@ import styled from "@emotion/styled" import { useEffect, useMemo, useState } from "react" import type { Vault, Item } from "opvault.js" -import { Category } from "opvault.js" +import { AiOutlineStar } from "react-icons/ai" import { FiLock } from "react-icons/fi" -import { IoSearch } from "react-icons/io5" import { Si1Password } from "react-icons/si" import { BsGear } from "react-icons/bs" -import { ItemList } from "../components/ItemList" -import { ItemView } from "../components/Item" -import { reactIconClass } from "../components/CategoryIcon" import { useTranslate } from "../i18n/index" -import { scrollbar } from "../styles" import { Settings } from "../settings" +import { FilteredVaultView } from "../components/FilteredVaultView" const Container = styled.div` display: flex; @@ -21,9 +17,9 @@ const TabContainer = styled.div` border-right: 1px solid var(--border-color); display: flex; flex-direction: column; - width: 55px; overflow: hidden; padding-bottom: 5px; + width: 54px; @media (prefers-color-scheme: dark) { background: #222; border-right-color: transparent; @@ -42,6 +38,7 @@ const TabButton = styled.button<{ active?: boolean }>` margin-bottom: 5px; font-size: 22px; padding: 10px 14px; + ${p => p.active && "&:hover { background: var(--selected-background); }"} @media (prefers-color-scheme: dark) { --selected-background: #1c1c1c; } @@ -49,111 +46,30 @@ const TabButton = styled.button<{ active?: boolean }>` const TabContainerMain = styled.div` flex-grow: 1; ` -const ListContainer = styled.div` - border-right: 1px solid var(--border-color); - width: 350px; - margin-right: 10px; - overflow-y: scroll; - overflow-x: hidden; - @media (prefers-color-scheme: dark) { - background: #202020; - border-right-color: transparent; - } -` -const ItemContainer = styled.div` - width: calc(100% - 300px); - overflow: hidden; -` -const SearchContainer = styled.div` - text-align: center; - position: relative; - flex-grow: 1; - margin: 10px 0; - margin-right: 10px; -` -const SortContainer = styled.div` - margin: 10px 10px; -` - -const SearchInput = styled.input` - --margin: 10px; - width: calc(100% - var(--margin) * 2 + 9px); - margin: 0 var(--margin); - padding-left: 2em !important; -` -const SearchIcon = styled(IoSearch)` - position: absolute; - top: 9px; - left: 20px; -` - -const enum SortBy { - Name, - CreatedAt, - UpdatedAt, -} export const VaultView: React.FC<{ vault: Vault; onLock(): void }> = ({ vault, onLock, }) => { + const [tab, setTab] = useState(Tab.All) + const [items, setItems] = useState(() => []) const [showSettings, setShowSettings] = useState(false) const t = useTranslate() - const [items, setItems] = useState(() => []) - const [item, setItem] = useState() - const [sortBy, setSortBy] = useState(SortBy.Name) - const [search, setSearch] = useState("") - - const compareFn = useMemo((): ((a: Item, b: Item) => number) => { - switch (sortBy) { - case SortBy.Name: - return (a, b) => (a.overview.title ?? "").localeCompare(b?.overview.title ?? "") - case SortBy.CreatedAt: - return (a, b) => b.createdAt - a.createdAt - case SortBy.UpdatedAt: - return (a, b) => b.updatedAt - a.updatedAt - } - }, [sortBy]) - - const sortedItem = useMemo(() => items.slice().sort(compareFn), [items, compareFn]) useEffect(() => { - setItem(undefined) arrayFrom(vault.values()).then(setItems) }, [vault]) - const filtered = useMemo(() => { - const items = sortedItem.filter(x => x.category !== Category.Tombstone) - let res: Item[] = items - if (search) { - res = [] - for (const x of items) { - const compare = Math.max( - stringCompare(search, x.overview.title), - stringCompare(search, x.overview.ainfo) - ) as CompareResult - switch (compare) { - case CompareResult.NoMatch: - continue - case CompareResult.Includes: - res.push(x) - break - case CompareResult.Equals: - res.unshift(x) - break - } - } - } - return res - }, [sortedItem, search]) - return ( - + setTab(Tab.All)}> + setTab(Tab.Favorites)}> + + @@ -163,38 +79,25 @@ export const VaultView: React.FC<{ vault: Vault; onLock(): void }> = ({ - - - setSearch(e.currentTarget.value)} - /> - - - - - - - - - - {item && } - + {tab === Tab.All ? ( + + ) : tab === Tab.Favorites ? ( + + ) : null} setShowSettings(false)} /> ) } +const FavoriteItemsView: React.FC<{ items: Item[] }> = ({ items }) => { + const favorites = useMemo( + () => items.filter(x => x.fave).sort((a, b) => a.fave - b.fave), + [items] + ) + return +} + async function arrayFrom(generator: AsyncGenerator) { const list: T[] = [] for await (const value of generator) { @@ -203,20 +106,7 @@ async function arrayFrom(generator: AsyncGenerator) { return list } -enum CompareResult { - NoMatch, - Includes, - Equals, -} - -function stringCompare(search: string, source?: string) { - if (!search) return CompareResult.Includes - if (!source) return CompareResult.NoMatch - source = source.toLocaleLowerCase() - search = search.toLocaleUpperCase() - const includes = source.includes(search.toLocaleLowerCase()) - if (includes) { - return source.length === search.length ? CompareResult.Equals : CompareResult.Includes - } - return CompareResult.NoMatch +enum Tab { + All, + Favorites, } diff --git a/packages/web/src/pages/VaultPicker/Picker.tsx b/packages/web/src/pages/VaultPicker/Picker.tsx new file mode 100644 index 0000000..ceec625 --- /dev/null +++ b/packages/web/src/pages/VaultPicker/Picker.tsx @@ -0,0 +1,148 @@ +import styled from "@emotion/styled" +import { css } from "@emotion/css" +import { useCallback, useMemo, memo, useState } from "react" +import { Si1Password } from "react-icons/si" +import { FaFolderOpen } from "react-icons/fa" +import { ImCross } from "react-icons/im" +import { MdClearAll } from "react-icons/md" +import { BsGear, BsInfoCircle } from "react-icons/bs" +import { openDirectory } from "../../utils/ipc-adapter" +import { useTranslate } from "../../i18n" +import { Key, useStorage } from "../../utils/localStorage" +import { Settings } from "../../settings" +import { About } from "../../about" + +const Container = styled.div` + padding: 100px; + max-width: 600px; + margin: 0 auto; +` +const List = styled.ul` + list-style-type: none; + padding-inline-start: 0; +` +const Item = styled.li` + align-items: center; + cursor: default; + display: flex; + padding: 8px 10px; + user-select: none; + &:not(:hover):not(:active) { + background: transparent; + border-color: transparent; + } +` +const icon = css` + font-size: 1.5em; + margin-right: 10px; +` +const Text = styled.div` + flex-grow: 1; +` +const Hr = styled.hr` + border: none; + border-top: 1px solid var(--border-color); +` +const DeleteItem = styled(ImCross)` + text-align: right; + font-size: 0.7em; + opacity: 0; + ${Item}:hover & { + opacity: 1; + } +` +const NonCriticalPath = styled.span` + opacity: 0.4; +` + +const Path = memo(({ children }: { children: string }) => { + const segments = useMemo(() => children.split("/"), [children]) + return ( + + {segments.map((seg, i, { length }) => + i < length - 1 ? ( + {seg}/ + ) : ( + {seg} + ) + )} + + ) +}) + +const enum Modal { + None, + Settings, + About, +} + +export const PickOPVault: React.FC<{ + setPath(path: string): void +}> = ({ setPath }) => { + const t = useTranslate() + const [modal, setModal] = useState(Modal.None) + const [list, $setList] = useStorage(Key.RECENTLY_OPENED_VAULTS) + + const clearHistory = useCallback(() => { + $setList([]) + }, [$setList]) + + const setList = useCallback( + (fn: (value: Set) => void) => { + $setList(list => { + const set = new Set(list) + fn(set) + return Array.from(set) + }) + }, + [$setList] + ) + + const onClick = useCallback(async () => { + const path = await openDirectory() + if (path) { + setPath(path) + setList(set => set.add(path)) + } + }, [setPath, setList]) + + return ( + + + + + {t.label.choose_a_vault}… + + {list.map((item, i) => ( + setPath(item)} key={i}> + + + {item} + + setList(list => list.delete(item))} /> + + ))} + {list.length > 0 && ( + <> +
+ clearHistory()}> + + {t.action.clear_history} + + + )} + setModal(Modal.Settings)}> + + {t.label.settings} + + setModal(Modal.About)}> + + {t.label.about_app} + +
+ + setModal(Modal.None)} /> + setModal(Modal.None)} /> +
+ ) +} diff --git a/packages/web/src/pages/Unlock.tsx b/packages/web/src/pages/VaultPicker/Unlock.tsx similarity index 91% rename from packages/web/src/pages/Unlock.tsx rename to packages/web/src/pages/VaultPicker/Unlock.tsx index d7710b8..787e9d5 100644 --- a/packages/web/src/pages/Unlock.tsx +++ b/packages/web/src/pages/VaultPicker/Unlock.tsx @@ -3,7 +3,7 @@ import styled from "@emotion/styled" import React, { useCallback, useEffect, useState } from "react" import { IoMdArrowRoundBack } from "react-icons/io" import { FaUnlock } from "react-icons/fa" -import { useTranslate } from "../i18n" +import { useTranslate } from "../../i18n" const Container = styled.div` padding: 20px; @@ -61,12 +61,20 @@ const Submit = styled.button` top: 8px; right: 5px; ` +const VaultPath = styled.div` + margin-top: 15px; + opacity: 0.7; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +` export const Unlock: React.FC<{ instance: OnePassword + vaultPath: string onUnlock(profile: string, password: string): void onReturn(): void -}> = ({ onUnlock, onReturn, instance }) => { +}> = ({ onUnlock, onReturn, instance, vaultPath }) => { const t = useTranslate() const [profiles, setProfiles] = useState(() => []) const [profile, setProfile] = useState() @@ -134,6 +142,7 @@ export const Unlock: React.FC<{ + {vaultPath} ) } diff --git a/packages/web/src/pages/VaultPicker.tsx b/packages/web/src/pages/VaultPicker/index.tsx similarity index 59% rename from packages/web/src/pages/VaultPicker.tsx rename to packages/web/src/pages/VaultPicker/index.tsx index 36b0822..69a9bc9 100644 --- a/packages/web/src/pages/VaultPicker.tsx +++ b/packages/web/src/pages/VaultPicker/index.tsx @@ -1,11 +1,10 @@ -import styled from "@emotion/styled" import { useCallback, useEffect, useState } from "react" import type { Vault } from "opvault.js" import { OnePassword } from "opvault.js" import { Unlock } from "./Unlock" -import { electronAdapter, openDirectory } from "../utils/ipc-adapter" -import { get, remove, set, Key } from "../utils/localStorage" -import { useTranslate } from "../i18n" +import { electronAdapter } from "../../utils/ipc-adapter" +import { get, remove, set, Key } from "../../utils/localStorage" +import { PickOPVault } from "./Picker" interface VaultPickerProps { instance: OnePassword | undefined @@ -28,13 +27,13 @@ export const VaultPicker: React.FC = ({ await vault.unlock(password) setVault(vault) }, - [instance] + [instance, setVault] ) const clearInstance = useCallback(() => { setVaultPath("") setInstance(undefined) - }, []) + }, [setInstance]) useEffect(() => { const existingPath = get(Key.LAST_VAULT_PATH) @@ -55,40 +54,20 @@ export const VaultPicker: React.FC = ({ setInstance(undefined) remove(Key.LAST_VAULT_PATH) } - }, [vaultPath]) + }, [vaultPath, setInstance]) if (!instance) { return } if (!vault) { - return + return ( + + ) } return null } - -const PickOPVaultContainer = styled.div` - padding: 100px; - text-align: center; -` -const PickOPVaultInfo = styled.div` - margin: 10px; -` -const PickOPVault: React.FC<{ - setPath(path: string): void -}> = ({ setPath }) => { - const t = useTranslate() - - const onClick = useCallback(async () => { - const path = await openDirectory() - if (path) { - setPath(path) - } - }, [setPath]) - - return ( - - - {t.label.no_vault_selected} - - ) -} diff --git a/packages/web/src/settings/index.tsx b/packages/web/src/settings/index.tsx index 6672329..dfbcc78 100644 --- a/packages/web/src/settings/index.tsx +++ b/packages/web/src/settings/index.tsx @@ -36,7 +36,7 @@ const GhostLabel = styled.div` export const Settings: React.FC<{ show: boolean onHide(): void -}> = ({ show = true, onHide }) => { +}> = ({ show, onHide }) => { const { locale, setLocale } = useLocaleContext() const t = useTranslate() diff --git a/packages/web/src/utils/localStorage.ts b/packages/web/src/utils/localStorage.ts index 176584e..6a2fe3f 100644 --- a/packages/web/src/utils/localStorage.ts +++ b/packages/web/src/utils/localStorage.ts @@ -2,6 +2,7 @@ import { useCallback, useEffect, useState } from "react" export enum Key { LAST_VAULT_PATH = "app.state.last_vault_path", + RECENTLY_OPENED_VAULTS = "app.state.recently_opened_vaults", PREFERRED_LOCALE = "app.config.locale", ENABLE_AUTO_LOCK = "app.config.enable_auto_lock", AUTO_LOCK_AFTER = "app.config.auto_lock_after", @@ -9,6 +10,7 @@ export enum Key { interface StoredData { [Key.LAST_VAULT_PATH]: string + [Key.RECENTLY_OPENED_VAULTS]: string[] [Key.PREFERRED_LOCALE]: string [Key.ENABLE_AUTO_LOCK]: boolean [Key.AUTO_LOCK_AFTER]: number @@ -27,7 +29,7 @@ export function useStorage(key: K) { } }, [key]) const setState2 = useCallback( - (value: StoredData[K]) => { + (value: ((value: StoredData[K]) => StoredData[K]) | StoredData[K]) => { set(key, value) }, [key] @@ -43,10 +45,16 @@ export function get(key: K): StoredData[K] | undefined { } catch {} } -export function set(key: K, value: StoredData[K]) { +export function set( + key: K, + value: ((value: StoredData[K]) => StoredData[K]) | StoredData[K] +) { try { + if (typeof value === "function") { + value = value(get(key)!) + } localStorage.setItem(key, JSON.stringify(value)) - events.get(key).forEach(fn => fn(value)) + events.get(key).forEach(fn => fn(value as StoredData[K])) } catch (e) { console.error(e) } @@ -64,4 +72,5 @@ const defaults: typeof set = (key, value) => { } } defaults(Key.ENABLE_AUTO_LOCK, true) -defaults(Key.AUTO_LOCK_AFTER, 120) +defaults(Key.AUTO_LOCK_AFTER, 180) +defaults(Key.RECENTLY_OPENED_VAULTS, []) diff --git a/packages/web/src/vite-env.d.ts b/packages/web/src/vite-env.d.ts index 11f02fe..8ac6702 100644 --- a/packages/web/src/vite-env.d.ts +++ b/packages/web/src/vite-env.d.ts @@ -1 +1,5 @@ /// + +interface Array { + filter(predicate: BooleanConstructor): Exclude[] +} diff --git a/packages/web/vite.config.ts b/packages/web/vite.config.ts index 44e99de..c2b19f5 100644 --- a/packages/web/vite.config.ts +++ b/packages/web/vite.config.ts @@ -1,11 +1,12 @@ import { defineConfig } from "vite" import react from "@vitejs/plugin-react" import yaml from "@rollup/plugin-yaml" +import babel from "./scripts/vite-babel" // https://vitejs.dev/config/ export default defineConfig({ base: "./", - plugins: [react(), yaml()], + plugins: [babel(), react(), yaml()], define: { global: "globalThis", "process.browser": "true", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5dcf2ac..80000c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,20 +8,20 @@ importers: '@types/chai-as-promised': ^7.1.4 '@types/fs-extra': ^9.0.13 '@types/mocha': github:whitecolor/mocha-types#da22474cf43f48a56c86f8c23a5a0ea36e295768 - '@types/node': ^16.11.9 + '@types/node': ^17.0.6 '@types/sinon': ^10.0.6 - '@types/sinon-chai': ^3.2.6 + '@types/sinon-chai': ^3.2.8 '@types/wicg-file-system-access': ^2020.9.4 - '@typescript-eslint/eslint-plugin': 5.7.0 - '@typescript-eslint/parser': 5.7.0 + '@typescript-eslint/eslint-plugin': 5.8.1 + '@typescript-eslint/parser': 5.8.1 chai: ^4.3.4 chai-as-promised: ^7.1.1 chalk: ^4.1.2 - eslint: 8.5.0 + eslint: 8.6.0 eslint-config-prettier: 8.3.0 eslint-import-resolver-typescript: 2.5.0 eslint-plugin-import: 2.25.3 - eslint-plugin-react: 7.27.1 + eslint-plugin-react: 7.28.0 eslint-plugin-react-hooks: 4.3.0 fs-extra: ^10.0.0 marked: ^4.0.8 @@ -30,7 +30,7 @@ importers: prettier: ^2.5.1 react: ^17.0.2 react-dom: ^17.0.2 - sass: ^1.45.0 + sass: ^1.45.2 sinon: ^12.0.1 sinon-chai: ^3.7.0 ts-node: ^10.4.0 @@ -42,21 +42,21 @@ importers: '@types/chai-as-promised': 7.1.4 '@types/fs-extra': 9.0.13 '@types/mocha': github.com/whitecolor/mocha-types/da22474cf43f48a56c86f8c23a5a0ea36e295768 - '@types/node': 16.11.9 + '@types/node': 17.0.6 '@types/sinon': 10.0.6 - '@types/sinon-chai': 3.2.6 + '@types/sinon-chai': 3.2.8 '@types/wicg-file-system-access': 2020.9.4 - '@typescript-eslint/eslint-plugin': 5.7.0_a6f6159640504abdd3de077f8bcadb33 - '@typescript-eslint/parser': 5.7.0_eslint@8.5.0+typescript@4.5.4 + '@typescript-eslint/eslint-plugin': 5.8.1_13039593e64cd539d0b4c5c2da390958 + '@typescript-eslint/parser': 5.8.1_eslint@8.6.0+typescript@4.5.4 chai: 4.3.4 chai-as-promised: 7.1.1_chai@4.3.4 chalk: 4.1.2 - eslint: 8.5.0 - eslint-config-prettier: 8.3.0_eslint@8.5.0 - eslint-import-resolver-typescript: 2.5.0_f385d671d5f1c72a868db745a891bc1f - eslint-plugin-import: 2.25.3_eslint@8.5.0 - eslint-plugin-react: 7.27.1_eslint@8.5.0 - eslint-plugin-react-hooks: 4.3.0_eslint@8.5.0 + eslint: 8.6.0 + eslint-config-prettier: 8.3.0_eslint@8.6.0 + eslint-import-resolver-typescript: 2.5.0_b54597effeb7d09a84a334cc3c3dadae + eslint-plugin-import: 2.25.3_eslint@8.6.0 + eslint-plugin-react: 7.28.0_eslint@8.6.0 + eslint-plugin-react-hooks: 4.3.0_eslint@8.6.0 fs-extra: 10.0.0 marked: 4.0.8 mocha: 9.1.3 @@ -64,10 +64,10 @@ importers: prettier: 2.5.1 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 - sass: 1.45.0 + sass: 1.45.2 sinon: 12.0.1 sinon-chai: 3.7.0_chai@4.3.4+sinon@12.0.1 - ts-node: 10.4.0_6cc1060505bd4c6ac58c4b67188c6af9 + ts-node: 10.4.0_646584a8d620b4d6f5eb4525e8655565 tsconfig-paths: 3.12.0 tslib: 2.3.1 typescript: 4.5.4 @@ -103,18 +103,23 @@ importers: packages/web: specifiers: + '@babel/core': ^7.16.7 + '@emotion/babel-plugin': ^11.7.2 '@emotion/css': ^11.7.1 '@emotion/react': ^11.7.1 '@emotion/styled': ^11.6.0 '@rollup/plugin-yaml': ^3.1.0 + '@types/babel__core': ^7.1.18 '@types/react': ^17.0.37 '@types/react-dom': ^17.0.11 '@vitejs/plugin-react': ^1.1.3 buffer: ^6.0.3 + concurrently: ^6.5.1 electron: ^16.0.5 electron-builder: ^22.14.5 esbuild: ^0.14.5 js-yaml: ^4.1.0 + lodash: ^4.17.21 opvault.js: '*' path-browserify: ^1.0.1 react: ^17.0.2 @@ -124,25 +129,31 @@ importers: sass: ^1.45.0 typescript: ^4.5.4 vite: ^2.7.3 - devDependencies: - '@emotion/css': 11.7.1 - '@emotion/react': 11.7.1_cfedea9b3ed0faf0dded75c187406c5e - '@emotion/styled': 11.6.0_f08cba2053577b4854d3e19df4a0b904 - '@rollup/plugin-yaml': 3.1.0 - '@types/react': 17.0.37 - '@types/react-dom': 17.0.11 - '@vitejs/plugin-react': 1.1.3 + dependencies: + '@emotion/css': 11.7.1_@babel+core@7.16.7 + '@emotion/react': 11.7.1_3627eec4441387a0f7e4646204b78d89 + '@emotion/styled': 11.6.0_9a6cf50b6d3b112e53e6e562c396e2af buffer: 6.0.3 - electron: 16.0.5 - electron-builder: 22.14.5 - esbuild: 0.14.5 - js-yaml: 4.1.0 - opvault.js: link:../opvault.js path-browserify: 1.0.1 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 react-icons: 4.3.1_react@17.0.2 react-idle-timer: 4.6.4_react-dom@17.0.2+react@17.0.2 + devDependencies: + '@babel/core': 7.16.7 + '@emotion/babel-plugin': 11.7.2_@babel+core@7.16.7 + '@rollup/plugin-yaml': 3.1.0 + '@types/babel__core': 7.1.18 + '@types/react': 17.0.37 + '@types/react-dom': 17.0.11 + '@vitejs/plugin-react': 1.1.3 + concurrently: 6.5.1 + electron: 16.0.5 + electron-builder: 22.14.5 + esbuild: 0.14.5 + js-yaml: 4.1.0 + lodash: 4.17.21 + opvault.js: link:../opvault.js sass: 1.45.0 typescript: 4.5.4 vite: 2.7.3_sass@1.45.0 @@ -156,38 +167,30 @@ packages: resolution: {integrity: sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==} dev: true - /@babel/code-frame/7.14.5: - resolution: {integrity: sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==} + /@babel/code-frame/7.16.7: + resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.14.5 - dev: true - - /@babel/code-frame/7.16.0: - resolution: {integrity: sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.16.0 - dev: true + '@babel/highlight': 7.16.7 /@babel/compat-data/7.16.4: resolution: {integrity: sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.16.0: - resolution: {integrity: sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==} + /@babel/core/7.16.7: + resolution: {integrity: sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.16.0 - '@babel/generator': 7.16.0 - '@babel/helper-compilation-targets': 7.16.3_@babel+core@7.16.0 - '@babel/helper-module-transforms': 7.16.0 - '@babel/helpers': 7.16.3 - '@babel/parser': 7.16.4 - '@babel/template': 7.16.0 - '@babel/traverse': 7.16.3 - '@babel/types': 7.16.0 + '@babel/code-frame': 7.16.7 + '@babel/generator': 7.16.7 + '@babel/helper-compilation-targets': 7.16.7_@babel+core@7.16.7 + '@babel/helper-module-transforms': 7.16.7 + '@babel/helpers': 7.16.7 + '@babel/parser': 7.16.7 + '@babel/template': 7.16.7 + '@babel/traverse': 7.16.7 + '@babel/types': 7.16.7 convert-source-map: 1.8.0 debug: 4.3.2 gensync: 1.0.0-beta.2 @@ -198,11 +201,11 @@ packages: - supports-color dev: true - /@babel/generator/7.16.0: - resolution: {integrity: sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==} + /@babel/generator/7.16.7: + resolution: {integrity: sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.16.0 + '@babel/types': 7.16.7 jsesc: 2.5.2 source-map: 0.5.7 dev: true @@ -211,116 +214,97 @@ packages: resolution: {integrity: sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.16.0 + '@babel/types': 7.16.7 dev: true - /@babel/helper-compilation-targets/7.16.3_@babel+core@7.16.0: - resolution: {integrity: sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==} + /@babel/helper-compilation-targets/7.16.7_@babel+core@7.16.7: + resolution: {integrity: sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/compat-data': 7.16.4 - '@babel/core': 7.16.0 - '@babel/helper-validator-option': 7.14.5 + '@babel/core': 7.16.7 + '@babel/helper-validator-option': 7.16.7 browserslist: 4.18.1 semver: 6.3.0 dev: true - /@babel/helper-function-name/7.16.0: - resolution: {integrity: sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==} + /@babel/helper-environment-visitor/7.16.7: + resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-get-function-arity': 7.16.0 - '@babel/template': 7.16.0 - '@babel/types': 7.16.0 + '@babel/types': 7.16.7 dev: true - /@babel/helper-get-function-arity/7.16.0: - resolution: {integrity: sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==} + /@babel/helper-function-name/7.16.7: + resolution: {integrity: sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.16.0 + '@babel/helper-get-function-arity': 7.16.7 + '@babel/template': 7.16.7 + '@babel/types': 7.16.7 dev: true - /@babel/helper-hoist-variables/7.16.0: - resolution: {integrity: sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==} + /@babel/helper-get-function-arity/7.16.7: + resolution: {integrity: sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.16.0 + '@babel/types': 7.16.7 dev: true - /@babel/helper-member-expression-to-functions/7.16.0: - resolution: {integrity: sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==} + /@babel/helper-hoist-variables/7.16.7: + resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.16.0 + '@babel/types': 7.16.7 dev: true /@babel/helper-module-imports/7.16.0: resolution: {integrity: sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.16.0 - dev: true + '@babel/types': 7.16.7 - /@babel/helper-module-transforms/7.16.0: - resolution: {integrity: sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==} + /@babel/helper-module-imports/7.16.7: + resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-module-imports': 7.16.0 - '@babel/helper-replace-supers': 7.16.0 - '@babel/helper-simple-access': 7.16.0 - '@babel/helper-split-export-declaration': 7.16.0 - '@babel/helper-validator-identifier': 7.15.7 - '@babel/template': 7.16.0 - '@babel/traverse': 7.16.3 - '@babel/types': 7.16.0 + '@babel/types': 7.16.7 + dev: true + + /@babel/helper-module-transforms/7.16.7: + resolution: {integrity: sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.16.7 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-simple-access': 7.16.7 + '@babel/helper-split-export-declaration': 7.16.7 + '@babel/helper-validator-identifier': 7.16.7 + '@babel/template': 7.16.7 + '@babel/traverse': 7.16.7 + '@babel/types': 7.16.7 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-optimise-call-expression/7.16.0: - resolution: {integrity: sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.16.0 - dev: true - /@babel/helper-plugin-utils/7.14.5: resolution: {integrity: sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-replace-supers/7.16.0: - resolution: {integrity: sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==} + /@babel/helper-simple-access/7.16.7: + resolution: {integrity: sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-member-expression-to-functions': 7.16.0 - '@babel/helper-optimise-call-expression': 7.16.0 - '@babel/traverse': 7.16.3 - '@babel/types': 7.16.0 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.16.7 dev: true - /@babel/helper-simple-access/7.16.0: - resolution: {integrity: sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==} + /@babel/helper-split-export-declaration/7.16.7: + resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.16.0 - dev: true - - /@babel/helper-split-export-declaration/7.16.0: - resolution: {integrity: sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.16.0 - dev: true - - /@babel/helper-validator-identifier/7.14.5: - resolution: {integrity: sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==} - engines: {node: '>=6.9.0'} + '@babel/types': 7.16.7 dev: true /@babel/helper-validator-identifier/7.15.7: @@ -328,39 +312,33 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.14.5: - resolution: {integrity: sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==} + /@babel/helper-validator-identifier/7.16.7: + resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option/7.16.7: + resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers/7.16.3: - resolution: {integrity: sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==} + /@babel/helpers/7.16.7: + resolution: {integrity: sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.16.0 - '@babel/traverse': 7.16.3 - '@babel/types': 7.16.0 + '@babel/template': 7.16.7 + '@babel/traverse': 7.16.7 + '@babel/types': 7.16.7 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight/7.14.5: - resolution: {integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==} + /@babel/highlight/7.16.7: + resolution: {integrity: sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.14.5 + '@babel/helper-validator-identifier': 7.16.7 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true - - /@babel/highlight/7.16.0: - resolution: {integrity: sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.15.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true /@babel/parser/7.16.4: resolution: {integrity: sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==} @@ -368,66 +346,62 @@ packages: hasBin: true dev: true - /@babel/plugin-syntax-jsx/7.16.0: + /@babel/parser/7.16.7: + resolution: {integrity: sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==} + engines: {node: '>=6.0.0'} + hasBin: true + dev: true + + /@babel/plugin-syntax-jsx/7.16.0_@babel+core@7.16.7: resolution: {integrity: sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.16.7 '@babel/helper-plugin-utils': 7.14.5 - dev: true - /@babel/plugin-syntax-jsx/7.16.0_@babel+core@7.16.0: - resolution: {integrity: sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.0 - '@babel/helper-plugin-utils': 7.14.5 - dev: true - - /@babel/plugin-transform-react-jsx-development/7.16.0_@babel+core@7.16.0: + /@babel/plugin-transform-react-jsx-development/7.16.0_@babel+core@7.16.7: resolution: {integrity: sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.16.0 - '@babel/plugin-transform-react-jsx': 7.16.0_@babel+core@7.16.0 + '@babel/core': 7.16.7 + '@babel/plugin-transform-react-jsx': 7.16.0_@babel+core@7.16.7 dev: true - /@babel/plugin-transform-react-jsx-self/7.16.0_@babel+core@7.16.0: + /@babel/plugin-transform-react-jsx-self/7.16.0_@babel+core@7.16.7: resolution: {integrity: sha512-97yCFY+2GvniqOThOSjPor8xUoDiQ0STVWAQMl3pjhJoFVe5DuXDLZCRSZxu9clx+oRCbTiXGgKEG/Yoyo6Y+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.16.0 + '@babel/core': 7.16.7 '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-react-jsx-source/7.16.0_@babel+core@7.16.0: + /@babel/plugin-transform-react-jsx-source/7.16.0_@babel+core@7.16.7: resolution: {integrity: sha512-8yvbGGrHOeb/oyPc9tzNoe9/lmIjz3HLa9Nc5dMGDyNpGjfFrk8D2KdEq9NRkftZzeoQEW6yPQ29TMZtrLiUUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.16.0 + '@babel/core': 7.16.7 '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-transform-react-jsx/7.16.0_@babel+core@7.16.0: + /@babel/plugin-transform-react-jsx/7.16.0_@babel+core@7.16.7: resolution: {integrity: sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.16.0 + '@babel/core': 7.16.7 '@babel/helper-annotate-as-pure': 7.16.0 '@babel/helper-module-imports': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-jsx': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-syntax-jsx': 7.16.0_@babel+core@7.16.7 '@babel/types': 7.16.0 dev: true @@ -436,28 +410,28 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.7 - dev: true - /@babel/template/7.16.0: - resolution: {integrity: sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==} + /@babel/template/7.16.7: + resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.16.0 - '@babel/parser': 7.16.4 - '@babel/types': 7.16.0 + '@babel/code-frame': 7.16.7 + '@babel/parser': 7.16.7 + '@babel/types': 7.16.7 dev: true - /@babel/traverse/7.16.3: - resolution: {integrity: sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==} + /@babel/traverse/7.16.7: + resolution: {integrity: sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.16.0 - '@babel/generator': 7.16.0 - '@babel/helper-function-name': 7.16.0 - '@babel/helper-hoist-variables': 7.16.0 - '@babel/helper-split-export-declaration': 7.16.0 - '@babel/parser': 7.16.4 - '@babel/types': 7.16.0 + '@babel/code-frame': 7.16.7 + '@babel/generator': 7.16.7 + '@babel/helper-environment-visitor': 7.16.7 + '@babel/helper-function-name': 7.16.7 + '@babel/helper-hoist-variables': 7.16.7 + '@babel/helper-split-export-declaration': 7.16.7 + '@babel/parser': 7.16.7 + '@babel/types': 7.16.7 debug: 4.3.2 globals: 11.12.0 transitivePeerDependencies: @@ -472,6 +446,13 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types/7.16.7: + resolution: {integrity: sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.16.7 + to-fast-properties: 2.0.0 + /@cspotcode/source-map-consumer/0.8.0: resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} engines: {node: '>= 12'} @@ -523,32 +504,14 @@ packages: - supports-color dev: true - /@emotion/babel-plugin/11.3.0: - resolution: {integrity: sha512-UZKwBV2rADuhRp+ZOGgNWg2eYgbzKzQXfQPtJbu/PLy8onurxlNCLvxMQEvlr1/GudguPI5IU9qIY1+2z1M5bA==} + /@emotion/babel-plugin/11.7.2_@babel+core@7.16.7: + resolution: {integrity: sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: + '@babel/core': 7.16.7 '@babel/helper-module-imports': 7.16.0 - '@babel/plugin-syntax-jsx': 7.16.0 - '@babel/runtime': 7.15.4 - '@emotion/hash': 0.8.0 - '@emotion/memoize': 0.7.5 - '@emotion/serialize': 1.0.2 - babel-plugin-macros: 2.8.0 - convert-source-map: 1.8.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.0.10 - dev: true - - /@emotion/babel-plugin/11.7.1: - resolution: {integrity: sha512-K3/6Y+J/sIAjplf3uIteWLhPuOyuMNnE+iyYnTF/m294vc6IL90kTHp7y8ldZYbpKlP17rpOWDKM9DvTcrOmNQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/helper-module-imports': 7.16.0 - '@babel/plugin-syntax-jsx': 7.16.0 + '@babel/plugin-syntax-jsx': 7.16.0_@babel+core@7.16.7 '@babel/runtime': 7.15.4 '@emotion/hash': 0.8.0 '@emotion/memoize': 0.7.5 @@ -559,7 +522,6 @@ packages: find-root: 1.1.0 source-map: 0.5.7 stylis: 4.0.13 - dev: true /@emotion/cache/11.7.1: resolution: {integrity: sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==} @@ -569,9 +531,9 @@ packages: '@emotion/utils': 1.0.0 '@emotion/weak-memoize': 0.2.5 stylis: 4.0.13 - dev: true + dev: false - /@emotion/css/11.7.1: + /@emotion/css/11.7.1_@babel+core@7.16.7: resolution: {integrity: sha512-RUUgPlMZunlc7SE5A6Hg+VWRzb2cU6O9xlV78KCFgcnl25s7Qz/20oQg71iKudpLqk7xj0vhbJlwcJJMT0BOZg==} peerDependencies: '@babel/core': ^7.0.0 @@ -579,28 +541,27 @@ packages: '@babel/core': optional: true dependencies: - '@emotion/babel-plugin': 11.7.1 + '@babel/core': 7.16.7 + '@emotion/babel-plugin': 11.7.2_@babel+core@7.16.7 '@emotion/cache': 11.7.1 '@emotion/serialize': 1.0.2 '@emotion/sheet': 1.1.0 '@emotion/utils': 1.0.0 - dev: true + dev: false /@emotion/hash/0.8.0: resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} - dev: true /@emotion/is-prop-valid/1.1.1: resolution: {integrity: sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==} dependencies: '@emotion/memoize': 0.7.5 - dev: true + dev: false /@emotion/memoize/0.7.5: resolution: {integrity: sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==} - dev: true - /@emotion/react/11.7.1_cfedea9b3ed0faf0dded75c187406c5e: + /@emotion/react/11.7.1_3627eec4441387a0f7e4646204b78d89: resolution: {integrity: sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==} peerDependencies: '@babel/core': ^7.0.0 @@ -612,6 +573,7 @@ packages: '@types/react': optional: true dependencies: + '@babel/core': 7.16.7 '@babel/runtime': 7.15.4 '@emotion/cache': 11.7.1 '@emotion/serialize': 1.0.2 @@ -621,7 +583,7 @@ packages: '@types/react': 17.0.37 hoist-non-react-statics: 3.3.2 react: 17.0.2 - dev: true + dev: false /@emotion/serialize/1.0.2: resolution: {integrity: sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==} @@ -631,13 +593,12 @@ packages: '@emotion/unitless': 0.7.5 '@emotion/utils': 1.0.0 csstype: 3.0.9 - dev: true /@emotion/sheet/1.1.0: resolution: {integrity: sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==} - dev: true + dev: false - /@emotion/styled/11.6.0_f08cba2053577b4854d3e19df4a0b904: + /@emotion/styled/11.6.0_9a6cf50b6d3b112e53e6e562c396e2af: resolution: {integrity: sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==} peerDependencies: '@babel/core': ^7.0.0 @@ -650,27 +611,26 @@ packages: '@types/react': optional: true dependencies: + '@babel/core': 7.16.7 '@babel/runtime': 7.15.4 - '@emotion/babel-plugin': 11.3.0 + '@emotion/babel-plugin': 11.7.2_@babel+core@7.16.7 '@emotion/is-prop-valid': 1.1.1 - '@emotion/react': 11.7.1_cfedea9b3ed0faf0dded75c187406c5e + '@emotion/react': 11.7.1_3627eec4441387a0f7e4646204b78d89 '@emotion/serialize': 1.0.2 '@emotion/utils': 1.0.0 '@types/react': 17.0.37 react: 17.0.2 - dev: true + dev: false /@emotion/unitless/0.7.5: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - dev: true /@emotion/utils/1.0.0: resolution: {integrity: sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==} - dev: true /@emotion/weak-memoize/0.2.5: resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} - dev: true + dev: false /@eslint/eslintrc/1.0.5: resolution: {integrity: sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==} @@ -678,7 +638,7 @@ packages: dependencies: ajv: 6.12.6 debug: 4.3.2 - espree: 9.2.0 + espree: 9.3.0 globals: 13.9.0 ignore: 4.0.6 import-fresh: 3.2.1 @@ -867,6 +827,35 @@ packages: resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} dev: true + /@types/babel__core/7.1.18: + resolution: {integrity: sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==} + dependencies: + '@babel/parser': 7.16.4 + '@babel/types': 7.16.0 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.14.2 + dev: true + + /@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.16.7 + dev: true + + /@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.16.7 + '@babel/types': 7.16.7 + dev: true + + /@types/babel__traverse/7.14.2: + resolution: {integrity: sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==} + dependencies: + '@babel/types': 7.16.7 + dev: true + /@types/chai-as-promised/7.1.4: resolution: {integrity: sha512-1y3L1cHePcIm5vXkh1DSGf/zQq5n5xDKG1fpCvf18+uOkpce0Z1ozNFPkyWsVswK7ntN1sZBw3oU6gmN+pDUcA==} dependencies: @@ -890,7 +879,7 @@ packages: /@types/fs-extra/9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 16.11.9 + '@types/node': 17.0.6 dev: true /@types/glob/7.2.0: @@ -927,19 +916,22 @@ packages: resolution: {integrity: sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==} dev: true + /@types/node/17.0.6: + resolution: {integrity: sha512-+XBAjfZmmivILUzO0HwBJoYkAyyySSLg5KCGBDFLomJo0sV6szvVLAf4ANZZ0pfWzgEds5KmGLG9D5hfEqOhaA==} + dev: true + /@types/object-path/0.11.1: resolution: {integrity: sha512-219LSCO9HPcoXcRTC6DbCs0FRhZgBnEMzf16RRqkT40WbkKx3mOeQuz3e2XqbfhOz/AHfbru0kzB1n1RCAsIIg==} dev: true /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: true /@types/plist/3.0.2: resolution: {integrity: sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==} requiresBuild: true dependencies: - '@types/node': 16.11.9 + '@types/node': 17.0.6 xmlbuilder: 15.1.1 dev: true optional: true @@ -970,8 +962,8 @@ packages: resolution: {integrity: sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==} dev: true - /@types/sinon-chai/3.2.6: - resolution: {integrity: sha512-Z57LprQ+yOQNu9d6mWdHNvnmncPXzDWGSeLj+8L075/QahToapC4Q13zAFRVKV4clyBmdJ5gz4xBfVkOso5lXw==} + /@types/sinon-chai/3.2.8: + resolution: {integrity: sha512-d4ImIQbT/rKMG8+AXpmcan5T2/PNeSjrYhvkwet6z0p8kzYtfgA32xzOBlbU0yqJfq+/0Ml805iFoODO0LP5/g==} dependencies: '@types/chai': 4.3.0 '@types/sinon': 10.0.6 @@ -1007,8 +999,8 @@ packages: '@types/yargs-parser': 20.2.1 dev: true - /@typescript-eslint/eslint-plugin/5.7.0_a6f6159640504abdd3de077f8bcadb33: - resolution: {integrity: sha512-8RTGBpNn5a9M628wBPrCbJ+v3YTEOE2qeZb7TDkGKTDXSj36KGRg92SpFFaR/0S3rSXQxM0Og/kV9EyadsYSBg==} + /@typescript-eslint/eslint-plugin/5.8.1_13039593e64cd539d0b4c5c2da390958: + resolution: {integrity: sha512-wTZ5oEKrKj/8/366qTM366zqhIKAp6NCMweoRONtfuC07OAU9nVI2GZZdqQ1qD30WAAtcPdkH+npDwtRFdp4Rw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -1018,11 +1010,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 5.7.0_eslint@8.5.0+typescript@4.5.4 - '@typescript-eslint/parser': 5.7.0_eslint@8.5.0+typescript@4.5.4 - '@typescript-eslint/scope-manager': 5.7.0 + '@typescript-eslint/experimental-utils': 5.8.1_eslint@8.6.0+typescript@4.5.4 + '@typescript-eslint/parser': 5.8.1_eslint@8.6.0+typescript@4.5.4 + '@typescript-eslint/scope-manager': 5.8.1 debug: 4.3.2 - eslint: 8.5.0 + eslint: 8.6.0 functional-red-black-tree: 1.0.1 ignore: 5.1.8 regexpp: 3.2.0 @@ -1033,26 +1025,26 @@ packages: - supports-color dev: true - /@typescript-eslint/experimental-utils/5.7.0_eslint@8.5.0+typescript@4.5.4: - resolution: {integrity: sha512-u57eZ5FbEpzN5kSjmVrSesovWslH2ZyNPnaXQMXWgH57d5+EVHEt76W75vVuI9qKZ5BMDKNfRN+pxcPEjQjb2A==} + /@typescript-eslint/experimental-utils/5.8.1_eslint@8.6.0+typescript@4.5.4: + resolution: {integrity: sha512-fbodVnjIDU4JpeXWRDsG5IfIjYBxEvs8EBO8W1+YVdtrc2B9ppfof5sZhVEDOtgTfFHnYQJDI8+qdqLYO4ceww==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: '*' + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.9 - '@typescript-eslint/scope-manager': 5.7.0 - '@typescript-eslint/types': 5.7.0 - '@typescript-eslint/typescript-estree': 5.7.0_typescript@4.5.4 - eslint: 8.5.0 + '@typescript-eslint/scope-manager': 5.8.1 + '@typescript-eslint/types': 5.8.1 + '@typescript-eslint/typescript-estree': 5.8.1_typescript@4.5.4 + eslint: 8.6.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.5.0 + eslint-utils: 3.0.0_eslint@8.6.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/parser/5.7.0_eslint@8.5.0+typescript@4.5.4: - resolution: {integrity: sha512-m/gWCCcS4jXw6vkrPQ1BjZ1vomP01PArgzvauBqzsoZ3urLbsRChexB8/YV8z9HwE3qlJM35FxfKZ1nfP/4x8g==} + /@typescript-eslint/parser/5.8.1_eslint@8.6.0+typescript@4.5.4: + resolution: {integrity: sha512-K1giKHAjHuyB421SoXMXFHHVI4NdNY603uKw92++D3qyxSeYvC10CBJ/GE5Thpo4WTUvu1mmJI2/FFkz38F2Gw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1061,31 +1053,31 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.7.0 - '@typescript-eslint/types': 5.7.0 - '@typescript-eslint/typescript-estree': 5.7.0_typescript@4.5.4 + '@typescript-eslint/scope-manager': 5.8.1 + '@typescript-eslint/types': 5.8.1 + '@typescript-eslint/typescript-estree': 5.8.1_typescript@4.5.4 debug: 4.3.2 - eslint: 8.5.0 + eslint: 8.6.0 typescript: 4.5.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.7.0: - resolution: {integrity: sha512-7mxR520DGq5F7sSSgM0HSSMJ+TFUymOeFRMfUfGFAVBv8BR+Jv1vHgAouYUvWRZeszVBJlLcc9fDdktxb5kmxA==} + /@typescript-eslint/scope-manager/5.8.1: + resolution: {integrity: sha512-DGxJkNyYruFH3NIZc3PwrzwOQAg7vvgsHsHCILOLvUpupgkwDZdNq/cXU3BjF4LNrCsVg0qxEyWasys5AiJ85Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.7.0 - '@typescript-eslint/visitor-keys': 5.7.0 + '@typescript-eslint/types': 5.8.1 + '@typescript-eslint/visitor-keys': 5.8.1 dev: true - /@typescript-eslint/types/5.7.0: - resolution: {integrity: sha512-5AeYIF5p2kAneIpnLFve8g50VyAjq7udM7ApZZ9JYjdPjkz0LvODfuSHIDUVnIuUoxafoWzpFyU7Sqbxgi79mA==} + /@typescript-eslint/types/5.8.1: + resolution: {integrity: sha512-L/FlWCCgnjKOLefdok90/pqInkomLnAcF9UAzNr+DSqMC3IffzumHTQTrINXhP1gVp9zlHiYYjvozVZDPleLcA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.7.0_typescript@4.5.4: - resolution: {integrity: sha512-aO1Ql+izMrTnPj5aFFlEJkpD4jRqC4Gwhygu2oHK2wfVQpmOPbyDSveJ+r/NQo+PWV43M6uEAeLVbTi09dFLhg==} + /@typescript-eslint/typescript-estree/5.8.1_typescript@4.5.4: + resolution: {integrity: sha512-26lQ8l8tTbG7ri7xEcCFT9ijU5Fk+sx/KRRyyzCv7MQ+rZZlqiDPtMKWLC8P7o+dtCnby4c+OlxuX1tp8WfafQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -1093,8 +1085,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.7.0 - '@typescript-eslint/visitor-keys': 5.7.0 + '@typescript-eslint/types': 5.8.1 + '@typescript-eslint/visitor-keys': 5.8.1 debug: 4.3.2 globby: 11.0.4 is-glob: 4.0.3 @@ -1105,11 +1097,11 @@ packages: - supports-color dev: true - /@typescript-eslint/visitor-keys/5.7.0: - resolution: {integrity: sha512-hdohahZ4lTFcglZSJ3DGdzxQHBSxsLVqHzkiOmKi7xVAWC4y2c1bIMKmPJSrA4aOEoRUPOKQ87Y/taC7yVHpFg==} + /@typescript-eslint/visitor-keys/5.8.1: + resolution: {integrity: sha512-SWgiWIwocK6NralrJarPZlWdr0hZnj5GXHIgfdm8hNkyKvpeQuFyLP6YjSIe9kf3YBIfU6OHSZLYkQ+smZwtNg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.7.0 + '@typescript-eslint/types': 5.8.1 eslint-visitor-keys: 3.1.0 dev: true @@ -1121,11 +1113,11 @@ packages: resolution: {integrity: sha512-xv8QujX/uR4ti8qpt0hMriM2bdpxX4jm4iU6GAZfCwHjh/ewkX/8DJgnmQpE0HSJmgz8dixyUnRJKi2Pf1nNoQ==} engines: {node: '>=12.0.0'} dependencies: - '@babel/core': 7.16.0 - '@babel/plugin-transform-react-jsx': 7.16.0_@babel+core@7.16.0 - '@babel/plugin-transform-react-jsx-development': 7.16.0_@babel+core@7.16.0 - '@babel/plugin-transform-react-jsx-self': 7.16.0_@babel+core@7.16.0 - '@babel/plugin-transform-react-jsx-source': 7.16.0_@babel+core@7.16.0 + '@babel/core': 7.16.7 + '@babel/plugin-transform-react-jsx': 7.16.0_@babel+core@7.16.7 + '@babel/plugin-transform-react-jsx-development': 7.16.0_@babel+core@7.16.7 + '@babel/plugin-transform-react-jsx-self': 7.16.0_@babel+core@7.16.7 + '@babel/plugin-transform-react-jsx-source': 7.16.0_@babel+core@7.16.7 '@rollup/pluginutils': 4.1.1 react-refresh: 0.11.0 resolve: 1.20.0 @@ -1138,12 +1130,12 @@ packages: engines: {node: '>=8.0.0'} dev: true - /acorn-jsx/5.3.1_acorn@8.6.0: + /acorn-jsx/5.3.1_acorn@8.7.0: resolution: {integrity: sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.6.0 + acorn: 8.7.0 dev: true /acorn-walk/8.2.0: @@ -1157,8 +1149,8 @@ packages: hasBin: true dev: true - /acorn/8.6.0: - resolution: {integrity: sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==} + /acorn/8.7.0: + resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -1208,7 +1200,6 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - dev: true /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -1358,7 +1349,6 @@ packages: '@babel/runtime': 7.15.4 cosmiconfig: 6.0.0 resolve: 1.20.0 - dev: true /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1489,6 +1479,7 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + dev: false /builder-util-runtime/8.9.1: resolution: {integrity: sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==} @@ -1545,7 +1536,6 @@ packages: /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - dev: true /camelcase/6.2.0: resolution: {integrity: sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==} @@ -1584,7 +1574,6 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true /chalk/4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1658,7 +1647,6 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - dev: true /color-convert/2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -1669,7 +1657,6 @@ packages: /color-name/1.1.3: resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} - dev: true /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -1728,6 +1715,21 @@ packages: typedarray: 0.0.6 dev: true + /concurrently/6.5.1: + resolution: {integrity: sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.28.0 + lodash: 4.17.21 + rxjs: 6.6.7 + spawn-command: 0.0.2-1 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 16.2.0 + dev: true + /config-chain/1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} dependencies: @@ -1752,7 +1754,6 @@ packages: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: safe-buffer: 5.1.2 - dev: true /core-js/3.18.3: resolution: {integrity: sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==} @@ -1779,7 +1780,6 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: true /crc/3.8.0: resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} @@ -1816,6 +1816,10 @@ packages: /csstype/3.0.9: resolution: {integrity: sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==} + + /date-fns/2.28.0: + resolution: {integrity: sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==} + engines: {node: '>=0.11'} dev: true /dateformat/4.6.3: @@ -2108,7 +2112,6 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - dev: true /es-abstract/1.19.1: resolution: {integrity: sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==} @@ -2487,20 +2490,18 @@ packages: /escape-string-regexp/1.0.5: resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} engines: {node: '>=0.8.0'} - dev: true /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - dev: true - /eslint-config-prettier/8.3.0_eslint@8.5.0: + /eslint-config-prettier/8.3.0_eslint@8.6.0: resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.5.0 + eslint: 8.6.0 dev: true /eslint-import-resolver-node/0.3.6: @@ -2510,7 +2511,7 @@ packages: resolve: 1.20.0 dev: true - /eslint-import-resolver-typescript/2.5.0_f385d671d5f1c72a868db745a891bc1f: + /eslint-import-resolver-typescript/2.5.0_b54597effeb7d09a84a334cc3c3dadae: resolution: {integrity: sha512-qZ6e5CFr+I7K4VVhQu3M/9xGv9/YmwsEXrsm3nimw8vWaVHRDrQRp26BgCypTxBp3vUp4o5aVEJRiy0F2DFddQ==} engines: {node: '>=4'} peerDependencies: @@ -2518,8 +2519,8 @@ packages: eslint-plugin-import: '*' dependencies: debug: 4.3.2 - eslint: 8.5.0 - eslint-plugin-import: 2.25.3_eslint@8.5.0 + eslint: 8.6.0 + eslint-plugin-import: 2.25.3_eslint@8.6.0 glob: 7.1.7 is-glob: 4.0.1 resolve: 1.20.0 @@ -2537,7 +2538,7 @@ packages: pkg-dir: 2.0.0 dev: true - /eslint-plugin-import/2.25.3_eslint@8.5.0: + /eslint-plugin-import/2.25.3_eslint@8.6.0: resolution: {integrity: sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==} engines: {node: '>=4'} peerDependencies: @@ -2547,7 +2548,7 @@ packages: array.prototype.flat: 1.2.5 debug: 2.6.9 doctrine: 2.1.0 - eslint: 8.5.0 + eslint: 8.6.0 eslint-import-resolver-node: 0.3.6 eslint-module-utils: 2.7.1 has: 1.0.3 @@ -2559,17 +2560,17 @@ packages: tsconfig-paths: 3.12.0 dev: true - /eslint-plugin-react-hooks/4.3.0_eslint@8.5.0: + /eslint-plugin-react-hooks/4.3.0_eslint@8.6.0: resolution: {integrity: sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.5.0 + eslint: 8.6.0 dev: true - /eslint-plugin-react/7.27.1_eslint@8.5.0: - resolution: {integrity: sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==} + /eslint-plugin-react/7.28.0_eslint@8.6.0: + resolution: {integrity: sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 @@ -2577,7 +2578,7 @@ packages: array-includes: 3.1.4 array.prototype.flatmap: 1.2.5 doctrine: 2.1.0 - eslint: 8.5.0 + eslint: 8.6.0 estraverse: 5.3.0 jsx-ast-utils: 3.1.0 minimatch: 3.0.4 @@ -2607,13 +2608,13 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.5.0: + /eslint-utils/3.0.0_eslint@8.6.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.5.0 + eslint: 8.6.0 eslint-visitor-keys: 2.0.0 dev: true @@ -2627,8 +2628,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.5.0: - resolution: {integrity: sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==} + /eslint/8.6.0: + resolution: {integrity: sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: @@ -2642,9 +2643,9 @@ packages: enquirer: 2.3.6 escape-string-regexp: 4.0.0 eslint-scope: 7.1.0 - eslint-utils: 3.0.0_eslint@8.5.0 + eslint-utils: 3.0.0_eslint@8.6.0 eslint-visitor-keys: 3.1.0 - espree: 9.2.0 + espree: 9.3.0 esquery: 1.4.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -2674,12 +2675,12 @@ packages: - supports-color dev: true - /espree/9.2.0: - resolution: {integrity: sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==} + /espree/9.3.0: + resolution: {integrity: sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.6.0 - acorn-jsx: 5.3.1_acorn@8.6.0 + acorn: 8.7.0 + acorn-jsx: 5.3.1_acorn@8.7.0 eslint-visitor-keys: 3.1.0 dev: true @@ -2801,7 +2802,6 @@ packages: /find-root/1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: true /find-up/2.1.0: resolution: {integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c=} @@ -2890,7 +2890,6 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true /functional-red-black-tree/1.0.1: resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} @@ -3083,7 +3082,6 @@ packages: /has-flag/3.0.0: resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} engines: {node: '>=4'} - dev: true /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -3112,7 +3110,6 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - dev: true /he/1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} @@ -3128,7 +3125,7 @@ packages: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: react-is: 16.13.1 - dev: true + dev: false /hosted-git-info/4.0.2: resolution: {integrity: sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==} @@ -3182,7 +3179,6 @@ packages: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true /import-lazy/2.1.0: resolution: {integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=} @@ -3225,7 +3221,6 @@ packages: /is-arrayish/0.2.1: resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} - dev: true /is-bigint/1.0.2: resolution: {integrity: sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==} @@ -3268,7 +3263,6 @@ packages: resolution: {integrity: sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==} dependencies: has: 1.0.3 - dev: true /is-core-module/2.8.0: resolution: {integrity: sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==} @@ -3441,7 +3435,6 @@ packages: /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true /js-yaml/3.14.0: resolution: {integrity: sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==} @@ -3470,7 +3463,6 @@ packages: /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -3556,7 +3548,6 @@ packages: /lines-and-columns/1.1.6: resolution: {integrity: sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=} - dev: true /locate-path/2.0.0: resolution: {integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=} @@ -3614,7 +3605,6 @@ packages: hasBin: true dependencies: js-tokens: 4.0.0 - dev: true /lowercase-keys/1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} @@ -3870,7 +3860,6 @@ packages: /object-assign/4.1.1: resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} engines: {node: '>=0.10.0'} - dev: true /object-inspect/1.11.0: resolution: {integrity: sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==} @@ -4012,21 +4001,19 @@ packages: engines: {node: '>=6'} dependencies: callsites: 3.1.0 - dev: true /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.14.5 + '@babel/code-frame': 7.16.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.1.6 - dev: true /path-browserify/1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true + dev: false /path-exists/3.0.0: resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} @@ -4050,7 +4037,6 @@ packages: /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true /path-to-regexp/1.8.0: resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} @@ -4061,7 +4047,6 @@ packages: /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - dev: true /pathval/1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -4192,7 +4177,6 @@ packages: object-assign: 4.1.1 react: 17.0.2 scheduler: 0.20.2 - dev: true /react-icons/4.3.1_react@17.0.2: resolution: {integrity: sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==} @@ -4200,7 +4184,7 @@ packages: react: '*' dependencies: react: 17.0.2 - dev: true + dev: false /react-idle-timer/4.6.4_react-dom@17.0.2+react@17.0.2: resolution: {integrity: sha512-iq61dPud8fgj7l1KOJEY5pyiD532fW0KcIe/5XUe/0lB/4Vytoy4tZBlLGSiYodPzKxTL6HyKoOmG6tyzjD7OQ==} @@ -4211,11 +4195,10 @@ packages: dependencies: react: 17.0.2 react-dom: 17.0.2_react@17.0.2 - dev: true + dev: false /react-is/16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: true /react-refresh/0.11.0: resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} @@ -4228,7 +4211,6 @@ packages: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 - dev: true /read-config-file/6.2.0: resolution: {integrity: sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==} @@ -4262,7 +4244,6 @@ packages: /regenerator-runtime/0.13.7: resolution: {integrity: sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==} - dev: true /regexp.prototype.flags/1.3.1: resolution: {integrity: sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==} @@ -4299,14 +4280,12 @@ packages: /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - dev: true /resolve/1.20.0: resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} dependencies: is-core-module: 2.7.0 path-parse: 1.0.7 - dev: true /resolve/2.0.0-next.3: resolution: {integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==} @@ -4398,9 +4377,15 @@ packages: resolution: {integrity: sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==} dev: true + /rxjs/6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: true + /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -4426,6 +4411,16 @@ packages: source-map-js: 0.6.2 dev: true + /sass/1.45.2: + resolution: {integrity: sha512-cKfs+F9AMPAFlbbTXNsbGvg3y58nV0mXA3E94jqaySKcC8Kq3/8983zVKQ0TLMUrHw7hF9Tnd3Bz9z5Xgtrl9g==} + engines: {node: '>=8.9.0'} + hasBin: true + dependencies: + chokidar: 3.5.2 + immutable: 4.0.0 + source-map-js: 0.6.2 + dev: true + /sax/1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} dev: true @@ -4435,7 +4430,6 @@ packages: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 - dev: true /semver-compare/1.0.0: resolution: {integrity: sha1-De4hahyUGrN+nvsXiPavxf9VN/w=} @@ -4565,7 +4559,6 @@ packages: /source-map/0.5.7: resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} engines: {node: '>=0.10.0'} - dev: true /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} @@ -4576,6 +4569,10 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: true + /spawn-command/0.0.2-1: + resolution: {integrity: sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=} + dev: true + /sprintf-js/1.0.3: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} dev: true @@ -4673,13 +4670,8 @@ packages: engines: {node: '>=8'} dev: true - /stylis/4.0.10: - resolution: {integrity: sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg==} - dev: true - /stylis/4.0.13: resolution: {integrity: sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==} - dev: true /sumchecker/3.0.1: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} @@ -4695,7 +4687,6 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - dev: true /supports-color/7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -4752,7 +4743,6 @@ packages: /to-fast-properties/2.0.0: resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} engines: {node: '>=4'} - dev: true /to-readable-stream/1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} @@ -4771,6 +4761,11 @@ packages: engines: {node: '>=0.4.0'} dev: true + /tree-kill/1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + /truncate-utf8-bytes/1.0.2: resolution: {integrity: sha1-QFkjkJWS1W94pYGENLC3hInKXys=} dependencies: @@ -4787,7 +4782,7 @@ packages: typescript: 4.5.4 dev: true - /ts-node/10.4.0_6cc1060505bd4c6ac58c4b67188c6af9: + /ts-node/10.4.0_646584a8d620b4d6f5eb4525e8655565: resolution: {integrity: sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==} hasBin: true peerDependencies: @@ -4806,7 +4801,7 @@ packages: '@tsconfig/node12': 1.0.9 '@tsconfig/node14': 1.0.1 '@tsconfig/node16': 1.0.2 - '@types/node': 16.11.9 + '@types/node': 17.0.6 acorn: 8.5.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -5123,7 +5118,6 @@ packages: /yaml/1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - dev: true /yargs-parser/20.2.4: resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==}